首页 > 解决方案 > 在 neo4j 中合并/创建 UNWIND

问题描述

我在Neo4j 标签中有以下数据(信息)

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

现在,如果找到新域,我想将数据插入到Info中,否则合并。

我尝试了以下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,只有合并有效,但没有创建任何内容。

有什么建议吗?

提前致谢。

标签: neo4j

解决方案


你在这里混ar在一起arr

在您的外部查询arr中是一个列表。然而你在你的电话中传递arr了 for并将其视为一张地图(显然不会在这里工作)arapoc.do.when()ar.domainar.emailapoc.do.when()

您还在的 else 部分中引用了arr.domainand ,但不在范围内。arr.emailapoc.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 。


推荐阅读