我有对 的流,其中 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查询或改进硬件的任何提示。
答案 0 :(得分:1)
这些渐进式更改可以使查询更快。
仅MERGE
执行u1
次
在MERGE
之前移动u1
的{{1}},它只会被执行一次(而不是每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)
代替MERGE
您的关系创建用例应该由CREATE UNIQUE
和MERGE
满足(因为您确保预先存在两个端点)。在我的分析中,我发现CREATE UNIQUE
使用较少的数据库命中(您的里程可能会有所不同,具体取决于您的数据库特征和neo4j版本)。
MERGE