【发布时间】:2016-03-08 10:07:27
【问题描述】:
我有一个包含约 2.5 亿个节点的 Neo4J 数据库(社区版,v2.3.2),我需要运行一个查询来迭代所有节点并更新一个属性。这不是我日常查询的一部分,而是我必须运行的一次性维护任务。
我可以用 Cypher 轻松表达它,但看起来 Neo4J 试图将所有节点保存在内存中,然后执行我的 SET 操作,导致它耗尽内存,甚至更糟 - 将整个 JVM 放入一个常量GC 循环。我有没有机会让它像在 foreach 循环中一样运行,一次在一个节点上运行?
我的 Cypher 查询将是:
MATCH (n:MyNode) WHERE NOT HAS (n.newColumn) SET n.newColumn=n.c1+n.c2
我不介意它是否运行很长时间,只是它不会使服务器本身崩溃。如果 Cypher 不是该任务的最佳工具,我也愿意使用其他 API。
更一般地说,当您确实需要在 Neo4J 数据库上运行“全图扫描”查询时,最佳做法是什么?
谢谢!
【问题讨论】: