gpt4 book ai didi

neo4j - 更新图中的所有节点

转载 作者:行者123 更新时间:2023-12-01 10:35:42 25 4
gpt4 key购买 nike

我有一个大约 250M 节点的 Neo4J DB(社区版,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 数据库上运行“全图扫描”查询时,最佳实践是什么?

谢谢!

最佳答案

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

这里的最佳实践是对事务的范围进行 limit 并多次调用该语句:

MATCH (n:MyNode) 
WHERE NOT HAS (n.newColumn)
WITH n LIMIT 10000
SET n.newColumn=n.c1+n.c2
RETURN count(n)

运行此语句,直到返回结果 0。

要自动化该过程,您可以像这样使用 apoc proceduresapoc.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}
);

关于neo4j - 更新图中的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35864406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com