Neo4j - Как удалить дубликаты отношений на основе их свойств - PullRequest
2 голосов
/ 09 января 2020

У меня есть узлы, между которыми существуют несколько отношений. Каждое отношение имеет два свойства p1 и p2. Отношение дублируется, только если оно имеет одинаковое значение для свойств p1 и p2.

MATCH (a:Node)-[r1:Rel]->(b:Node)
MATCH (a:Node)-[r2:Rel]->(b:Node)
WHERE ((r1.p1 = r2.p1) AND (r1.p2 = r2.p2))
WITH a,b, TAIL(collect(r1)) AS coll
FOREACH (x in coll| DELETE x)

Это не приводит к ожидаемому результату. Приведенный выше код удаляет все, кроме первого отношения. Хвост удаляет все, кроме первого, что, похоже, делает. Это не принимает во внимание свойства однако. Как я могу удалить дубликаты отношений и учесть их свойства?

Ответы [ 2 ]

1 голос
/ 10 января 2020

Соответствующая логика c выглядит правильно, я думаю, что ваш код сбора и хвоста - вот где проблема. Это работает на простом тестовом графике, который я создал:

MATCH (a:Node)-[r1:REL]->(b:Node), (a:Node)-[r2:REL]->(b:Node)
WHERE (r1.p1 = r2.p1 AND r1.p2 = r2.p2)
WITH collect(r2) AS rels
WHERE size(rels) > 1
UNWIND tail(rels) AS dupe
DELETE dupe

Вы также можете сделать сопоставление более гибким, используя функцию properties :

WHERE properties(r1) = properties(r2)
1 голос
/ 09 января 2020

Это должно работать:

MATCH (a:Node)-[r:Rel]->(b:Node)
WITH a, b, r.p1 AS p1, r.p2 AS p2, COLLECT(r)[1..] AS unwanted
FOREACH(x IN unwanted | DELETE x)

Для каждой пары Node с используется агрегация , чтобы собрать все отношения в одном и том же направлении, имеющие одинаковые p1 и p2 значений, а затем удаляет все, кроме одного.

Операция со списком [1..] выполняет практически то же самое, что и функция TAIL.

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