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

时间:2017-06-01 09:14:28

标签: neo4j cypher graph-databases

我遇到了为大量节点和关系创建三元闭包的问题。我曾经几个小时都在寻找答案,但没有什么能与我的问题相提并论。

数据集:

  • 带有标签PERSON的322276个节点(属性 name 上的索引)
  • 987052带有标签PRODUCTION
  • 的节点
  • 6417928与标签PLAYS的关系
  • 14314487与标签WORKS的关系

节点连接如下:

  • (:PERSON) - [:播放] - GT;(:PRODUCTION)
  • (:PERSON) - [:WORKS] - GT;(:PRODUCTION)

我想在所有人之间创建三元闭包,这意味着将两个在同一作品中工作/演奏的人连接到带有标签[: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个小时后它也没有完成......我知道这是一个庞大的数据量,但我希望有更快的方法可以有更快的方式......

你知道该怎么做吗?

更多信息:

  • Neo4j 3.1.4社区版
  • Windows 10
  • Quad Core i5
  • 8GB RAM DDR3
  • 位于SSD驱动器上
  • 我没有更改neo4j的默认配置

我还考虑过尝试使用遍历API,但我不知道如何做到这一点(如果这会有所帮助)......我已经读过Michael Hunger,Vukotic / Watt的一些书, Panzarino等研究了官方文档,并在stackoverflow上阅读了很多答案,但没有找到有用的信息。我希望你能帮助我。

祝福,沃尔夫冈

2 个答案:

答案 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个小时,所以我想说这是解决这个问题最有效的方法。