2017-02-10 3 views
1

У меня есть два узла типа User, которые связаны с одним или несколькими общими узлами типа Tweet. Пример на картинке:Копирование отношений с другого узла

enter image description here

Я хотел бы, чтобы удалить дубликаты пользователей и объединить их в единый узел. сохраняя все отношения от обоих пользователей.

Это условие я использую, чтобы найти узлы, которые должны быть объединены:

MATCH (x:User)-[k:POSTS]->(:Tweet)<-[:POSTS]-(y:User) 

С помощью следующего запроса:

MATCH (x:User)-[k:POSTS]->(:Tweet)<-[:POSTS]-(y:User) 
DELETE k 
WITH x, y 
MATCH (x)-[r:POSTS]->(z:Tweet) 
MERGE (y)-[:POSTS]->(z) 
DELETE r 

который отрывать но Пользователю B не связывают твит с пользователь a.

Обратите внимание, что я также попробовал apoc.refactor.mergeNodes, но это дает ошибку.

Как я могу объединить эти два узла, сохраняя их освобождения?

UPDATE:

MATCH (z:User) 
WHERE (z:User)-[:POSTS]->(:Tweet)<-[:POSTS]-(:User) 
WITH COLLECT(z) AS zs 
CALL apoc.refactor.mergeNodes(zs) YIELD node 
RETURN node; 

С помощью этого запроса я получить повторяющиеся отношения, есть ли способ объединить?

UPDATE 2:

Я пытался использовать предыдущий запрос на большую выборку из моей базы данных, он дает ошибку.

+1

Больше требуется разъяснение. 1. В вашем вопросе говорилось, что вы заинтересованы в «сохранении всех отношений от обоих пользователей», но тогда остальная часть вашего вопроса указывает, что вы хотите удалить «дублирующие» отношения. Что вы на самом деле хотите сделать? 2. Если вы действительно хотите объединить «дублирующие» отношения в один, вы, вероятно, захотите объединить все свои свойства, если они есть. Имеют ли отношения какие-либо ценности? Если да, и если отношения, которые должны быть объединены, могут иметь разные значения для одного и того же свойства, какие значения вы хотите сохранить в объединенных отношениях? – cybersam

ответ

1

Этот запрос сначала удаляет отношение из (x) в (твит), а затем пытается найти его.

Попробуйте это:

MATCH (x:User) 
WITH x 
MATCH (x)-[:POSTS]->(t:Tweet)<-[r:POSTS]-(y:User) WHERE x <> y AND id(x) > id(y) 
WITH x, y, count(t) as ag 
MATCH (y)-[r:POSTS]->(z:Tweet) 
MERGE (x)-[:POSTS]->(z) 
WITH y, count(z) as ag 
DETACH DELETE y 
+0

Удаляет оба пользовательских узла. –

+0

Да, я забыл одну деталь: 'id (x)> id (y)'. См. Обновление. –

Смежные вопросы