neo4j创建边缘列表

时间:2017-08-03 07:41:56

标签: scala neo4j query-optimization

我有 的流,其中 id 是节点的数字ID, ID 是相邻节点的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)

ID列表的长度平均约为100-200。

现在有大约6千万个节点和密尔。数据库中的边缘。 upserting的速度大约是每秒。 Neo4j在配备Core i5,28Gb RAM和2Tb WD Black的专用机器上运行。

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

1 个答案:

答案 0 :(得分:1)

这些渐进式更改可以使查询更快。

  1. MERGE执行u1

    MERGE之前移动u1的{​​{1}},它只会被执行一次(而不是每UNWIND个值一次)。

    u2id
  2. 此外,使用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) 代替MERGE

    您的关系创建用例应该由CREATE UNIQUEMERGE满足(因为您确保预先存在两个端点)。在我的分析中,我发现CREATE UNIQUE使用较少的数据库命中(您的里程可能会有所不同,具体取决于您的数据库特征和neo4j版本)。

    MERGE