我遇到了为大量节点和关系创建三元闭包的问题。我曾经几个小时都在寻找答案,但没有什么能与我的问题相提并论。
数据集:
节点连接如下:
我想在所有人之间创建三元闭包,这意味着将两个在同一作品中工作/演奏的人连接到带有标签[:WORKED_IN]的新边缘。为此,我写了以下查询:
MATCH (p1:PERSON)
-[:WORKS|PLAYS*2..2]-
(p2:PERSON)
WHERE p1<>p2
CREATE UNIQUE (p1)-[:WORKED_WITH]->(p2);
而不是CREATE UNIQUE我试图合并并使用WHERE NOT(p1) - [:WORKED_WITH] - &gt;(p2)。问题是,即使在7个小时后它也没有完成......我知道这是一个庞大的数据量,但我希望有更快的方法可以有更快的方式......
你知道该怎么做吗?
更多信息:
我还考虑过尝试使用遍历API,但我不知道如何做到这一点(如果这会有所帮助)......我已经读过Michael Hunger,Vukotic / Watt的一些书, Panzarino等研究了官方文档,并在stackoverflow上阅读了很多答案,但没有找到有用的信息。我希望你能帮助我。
祝福,沃尔夫冈
答案 0 :(得分:2)
在进行重构或更新大图时,您要使用批处理。 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})
答案 1 :(得分:0)
如果有人读过这个问题,那么使用apoc库并不能解决我的问题......这可能需要一个月的时间。
所以我决定运行一个SQL语句将三元闭包导出到CSV文件(在Neo4j中我为SQL表的ID创建了唯一的约束)。这些CSV数据可以通过批量加载轻松导入。总而言之,我花了不到3个小时,所以我想说这是解决这个问题最有效的方法。