用 Cypher 断开/替换子图边

Disconnect / replace subgraph edges with Cypher

我有一个图形数据模型,其中所有节点都连接到一个或多个 :policy 节点。

有时我需要修改子图,以便它用与新 P':policy 的关系替换与现有 P:policy 的所有关系。我想到的一般方法是识别与现有 P:policy 关联的顶点 V 和边 E 的子集;创建一个新的 P':policy,在 V 和 P' 之间创建新的关系 E',然后删除现有的关系 E.

我有一个识别相关 P、V 和 E 的可变长度查询;该查询看起来像这样:

MATCH p=(v {..})-[nodes*]->(policy:policy {..}) return policy as P, nodes(p) as V, relationships(p) as E

这作为独立查询工作正常,但要完成子图更新,我想做的是这样的:

MATCH p=(v {..})-[nodes*]->(policy:policy {..}) // find the sub-graph of interest
MERGE (P':policy {..})-[]-(..)                  // create new policy P'
MERGE nodes(p)-[..]-(P')                        // setup new relationships from nodes(p) to new policy P'
DELETE relationships(p)                         // delete existing relationships(p)

我是一个 Cypher 菜鸟,看来我不能在查询中使用节点 (p) 和关系 (p);想知道是否有人可以提供如何实现此目标的建议?

nodes()relationships() return 节点集合,这就是为什么不能合并或删除它们的原因。

要从集合获取单个节点或关系,您可以使用 UNWIND。 一个例子是

WITH nodes(p) as nodes
UNWIND nodes as node
MERGE (node)-.....

WITH relationships(p) as rels
UNWIND rels as rel
DELETE rel

如果您使用 APOC 程序,有多种重构程序可用于克隆节点及其关系,以及重构关系,具有将它们重定向到另一个节点的效果(但实际上使指向另一个节点的副本并删除原件)

请参阅 apoc.refactor.cloneNodesWithRelationships()apoc.refactor.to()(或 refactor.from(),具体取决于应将关系的哪一端重定向到新节点)。

安装 APOC 后,您可以使用 call apoc.help('refactor') 查看所有重构过程。