添加新节点和关系的 neo4j 性能

neo4j performance of adding new nodes and relations

我的 neo4j 图非常简单:它由用户和用户之间的 "Follows" 关系组成。 "login" 属性 上有用户标签的索引。这是图表的片段:

{
            "nodes": [
              {
                "id": "3216",
                "labels": [
                  "User"
                ],
                "properties": {
                  "login": "user#111",
                  "status": 16
                }
              },
              {
                "id": "3218",
                "labels": [
                  "User"
                ],
                "properties": {
                  "login": "user#1983",
                  "status": 1
                }
              }
            ],
            "relationships": [
              {
                "id": "4188",
                "type": "Follows",
                "startNode": "3216",
                "endNode": "3218",
                "properties": {}
              }
            ]
          }
}

用户节点的状态字段指示是否已处理 - 所有关系都已创建。 然后我有执行以下步骤的 node.js 应用程序:

  1. 选择状态 = 1(未处理)的下一个节点
  2. 获取在步骤 1 中选择的节点的登录。
  3. 为在步骤 2 中选择登录的用户的关注者请求 Web 服务。
  4. 通过使用负责节点和关系的唯一性的密码语句、REST API 和密码交易端点添加新的用户节点和 "Follows" 关系,这里是示例查询:

function buildQuery(login, followers){
  return {
    statement : 'MATCH (me:User {login : {login} }) FOREACH (f IN {followers} | MERGE (u:User { login : f }) MERGE u-[:Follows]->me),  
    parameters : {
      login : login,
      followers : followers
    }
  }
}

目前数据库有 35 万个用户节点和 190 万个关系,添加新节点的速度非常慢。在一台功能强大的机器(8 核 CPU、14 GB RAM)上添加单个关注者和对应关系大约需要 8 秒,它不会做任何其他事情——它是托管在 Azure 上的 Ubuntu 服务器专门针对 Neo4 DB。

我想知道我可以做些什么来提高添加新节点的性能吗?调整查询?调整 Neo4j 配置?使用核心 Java API?还有别的吗?谢谢!

语句最多需要几毫秒。

你对 :User(login) 有限制吗?

create constraint on (u:User) assert u.login is unique

您使用 2.3.1 吗?

请同时报告。

如果您出于任何原因无法升级到 2.3.1,请告诉我。

你能不能试着把你的陈述改成这样:

MATCH (me:User {login : {login} }) 
UNWIND {followers} as f  
MERGE (u:User { login : f })
MERGE (u)-[:Follows]->(me)

有时 MERGE 在 FOREACH 中没有使用唯一索引。