如何在neo4j中复制节点树?

时间:2018-12-03 15:11:34

标签: neo4j neo4j-apoc

如何从现有的节点树创建完整的节点树,实际上我有1个节点,我需要找到所有具有我现有的顶级节点的关系和节点。我需要为另一个节点创建完整的节点树。

从A中复制带有关系的所有节点树,并为B节点创建重复的相同节点和关系

enter image description here

1 个答案:

答案 0 :(得分:0)

好的,这是一个棘手的问题。

正如其他人提到的apoc.refactor.cloneNodesWithRelationships()可以提供帮助,但这也会导致克隆的节点和原始节点之间的关系,而不仅仅是克隆,因为此过程并不是在考虑这种用例的情况下编写的。

因此,这需要我们进行一些Cypher杂技操作,以从克隆节点中找到与克隆节点之间没有关系的关系,以便我们将其删除。

但是,同时我们还必须标识旧的根节点,以便我们可以将关系重构为新的根(这需要对传入和传出关系进行单独处理)。

下面的查询应该可以解决这个问题,因为您没有提供有关图形的任何详细信息,所以对节点进行了假设:

MATCH (a:Root{name:'A'})
WITH a, id(a) as aId
CALL apoc.path.subgraphNodes(a, {}) YIELD node
WITH aId, collect(node) as nodes
CALL apoc.refactor.cloneNodesWithRelationships(nodes) YIELD input, output
WITH aId, collect({input:input, output:output}) as createdData, collect(output) as createdNodes
WITH createdNodes, [item in createdData WHERE item.input = aId | item.output][0] as aClone // clone of root A node
UNWIND createdNodes as created
OPTIONAL MATCH (created)-[r]-(other)
WHERE NOT other in createdNodes
DELETE r // get rid of relationships that aren't between cloned nodes
// now to refactor relationships from aClone to the new B root node
WITH DISTINCT aClone
MATCH (b:Root{name:'B'})
WITH aClone, b
MATCH (aClone)-[r]->()
CALL apoc.refactor.from(r, b) YIELD output
WITH DISTINCT b, aClone
MATCH (aClone)<-[r]-()
CALL apoc.refactor.to(r, b) YIELD output
WITH DISTINCT aClone
DETACH DELETE aClone