【问题标题】:Updating all nodes in a graph更新图中的所有节点
【发布时间】: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 数据库上运行“全图扫描”查询时,最佳做法是什么?

谢谢!

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

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

    这里的最佳做法是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}
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      相关资源
      最近更新 更多