MERGE / CREATE в neo4j UNWIND - PullRequest
       9

MERGE / CREATE в neo4j UNWIND

0 голосов
/ 30 августа 2018

У меня есть следующие данные (Информация) in Neo4j Label :

{
   domain:"domain1.com",
   email: "some01@email.com"
},
{
   domain:"domain2.com",
   email: "some02@email.com"
}
..................
..................

Теперь я хочу вставить данные в Информация , если найден новый домен, в противном случае объединить.

Я пробовал следующее CQL :

 WITH [{domain:"domain1.com", email: "some@email.com"}, 
       {domain:"domain3.com", email: "some03@email.com"}] as arr

   UNWIND arr as ar
      MATCH (x:Info) WHERE x.domain = ar.domain
      WITH count(x) as c, ar
      CALL apoc.do.when( c <> 0, 
         'MERGE (a:Info {domain: ar.domain}) ON SET a.email=ar.email return a', 
         'CREATE (a:Info { domain: ar.domain, email: ar.email }) return a',
         { c:c, ar:arr }) YEILD value
       RETURN value

Выше CQL работает только слияние, но ничего не создано.

Есть предложения?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 августа 2018

Вы смешиваете ar и arr повсюду.

В вашем внешнем запросе arr - это список. Тем не менее, вы передаете arr в течение ar при вызове apoc.do.when() и рассматриваете его как карту (ar.domain и ar.email, очевидно, не будут работать здесь в apoc.do.when())

Вы также ссылаетесь на arr.domain и arr.email в остальной части apoc.do.when(), но arr находится вне области действия.

Вам также не нужно передавать c в вызов процедуры; оценка в первом аргументе использует существующую область видимости, только запросы после этого требуют передачи переменных между областью действия.

Также ON SET недопустимо, вы должны использовать ON MATCH SET, ON CREATE SET или просто SET.

Все это говорит о том, что вам даже не нужно использовать apoc.do.when(), похоже, вам нужно использовать только MERGE и SET:

WITH [{domain:"domain1.com", email: "some@email.com"}, 
       {domain:"domain3.com", email: "some03@email.com"}] as arr

UNWIND arr as ar
MERGE (x:Info {domain:ar.domain}) 
SET x.email = ar.email
RETURN x

Помните, что MERGE похож на MATCH или CREATE (когда совпадений не найдено), поэтому после MERGE он всегда будет привязан к узлу, либо к существующему узлу, либо к вновь созданному узлу, и так как вы хотите установить email свойство в любом случае, мы можем просто использовать SET здесь.

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