在 Neo4j 中使用 Cypher 在数十万个节点之间创建三元闭包不起作用

Create triadic closures in Neo4j between hundreds of thousands nodes using Cypher does not work

我在为大量节点和关系创建三元闭包时遇到问题。我过去常常搜索几个小时的答案,但没有一个真正符合我的问题。


数据集:

节点连接如下:


我想在 所有 人之间创建三元闭包,这意味着将在同一作品中工作/演奏的两个人与标签为 [:[=68 的新边连接起来=]].为此,我编写了以下查询:

MATCH (p1:PERSON)
-[:WORKS|PLAYS*2..2]-
(p2:PERSON)
WHERE p1<>p2
CREATE UNIQUE (p1)-[:WORKED_WITH]->(p2);

我尝试合并并使用 WHERE NOT (p1)-[:WORKED_WITH]->(p2) 而不是 CREATE UNIQUE。问题是即使在 7 小时后它也没有完成...我知道这是一个巨大的数据量,但我希望有不同的方法可以更快地完成这些...

你知道要做什么吗?

更多信息:


我也考虑过尝试使用遍历 API,但我不知道该怎么做(以及这是否有帮助)...我已经读过 Michael Hunger 的一些书, Vukotic/Watt、Panzarino等,研究了官方文档,看了很多Whosebug上的答案,但没有找到有用的信息。我希望你能帮助我。


祝你好运,沃尔夫冈

在重构或更新大图时,您需要使用批处理。 Apoc 库提供了 apoc.periodic 这样的选项。

在你的例子中看起来像:

call apoc.periodic.commit("
MATCH (p1:PERSON)-[:WORKS|PLAYS*2..2]-(p2:PERSON)
WHERE id(p1) < id(p2) and NOT (p1)-[:WORKED_WITH]-(p2)
with p1,p2 limit {limit}
MERGE (p1)-[:WORKED_WITH]-(p2);
RETURN count(*)
",{limit:5000})

如果有人读过这个问题,使用 apoc 库并没有解决我的问题令人满意......这将花费大约一个月的时间。

所以我决定 运行 一个 SQL 语句将三元闭包导出到 CSV 文件(在 Neo4j 中我对 SQL 表的 ID 创建了唯一约束).这些 CSV 数据可以通过批量加载轻松导入。我总共花了不到 3 个小时,所以我认为这是解决此问题的最有效方法。