我有一个包含标签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)在较小的块中执行此操作的其他一些方法。
任何提示?
答案 0 :(得分:0)
如果您运行稍微不同但很简单的批量查询会发生什么:
MERGE (prop1:Prop1 { id: 1 })
WITH prop1
MATCH (f:Foo { prop1: 1 })
MERGE (f)-[:PROP1]->(prop1)
RETURN count(f);
请注意,如果你MERGE
两个节点之间的关系,你真的不需要你正在做的OPTIONAL MATCH
位。