克隆子图
APOC 库包含可用于克隆子图的过程。这些过程可用于克隆由节点列表和关系列表定义的子图,或克隆由路径列表定义的子图。当您想确保克隆的子图不连接到原始节点或子图外部的节点时,这非常有用。
如果未提供关系,则给定节点之间的所有关系都将被克隆。在配置映射中,可以提供 standinNodes
列表(节点对),允许图中的现有节点作为克隆子图中另一个节点的替身。这对于将克隆的子图附加到图中的另一个节点(而不是克隆节点)非常有用。
克隆子图的过程
限定名称 | 类型 |
---|---|
|
过程 |
|
过程 |
示例
以下示例将进一步解释这些过程。
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)

:LINK
关系组成,并将该子图附加到 rootB。rootB 作为 rootA 的替身,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()
,提供构成子图的节点和关系列表。从生成输出的节点和关系可以通过调用 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)
:LINK
关系组成,并将该子图附加到 rootB。rootB 作为 rootA 的替身,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()
所返回的图相同。