Создать отношения и узел, если не существует - PullRequest
0 голосов
/ 05 июня 2018

У меня есть график с организациями и сотрудниками с двумя типами отношений:
(:Employee)-[:Worked]->(:Organization)
(:Employee)-[:Managed]->(:Organization)

Организация имеет уникальное свойство Id с индексом.У сотрудника есть свойство Name без индекса.Мне нужно добавить нового сотрудника в организацию, если он не существует, или добавить новые отношения, только если он существует.Но я не знаю, как добиться этого без индекса на Name.
1. Найти организацию по Id.Хорошо, это быстро.
match (o:Organization {Id:1})
2. Найдите сотрудника, который уже связан с организацией, или добавьте новую ссылку и сотрудника, если он не существует.Я не могу использовать простой
merge (e:Employee {Name: "name"})
merge (e)-[:Worked]->(o)
, потому что у меня нет индекса на Name (это будет медленно), и мне нужно найти только сотрудника, который подключен к выбранной организации
merge (e:Employee { Name: "name" })-[:Worked]->(o) не работает - будет добавлен новый сотрудник, если уже существует сотрудник с таким именем, но с другими отношениями, например [:Managed].

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Есть несколько простых вещей, которые нужно понять, как Neo4j обрабатывает операции Cypher MERGE, чтобы избежать нежелательного или неожиданного поведения при его использовании.

  1. Операция Cypher MERGE представляет собой MATCH или CREATE всего шаблона,Это означает, что если какой-либо элемент шаблона НЕ существует, Neo4j попытается создать весь шаблон.
  2. Всегда MERGE в каждом сегменте шаблона, который может существовать.
  3. После операции MERGE вы гарантированно получите полезную ссылку на все идентификаторы, установленные во время операции Cypher MERGE, поскольку они были либо найдены, либо созданы.

Для слияния в CQL не требуется никакого индекса на узле.вы можете попробовать следующее:

слияние (: сотрудник) - [: <имя_отношения>] -> (: организация)

Если указанные узлы существуют, связь между ними создается иначебудут созданы новые узлы и созданы отношения между ними.

0 голосов
/ 05 июня 2018

Вы, похоже, неправильно понимаете требования для MERGE.Для работы MERGE индекс не требуется.

В вашем конкретном случае наличие индекса на :Employee(Name) не требуется, чтобы MERGE (e:Employee {Name: "name"}) работал должным образом.Однако при наличии такого индекса ускорит обработку этого предложения MERGE, поэтому рекомендуется.

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