Я воспроизвел ваш сценарий, используя эту модель данных образца:
create (one:Node {id : 1, name : 'ONE'}),
(two:Node {id : 2, name : 'TWO'}),
(ref:Node {ref:2}),
(one)-[:isFatherOf]->(ref)
Следующий запрос Cypher должен выполнить работу:
// get all 'n1' nodes point to an node with 'ref' property
match (n1:Node)-[r:isFatherOf]->(refNode:Node)
where exists(refNode.ref)
// match 'n2' nodes that have an ID equal to 'n2.ref'
match (n2:Node {id : refNode.ref})
// create a new relationship between 'n1' and 'n2'
create (n1)-[:isFatherOf]->(n2)
// remove node with 'ref' properties and all relationships
detach delete refNode
Для набора данных примера выходные данные будут:
Если вам нужно сохранить исходные отношения вместо создания нового, вам нужно будет использовать процедуру APOC apoc.refactor.to
.Эта процедура перенаправляет отношение для использования нового конечного узла.
match (n1:Node)-[r:isFatherOf]->(refNode:Node)
where exists(refNode.ref)
match (n2:Node {id : refNode.ref})
// redirecting 'r' to use 'n2' as end node
call apoc.refactor.to(r, n2) yield output
delete refNode
Вывод будет таким же.