删除许多节点时apoc.periodic.iterate和apoc.periodic.commit之间的区别?

Mr *_* MP 6 neo4j

这两行有什么区别?

call apoc.periodic.iterate("MATCH (n:Nodes) return n", "DETACH DELETE n", {batchSize:10000, iterateList:true})"

call apoc.periodic.commit("match (n:Nodes) limit {limit} detach delete n RETURN count(*)",{limit:10000})
Run Code Online (Sandbox Code Playgroud)

删除大量节点的最佳方法是什么?

log*_*ima 7

该过程apoc.periodic.iterate需要两个查询:

  • 第一个在您的示例中创建一组节点
  • 第二个查询将针对第一个查询的每个结果执行

因此,在您的示例中,匹配Node数据库的所有数据库,然后以10000的批处理大小删除它们。

该过程apoc.periodic.commit仅接受一个查询,并且该过程将一次又一次地执行查询……将其结果设为0

因此,在您的示例中,您将前10000个节点删除。您重复此行为,直到Node数据库中没有更多。

要恢复,两个查询都给出相同的结果,但是方式不同。这样apoc.periodic.iterate做将比apoc.periodic.commit(首先需要建立节点集)过程占用更多的RAM ,但是这样做的好处是您可以通过配置使用所有的CPU parallel:true(但要小心锁)。

如果您要删除的节点数量非常多,建议您使用apoc.periodic.commit

  • “ iterate()”细分为2个查询是使它具有高性能的原因。它不会将整个结果集保存在内存中,只会在找到结果后进行拉取,然后对每个批次执行内部查询。上面的单个查询调用(如果可能)的行为与不执行过程调用的match和delete查询的行为相同,因为它必须保留对内存中这些节点中每个节点的引用,并分批提交,这在大图上可能是个问题。您可以炸毁您的堆。 (3认同)