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

时间:2015-11-17 05:27:38

标签: performance neo4j cypher relationship

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

{
            "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. 使用cypher语句添加新的User节点和“Follows”关系,这些语句负责节点和关系的唯一性,REST API和cypher事务端点,以下是查询示例:
  5. 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
        }
      }
    }

    目前,DB拥有350K用户节点和1.9M关系,并且添加新关系 TERRIBLY 慢。在一台功能非常强大的机器(8核CPU,14 GB RAM)上添加单个跟随器和相应的关系大约需要8秒钟才能完成其他操作 - 它是专门为Neo4 DB托管在Azure上的Ubuntu服务器。

    我想知道为了提高添加新节点的性能,我还能做些什么吗?调整查询?调整Neo4j配置?使用Core Java API?别的什么?谢谢!

2 个答案:

答案 0 :(得分:1)

该陈述最多应该花费几毫秒。

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

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

你使用2.3.1吗?

请两者并报告回来。

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

答案 1 :(得分:0)

你能否尝试将你的陈述改为:

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

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