как пропустить дублирующий узел при создании узлов в Neo4j - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть список адресов электронной почты, которые я использую для создания узлов. Однако, если один из этих адресов электронной почты уже существует, я не хочу получать сообщение об ошибке CATCH «.... узел уже существует», так как это уничтожит весь запрос, и ни один из узлов не будет создан. Поэтому я использую MERGE, затем ON CREATE, чтобы проверить существование адреса электронной почты перед созданием узла. Проблема в том, что мне нужно создать связь со вторым узлом, поэтому после MERGE и ON CREATE я должен использовать WITH .... CREATE для создания отношений, и здесь кроется проблема ... WITH не находится в области видимости. 'ON CREATE, поэтому CREATE (a) - [r] -> (b) теперь пытается создать узел с адресом электронной почты, который я пропустил в MERGE выше ... в результате получается CATCH' ... уже существует ... 'ошибка в моем запросе. Вот мой САЙФЕР:

 commons.session
      .run['tom@abc.com', 'tony@mymail.com',michael@gmail.com'] AS coll
        UNWIND coll AS invitee
        WITH DISTINCT invitee
        MERGE (i {email: invitee})
        ON CREATE
          SET i:Invitee
        WITH i,invitee
        CREATE (s:Person {email: 'xyz123@abc.com})-[r:INVITED]->(i)
        RETURN i.email AS emails, COUNT(r) AS invitees)

То, что я ожидаю вернуть, это список только тех адресов электронной почты, где были созданы узел и связь. По сути, мне нужно быть в области действия ON CREATE, так как дубликат был бы пропущен. Любая помощь в создании этой работы будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Хорошо ... так что ни FOREACH, ни CASE не сделали свое дело. На самом деле пункт WHERE сделал. Моя первоначальная потребность, как указано в вопросе, состояла в том, чтобы принять список электронных писем, создать узлы, в которых не существует узла для электронной почты в списке, и вернуть список созданных узлов электронной почты и счетчик количества .... И не произошел сбой в сообщении об ошибке «электронная почта уже существует ...». Это решение, которое я нашел:

MATCH(s:Person {email: 'mike@gmailxxx.com'})
WITH s, ['abcd123@abc.com','abcd123@abc.com','abcd456@abc.com','michael@abc.com'] AS coll
   UNWIND coll AS invitee
   WITH DISTINCT invitee, s
    OPTIONAL MATCH (i {email: invitee})
    WITH s,invitee, i
     WHERE i IS NULL
      CREATE (s)-[r:INVITED]->(n:Invitee {email:invitee})
  RETURN s,n, COUNT(r) 

С помощью предложения WHERE я смог сосредоточиться только на тех электронных письмах, для которых еще не было создано ни одного узла.

Спасибо @cybersam за его предложение ФАКУЛЬТАТИВНОГО МАТЧА и его итерации для возможного решения.

0 голосов
/ 09 ноября 2018

[ОБНОВЛЕНИЕ 2]

WITH [
  {email:'tom@abc.com', name:'tom'},
  {email:'tony@mymail.com', name:'tony'},
  {email:'michael@gmail.com', name:'mike'}] AS coll
MATCH (s:Person {email: 'me@aol.com'})
OPTIONAL MATCH (s)-[x:INVITED]->()
WITH s, coll, COUNT(x) AS orig_count
UNWIND coll AS invitee
WITH DISTINCT s, orig_count, invitee
OPTIONAL MATCH (i {email: invitee.email, name: invitee.name})
FOREACH(ignored IN CASE WHEN i IS NULL THEN [1] ELSE [] END |
  CREATE (s)-[r:INVITED]->(:Invitee {email: invitee.email, name: invitee.name})
)
WITH s, orig_count
OPTIONAL MATCH (s)-[x:INVITED]->()
RETURN COUNT(DISTINCT x) - orig_count AS new_relationship_count

Пояснение:

  • Предложение OPTIONAL MATCH сгенерирует значение NULL для i, если шаблон узла не найден.
  • CASE WHEN i IS NULL THEN [1] ELSE [] END вернет непустой список тогда и только тогда, когда i будет NULL.
  • Если список пуст, то предложение FOREACH не будет выполнять содержащиеся в нем предложения записи. В противном случае он выполнит их все.
  • Сначала этот запрос сначала получает количество (orig_count) исходного числа INVITED отношений, исходящих из s.
  • В конце он получает окончательный счет и вычитает orig_count из этого, чтобы получить new_relationship_count.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...