知识库

如何避免在涉及密集节点的删除操作中使用过多的内存

在您知道需要删除大量节点(并且根据规则也需要删除其关系)的情况下,简单地使用DETACH DELETE并完成操作可能很诱人。但是,如果您的节点很密集,或者您有许多节点每批有数千个关系,那么这可能会成为问题。您的“批次大小”可能会很快变得比您预期的大得多。

APOC 允许我们处理这种情况。本质上,我们想要找到要删除的节点集,将其传递给apoc.periodic.commit的调用,然后按前 10K 个关系、接下来的 10K 个关系等进行批量删除,直到完成。以下 Cypher 代码非常适用于大型节点集。在这种情况下,它正在查找标签为:TTLttl属性早于当前时间的节点。它将这些节点传递给定期提交语句,并以 10K 批次进行删除。

MATCH (n:TTL)
WHERE n.ttl < timestamp()
WITH collect(n) AS nn
CALL apoc.periodic.commit("
  UNWIND $nodes AS n
  WITH sum(size((n)--())) AS count_remaining,
       collect(n) AS nn
  UNWIND nn AS n
  OPTIONAL MATCH (n)-[r]-()
  WITH n, r, count_remaining
  LIMIT $limit
  DELETE r
  RETURN count_remaining
",{limit:10000, nodes:nn}) yield updates, executions, runtime, batches, failedBatches, batchErrors, failedCommits, commitErrors
UNWIND nn AS n
DELETE n
RETURN updates, executions, runtime, batches

此外,请考虑查看知识库文档Neo4j 中的大型删除事务最佳实践以了解其他注意事项。