知识库

apoc 4.0 中 apoc.periodic.iterate() 的重大变更

在 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

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