【问题标题】:neo4j create list of edgesneo4j 创建边列表
【发布时间】:2017-08-03 07:41:56
【问题描述】:

我有一个 pairs 流,其中 id 是节点的数字 id,而 ids 是相邻节点的 id 列表。 我使用此查询从此类流中更新节点:

WITH ${ids.mkString("[", ",", "]")} as ids
UNWIND ids as u2id
MERGE (u1:User {Id:${id}})
MERGE (u2:User {Id:u2id})
CREATE UNIQUE p = (u1) - [:FRIEND] -> (u2)

我在 ID 标签上有索引

CREATE INDEX ON :User(Id)

ids列表的长度平均在100-200左右。

现在有大约 6000 万个节点和 mil。数据库中的边数。更新插入的速度约为每秒 pairs。 Neo4j 在配备 Core i5、28Gb RAM 和 2Tb WD Black 的专用机器上运行。

我想知道如何优化 upserting 查询或改进硬件的任何提示。

【问题讨论】:

  • 几个问题... 1) 流是否恒定(不是说您可以在 CSV 文件中包含所有更新并执行 LOAD CSV)? 2) User(Id) 仅仅是索引还是唯一约束? 3)您实际上是否也在创建新用户(MERGE 暗示)? 4) 你能添加一个这样的执行的 PROFILE 的扩展图像吗?
  • 抱歉回答迟了,1) 是的,它是真正的流 2) 索引 3) 是的,正在创建 4) 不幸的是,目前无法访问数据库

标签: scala neo4j query-optimization


【解决方案1】:

这些渐进式更改应该使查询更快。

  1. 只执行一次MERGEu1

    通过将u1MERGE 移动到UNWIND 之前,它只会执行一次(而不是每个u2id 值一次)。

    MERGE (u1:User {Id:${id}})
    WITH u1, ${ids.mkString("[", ",", "]")} as ids
    UNWIND ids as u2id
    MERGE (u2:User {Id:u2id})
    CREATE UNIQUE (u1)-[:FRIEND]->(u2)
    
  2. 另外,用MERGE代替CREATE UNIQUE

    MERGECREATE UNIQUE 应该可以满足您的关系创建用例(因为您确保两个端点都预先存在)。在我的分析中,我看到 MERGE 使用较少的 DB 命中(您的里程可能会有所不同,具体取决于您的 DB 特征和 neo4j 版本)。

    MERGE (u1:User {Id:${id}})
    WITH u1, ${ids.mkString("[", ",", "]")} as ids
    UNWIND ids as u2id
    MERGE (u2:User {Id:u2id})
    MERGE (u1)-[:FRIEND]->(u2)
    

【讨论】:

  • 感谢您的建议,将 MERGE 移到 UNWID 之外确实可以加快查询速度。但是当节点数量变为约 1 亿时。 Node4j 进程开始交换并且速度急剧下降,所以我们决定写入文件并稍后处理它们:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
相关资源
最近更新 更多