Neo4j 更新图形中的所有节点

Neo4j 更新图形中的所有节点,neo4j,cypher,Neo4j,Cypher,我有一个拥有2.5亿个节点的Neo4J数据库(community edition,v2.3.2),我需要运行一个查询来迭代所有节点并更新属性。这不是我日常查询的一部分,而是我必须运行的一次性维护任务 我可以很容易地用Cypher来表达它,但看起来Neo4J试图在内存中保存所有节点,然后执行SET操作,导致内存不足,甚至更糟糕的是,将整个JVM放入一个恒定的GC循环。有没有可能让它像在foreach循环中一样运行,一次在一个节点上运行 我的密码查询将是: 匹配(n:MyNode),其中未设置(n

我有一个拥有2.5亿个节点的Neo4J数据库(community edition,v2.3.2),我需要运行一个查询来迭代所有节点并更新属性。这不是我日常查询的一部分,而是我必须运行的一次性维护任务

我可以很容易地用Cypher来表达它,但看起来Neo4J试图在内存中保存所有节点,然后执行SET操作,导致内存不足,甚至更糟糕的是,将整个JVM放入一个恒定的GC循环。有没有可能让它像在foreach循环中一样运行,一次在一个节点上运行

我的密码查询将是:


匹配(n:MyNode),其中未设置(n.newColumn)n.newColumn=n.c1+n.c2

我不介意它运行很长时间,只是它不会使服务器本身崩溃。如果Cypher不是完成任务的最佳工具,我也愿意使用其他API

更一般地说,当您确实需要在Neo4J数据库上运行“完整图形扫描”查询时,最佳做法是什么


谢谢

这将导致一个巨大的事务,在提交时刷新到光盘之前,需要先在内存中建立该事务

这里的最佳实践是
限制事务的范围并多次调用语句:

MATCH (n:MyNode) 
WHERE NOT HAS (n.newColumn) 
WITH n LIMIT 10000
SET n.newColumn=n.c1+n.c2
RETURN count(n)
运行此语句,直到返回0的结果

要使过程自动化,您可以像这样使用wth
apoc.periodic.iterate()

call apoc.periodic.iterate(
'MATCH (n:MyNode) WHERE NOT exists(n.newColumn) RETURN n',
'SET n.newColumn=n.c1+n.c2', {batchSize:10000,iterateList:true,parallel:true}
);