apoc.periodic.iterate() 在 apoc 4.0 中的重大变化
在 3.5 版本中,一个实体(节点、关系、路径)可以在一个事务中获取并安全地被另一个事务重用。
然而,在 4.0 版本中,这些实体会持有对其原始事务的引用。
问题可能发生在任何打开新事务的 APOC 调用中,例如 apoc.periodic.iterate(以及其他几个)。从驱动语句传递的任何内容都必须在操作语句中重新绑定。
这意味着我们基本上需要重新绑定源自不同事务的实体。
重新绑定意味着执行 MATCH (n) WHERE id(n) = id(myKnownNode)
。
例如,以下语句在 3.5.x 版本中可以完美运行
CALL apoc.periodic.iterate('MATCH (:Account)-[r:ASSOCIATED_WITH]->() RETURN r',
'CALL apoc.do.case(.....) YIELD value RETURN value',
{batchSize: 10000, parallel: false, iterateList: true});
但是,在 4.0.x 版本中,上述语句需要修改为
CALL apoc.periodic.iterate('MATCH (:Account)-[r:ASSOCIATED_WITH]->() RETURN id(r) as id',
'MATCH ()-[r]->() WHERE id(r)=id CALL apoc.do.case(.....) YIELD value RETURN value',
{batchSize: 10000, parallel: false, iterateList: true});
请注意,在第一个(外部语句)中,我们将 RETURN r
更改为 RETURN id(r) as id
。
在第二个(内部语句)中,我们在 CALL apoc.do.case()
之前插入了 MATCH ()-[r]→() WHERE id(r)=id
。
有关 APOC 库中其他非常有用的过程,请参阅 APOC 用户指南 4.0。
此页面有帮助吗?