知识库

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

在已经确定需要删除一批节点(并且依据规则也要删除它们的关系)的情况下,直接使用 DETACH DELETE 并以此结束是很诱人的。然而,如果存在稠密节点,或每批次中有大量节点每个拥有数千条关系,这可能会导致问题。你的“批次大小”可能会迅速超过预期。

APOC 让我们能够处理这种情况。基本思路是先找到要删除的节点集合,将其传入 apoc.periodic.commit 调用,然后按每批前 10K 条关系、接下来的 10K 条关系等方式分批删除,直至完成。以下 Cypher 在处理大批量节点时表现良好。此示例查找标签为 :TTLttl 属性早于当前时间的节点。它们被传入 periodic commit 语句,并以每批 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

另外,请参考知识库文档 Large Delete Transaction Best Practices in Neo4j 以了解其他注意事项

© . This site is unofficial and not affiliated with Neo4j, Inc.