作者:维韦克 萨兰(Vivek Saran)
适用版本:Neo4j 4.0 / 4.1
标签:APOC
在Neo4j 3.5中,可以在一个事务中获取实体(节点、关系、路径)并安全地在另一个事务中重用。
然而在4.0中,这些实体将拥有返回它们的事务的引用。
对于任何创建新事务的APOC调用中,这会带来问题,例如 apoc.periodic.iterate(以及另外2个)。 从驱动查询(driving)声明中提出的任何实体都必须在任务查询(action)声明中重新绑定。
这意味着我们基本上需要重新绑定源自不同事务的实体。
Rebinding意味着,做一个这样的查询: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。