如何在删除涉及密集节点时避免使用过多内存
在需要删除大量节点(以及按规则其关系)的情况下,很容易直接使用 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 中大型删除事务的最佳实践》以了解其他注意事项
此页有帮助吗?