Объединение дублирующих узлов и их взаимосвязь - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть требования объединить дубликаты узлов и сохранить одну копию.Проблема, с которой я сталкиваюсь, заключается в том, что, когда я объединяю узлы, создаются двойные отношения.Вместо этого я хочу также объединить отношения без дубликатов.

Можете ли вы дать некоторые предложения?

CREATE (n:People { name: 'Person1', lastname: 'Person1LastName', email_ID:'Person1@test2.com' })
CREATE (n:People { name: 'Person2', lastname: 'Person2LastName', email_ID:'Person2@test2.com' })
CREATE (n:People { name: 'Person2', lastname: 'Person2LastName', staysin:'California' })
CREATE (n:People { name: 'Person3', lastname: 'Person3LastName', email_ID:'Person3@test2.com' })

Person2  -[r:Has_Met]->(Person1)

(Person3)-[r:FRIENDS_WITH]->(Person2) having email_ID='Person2@test2.com'

Теперь я хочу сохранить узлы Person2 и сохранить оба отношения с другими узлами -что-то вроде этого:

MATCH (p:People{name:"person1"})
WITH p.name as name, collect(p) as nodes, count() as cnt
WHERE cnt > 1
WITH head(nodes) as first, tail(nodes) as rest
UNWIND rest AS to_delete
MATCH (to_delete)-[r:HAS_MET]->(e:name)
MERGE (first)-[r1:HAS_MET]->(e)
on create SET r1=r
SET to_delete.isDuplicate=true
RETURN count();

Это связанный вопрос , но здесь я знаю, что будет рассматриваться только одно отношение (HAS_MET).Как мне рассмотреть все отношения один раз?

1 Ответ

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

Без представления вашей модели или списка образцов данных, к сожалению, я могу ответить только в целом, что, тем не менее, может вам помочь.Взгляните на библиотеку APOC и рассмотрите использование процедур Узлы слияния и Перенаправление отношений на .Вы найдете пояснительные изображения и заявления Сайфера для каждого случая.


Расширение после обновления вопроса

Исходная ситуация

CREATE
  (p1:People {name: 'Person1', lastname: 'Person1LastName', email_ID: 'Person1@test2.com'}),
  (p2a:People {name: 'Person2', lastname: 'Person2LastName', email_ID: 'Person2@test2.com'}),
  (p2b:People {name: 'Person2', lastname: 'Person2LastName', staysin: 'California'}),
  (p3:People {name: 'Person3', lastname: 'Person3LastName', email_ID: 'Person3@test2.com'}),
  (p2a)-[:HAS_MET]->(p1),
  (p2b)-[:HAS_MET]->(p1),
  (p3)-[:FRIENDS_WITH]->(p2a);

graph

Решение

MATCH (oneNode:People {email_ID: 'Person2@test2.com'}), (otherNode:People {staysin: 'California'})
CALL apoc.refactor.mergeNodes([oneNode, otherNode])
YIELD node
MATCH (node)-[relation:HAS_MET]->(:People)
WITH tail(collect(relation)) AS surplusRelations
UNWIND surplusRelations AS surplusRelation
DELETE surplusRelation;
  • строка 1: выбрать оба из которых должны быть объединены узлы
  • строка 2: вызвать соответствующую процедуру слияния узлов
  • строка 3: определить переменную результата
  • строка 4: идентифицировать все отношения между объединенным узлом и встретившимся человеком (их как минимум два)
  • строка 5: выбрать все отношения, кроме первой
  • строка 7: удалить все избыточные отношения

Результат

  • объединенный узел Person2, содержащий все атрибуты из исходных узлов (особенно обратите внимание email_ID и * 1041)*)
  • одна связь Персона1-Персона2

graph2

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