Как продублировать дерево узлов в neo4j? - PullRequest
0 голосов
/ 03 декабря 2018

Как я могу создать полное дерево узлов из существующего дерева узлов, На самом деле у меня есть 1 узел, и мне нужно найти все отношения и узлы, которые имеют мой существующий верхний узел.Мне нужно создать полное дерево узлов для другого узла.

Скопируйте все дерево узлов из A с помощью Relation и создайте дубликат того же узла и отношения для B-узла

enter image description here

1 Ответ

0 голосов
/ 07 декабря 2018

Хорошо, это сложный вопрос.

Как уже упоминали другие, 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
...