知识库

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。所以没有显式的 LIMIT,而是通过 UNWIND 实现了隐式的限制。你可以通过 {iterateList:false} 关闭列表收集,并让第二条语句针对第一个语句的每一条结果单独执行。

查询只有在原始查询完成后才会将结果返回给客户端,因此只会有一次往返。实际情况是结果被分批流式传输,需要被消费。此操作通过单独的线程进行,只会占用有限的内存,避免资源耗尽。外部连接会保持打开状态,直到所有数据处理完毕——即使最后一个批次已经被加载到内存但尚未通过流式方式消费,连接也会在此时关闭。

代码链接如下

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