Neo4J Unicity wonders: проблема с синглтоном или агрегацией

#neo4j #cypher #singleton

#neo4j #cypher #синглтон

Вопрос:

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

Пример

ФАЙЛ CSV :

 Id1,Id2,Relation
Alice,Bob,KNOWS
Morgane,Bob,KNOWS
Bob,James,KNOWS
  

Я хотел бы получить результат как таковой

 Alice---(KNOWS)--->Bob<---(KNOWS)---Morgane
                      ^
                      |
                  (KNOWS)
                      |
                    James

  

Хотя то, что происходит, :

 Alice---(KNOWS)--->Bob
Morgane---(KNOWS)--->Bob
Bob---(KNOWS)--->James
  

Я бы хотел, чтобы Bob был синглтоном, но я получаю несколько «Bob» с разными внутренними идентификаторами. Я хотел бы объединить все бобы вместе.
У кого-нибудь есть идея?

(Обратите внимание, что стрелка между Джеймсом и Бобом должна быть наоборот в «желаемом результате», но все в порядке, проблема здесь не в этом)

редактировать: я попытался создать ограничение перед импортом данных, но, похоже, оно не работает : CREATE CONSTRAINT ON (a:Person) ASSERT a.name IS UNIQUE;

Спасибо за вашу помощь!

Комментарии:

1. каков ваш запрос на импорт?

2. На самом деле я использую python для его загрузки, это было бы что-то вроде: CREATE (a:Person {name:’Alice» str(i) «‘})-[x: ЗНАЕТ {с: 1999}]->(b:Person {name:’Bob’})

Ответ №1:

Вы должны изменить свой запрос, чтобы сначала ОБЪЕДИНИТЬ свои узлы, а затем ОБЪЕДИНИТЬ отношения:

 MERGE (a:Person {name:'Alice'})
MERGE (b:Person {name:'Bob'})
MERGE (a)-[x:KNOWS {since:1999}]->(b)
  

Комментарии:

1. Итак, я решил ее, используя библиотеку APOC и следующий код: MATCH (n: Client) ИСПОЛЬЗУЯ toLower(n.ClientID) в качестве имени, собирайте (n), когда узлы ВЫЗЫВАЮТ apoc.refactor.mergeNodes(узлы), возвращают ВОЗВРАТ узла *

2. @theowl-Yte Этот ответ показывает, как предотвратить проблему. Вам следует изучить документацию по слиянию , чтобы понять, как изменить ваши запросы, чтобы избежать дублирования данных.