Слияние узлов в Neo4j - PullRequest
       13

Слияние узлов в Neo4j

0 голосов
/ 18 мая 2018

У меня есть XML-файл со следующим шаблоном: узлы со свойством ref имеют то же значение, что и свойство id других узлов.Это наглядный пример в Neo4j:

Sample data set

Желтый имеет значение свойства ref (ref = 2) как TWO (id = 2).

Моя цель - создать граф, удаляя каждый узел со значением ref, равным другим узлам id, но также сохраняя отношение isFatherOf , которое должноукажите на другой узел, в данном случае TWO .

Вот результат процедуры:

Desired output

Я могу удалить все узлы ref с помощью следующей процедуры,

match (n1:Node)
with collect(distinct n1.id) as ids 
collection called 'ids'
match (n2:Node)
where n2.ref in ids
detach delete n2

, но я не знаю, как сохранить отношения.Есть ли способ сделать это?

1 Ответ

0 голосов
/ 18 мая 2018

Я воспроизвел ваш сценарий, используя эту модель данных образца:

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

Для набора данных примера выходные данные будут:

Output

Если вам нужно сохранить исходные отношения вместо создания нового, вам нужно будет использовать процедуру 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

Вывод будет таким же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...