如何避免在涉及密集节点的删除操作中使用过多的内存
在您知道需要删除大量节点(并且根据规则也需要删除其关系)的情况下,简单地使用DETACH DELETE
并完成操作可能很诱人。但是,如果您的节点很密集,或者您有许多节点每批有数千个关系,那么这可能会成为问题。您的“批次大小”可能会很快变得比您预期的大得多。
APOC 允许我们处理这种情况。本质上,我们想要找到要删除的节点集,将其传递给apoc.periodic.commit
的调用,然后按前 10K 个关系、接下来的 10K 个关系等进行批量删除,直到完成。以下 Cypher 代码非常适用于大型节点集。在这种情况下,它正在查找标签为:TTL且ttl
属性早于当前时间的节点。它将这些节点传递给定期提交语句,并以 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 中的大型删除事务最佳实践
以了解其他注意事项。
此页面是否有用?