克隆子图

APOC 库包含可用于克隆子图的过程。这些过程可用于克隆由节点列表和关系列表定义的子图,或由路径列表定义的子图。当您想要确保克隆的子图与原始节点或子图之外的节点断开连接时,此功能非常有用。

如果未提供关系,则将克隆给定节点之间的所有关系。在配置映射中,可以提供 standinNodes 列表(节点对),允许图中的现有节点充当克隆子图中另一个节点的替身。这对于将克隆的子图附加到图中的另一个节点(而不是克隆节点)非常有用。

克隆子图的过程

限定名称 类型

apoc.refactor.cloneSubgraph(nodes LIST<NODE>, rels LIST<RELATIONSHIP>, config MAP<STRING, ANY>) - 克隆给定的 NODE 值及其标签和属性(可通过 config MAP 中的 skipProperties LIST<STRING> 可选地跳过任何属性),并克隆给定的 RELATIONSHIP 值。如果未提供 RELATIONSHIP 值,则将克隆给定 NODE 值之间所有现有的 RELATIONSHIP 值。

过程

apoc.refactor.cloneSubgraphFromPaths(paths LIST<PATH>, config MAP<STRING, ANY>) - 克隆由给定 LIST<PATH> 值定义的子图。可以通过 config MAP 中的 skipProperties LIST<STRING> 跳过任何 NODE 属性。

过程

示例

下面的示例将进一步解释这些过程。

以下代码创建了一个包含两棵树的数据集
CREATE  (rootA:Root{name:'A'}),
        (rootB:Root{name:'B'}),
        (n1:Node{name:'node1', id:1}),
        (n2:Node{name:'node2', id:2}),
        (n3:Node{name:'node3', id:3}),
        (n4:Node{name:'node4', id:4}),
        (n5:Node{name:'node5', id:5}),
        (n6:Node{name:'node6', id:6}),
        (n7:Node{name:'node7', id:7}),
        (n8:Node{name:'node8', id:8}),
        (n9:Node{name:'node9', id:9}),
        (n10:Node{name:'node10', id:10}),
        (n11:Node{name:'node11', id:11}),
        (n12:Node{name:'node12', id:12})
        CREATE (rootA)-[:LINK]->(n1)-[:LINK]->(n2)-[:LINK]->(n3)-[:LINK]->(n4)
        CREATE                  (n1)-[:LINK]->(n5)-[:LINK]->(n6)<-[:LINK]-(n7)
        CREATE                                (n5)-[:LINK]->(n8)
        CREATE                                (n5)-[:LINK]->(n9)-[:DIFFERENT_LINK]->(n10)
        CREATE (rootB)-[:LINK]->(n11)
apoc.refactor.cloneSubgraph tree example
以下查询克隆了从 rootA 开始、由输出的 :LINK 关系组成的子树,并将该子图附加到 rootB。rootB 作为 rootA 的替身(standin),rootA 本身不会被克隆。
MATCH  (rootA:Root{name:'A'}),
       (rootB:Root{name:'B'})
MATCH path = (rootA)-[:LINK*]->(node)
WITH rootA, rootB, collect(path) as paths
CALL apoc.refactor.cloneSubgraphFromPaths(paths, {
    standinNodes:[[rootA, rootB]]
})
YIELD input, output, error
RETURN input, output, error

如果运行上述查询,将得到以下图形

apoc.refactor.cloneSubgraph tree example after

另一种方法是使用 apoc.refactor.cloneSubgraph(),并提供构成子图的节点和关系列表。可以通过使用 apoc.path.subgraphAll() 并过滤该过程调用中的关系类型,来获取产生输出的节点和关系。

以下查询创建了一个包含两棵树的数据集
CREATE  (rootA:Root2{name:'A'}),
        (rootB:Root2{name:'B'}),
        (n1:Node2{name:'node1', id:1}),
        (n2:Node2{name:'node2', id:2}),
        (n3:Node2{name:'node3', id:3}),
        (n4:Node2{name:'node4', id:4}),
        (n5:Node2{name:'node5', id:5}),
        (n6:Node2{name:'node6', id:6}),
        (n7:Node2{name:'node7', id:7}),
        (n8:Node2{name:'node8', id:8}),
        (n9:Node2{name:'node9', id:9}),
        (n10:Node2{name:'node10', id:10}),
        (n11:Node2{name:'node11', id:11}),
        (n12:Node2{name:'node12', id:12})
        CREATE (rootA)-[:LINK]->(n1)-[:LINK]->(n2)-[:LINK]->(n3)-[:LINK]->(n4)
        CREATE                  (n1)-[:LINK]->(n5)-[:LINK]->(n6)<-[:LINK]-(n7)
        CREATE                                (n5)-[:LINK]->(n8)
        CREATE                                (n5)-[:LINK]->(n9)-[:DIFFERENT_LINK]->(n10)
        CREATE (rootB)-[:LINK]->(n11)
以下查询克隆了从 rootA 开始、由输出的 :LINK 关系组成的子树,并将该子图附加到 rootB。rootB 作为 rootA 的替身(standin),rootA 本身不会被克隆。
MATCH  (rootA:Root2{name:'A'}),
       (rootB:Root2{name:'B'})
CALL apoc.path.subgraphAll(rootA, {relationshipFilter:'LINK>'})
YIELD nodes, relationships
CALL apoc.refactor.cloneSubgraph(
    nodes,
    [rel in relationships WHERE type(rel) = 'LINK'],
    { standinNodes:[[rootA, rootB]] })
YIELD input, output, error
RETURN input, output, error

生成的图将与上一个调用 apoc.refactor.cloneSubgraphFromPaths() 的示例中返回的图相同。