neo4j - 删除大量节点时 apoc.periodic.iterate 和 apoc.periodic.commit 之间的区别?
问题描述
这两条线有什么区别?
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})
删除大量节点的最佳方法是什么?
解决方案
该过程apoc.periodic.iterate
需要两个查询:
- 第一个在您的示例中创建一组节点
- 第二个将针对第一个查询的每个结果执行
因此,在您的示例中,您匹配所有Node
数据库,然后以 10000 的批量删除它们。
该过程apoc.periodic.commit
只需要一个查询,并且该过程将再次执行查询,一次又一次......倾斜它的结果是0。
因此,在您的示例中,您获取前 10000 个节点并删除它们。Node
您重复此行为,直到您的数据库中没有更多内容为止。
要 resume,两个查询都给出相同的结果,但方式不同。这apoc.periodic.iterate
将比之前占用更多的 RAM apoc.periodic.commit
(该过程首先需要构建节点集),但它的一个好处是您可以通过配置使用所有的 CPU parallel:true
(但要小心锁定)。
如果您要删除大量节点,我建议您使用apoc.periodic.commit
.
推荐阅读
- html - 如果文本很长,则将内容向下推
- javascript - 为什么我不能调用对象内部的值?
- angular - 在剑道网格中为“嵌套”字段创建表单组
- c# - 通过 mandrill 添加电子邮件的预览文本
- javascript - Fabric js在自定义html元素上添加处理程序旋转
- html - div容器内的img定位
- android - 未调用应用内结算 onPurchaseUpdated
- php - Yii2中的多对多关系查询
- apache-spark - 在 Spark 结构化流上出现错误说“必须使用 writeStream.start() 执行带有流源的查询”
- ideavim - vim surrround ideavim - 围绕视觉选择的文本将类属性添加到结束标记