为现有节点创建数百万个关系的最佳方式

时间:2015-03-30 19:41:32

标签: neo4j

我有一个包含标签Foo的大约1.5mln节点的现有图形。每个Foo节点都有一个属性prop1,它来自一个明显更小的子集(几千个值)。我们现在需要能够使用此属性遍历图形(它也将连接到其他标签),我们希望将其转换为节点(而不是属性)。

所以基本上,如果我有

 Foo1{prop1:1}
 Foo2{prop1:2} 
 Foo3{prop1:1}

然后我想创建2个新节点,Prop1 {id:1}和Prop1 {id:2},并用新关系PROP1链接它们。

Foo1 -[:PROP1]-> Prop1{id:1}
Foo2 -[:PROP1]-> Prop1{id:2}
Foo3 -[:PROP1]-> Prop1{id:1}

我希望这是有道理的。

根本问题在于,由于它是1.5百万个节点,尝试一次性运行只需运行OOM。 我设法提出了一个cypher查询,它通常会做一小部分(我可能用语法弄乱了一些东西,因为我是从内存中写的,但这大致是如何工作的):

MATCH (n:Foo) WHERE NOT(n-[:PROP1]->()) 
WITH n LIMIT 10000
MERGE (p:Prop1 {id = n.prop1}) 
MERGE (n) -[:PROP1] -> (p)

不幸的是,一次又一次地手动运行它是一项相当无聊的任务;)所以我正在寻找 1)要么循环它直到它完成(但在部分之间提交)或者 2)在较小的块中执行此操作的其他一些方法。

任何提示?

1 个答案:

答案 0 :(得分:0)

如果您运行稍微不同但很简单的批量查询会发生什么:

MERGE (prop1:Prop1 { id: 1 })
WITH prop1
MATCH (f:Foo { prop1: 1 })
MERGE (f)-[:PROP1]->(prop1)
RETURN count(f);

请注意,如果你MERGE两个节点之间的关系,你真的不需要你正在做的OPTIONAL MATCH位。