知识库

apoc.periodic.iterate 如何与资源一起工作?

apoc.periodic.iterate 如何工作?

例如,当运行 call apoc.periodic.iterate("MATCH (n) RETURN n", "DETACH DELETE n", {batchSize:1000}) 时,它是否会向 MATCH RETURN 追加一个 LIMIT 以便它只返回 batchSize,或者它是否返回所有内容但只是将 batchSize 行传递给 DETACH DELETE?

它不会添加 limit。它会按原样执行“MATCH (n) RETURN n”。需要记住的关键点是,有一个结果流需要被消费。它不会创建一个可能影响堆的大型结果集。有一个名为 iterateAndExecuteBatchedInSeparateThread 的方法使用单独的线程并按参数中指定的块从该流中“消费”。

第一个参数添加前缀以强制使用带槽运行时,因为编译运行时会将结果收集到内存中的结构中。对于大型结果集,这不是我们想要的,因此我们确保第一部分是流式传输的。该流正在填充包含 batchSize 个元素的列表。这些作为参数传递给第二个语句。在示例中,第二个参数将动态更改为 UNWIND $_batch as n DETACH DELETE n。因此,没有显式限制,但由于 UNWIND 而存在隐式限制。您可以使用 {iterateList:false} 关闭列表收集,并对第一个结果的每个结果触发第二个语句。

查询只有在原始查询完成后才会返回到客户端,因此只有一个往返过程。发生的情况是结果被批量流式传输,需要被消费。此操作通过单独的线程发生,并且只会占用有限的内存,因此不会耗尽资源。即使尚未通过流式传输消费,直到最后一个批次被拉入内存,外部连接也将保持打开状态,此时连接将关闭。

代码链接在此处