知识库

如何在删除涉及密集节点时避免使用过多内存

在需要删除大量节点(以及按规则其关系)的情况下,很容易直接使用 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 中大型删除事务的最佳实践》以了解其他注意事项

© . All rights reserved.