在neo4j UNWIND中合并/创建

时间:2018-08-30 11:07:39

标签: neo4j

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

{
   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 :(得分:1)

您在这里到处都在混用ararr

外部查询arr中有一个列表。然而,您在arr通话中为ar传递了apoc.do.when()并将其视为地图(ar.domainar.email在{{ 1}})

您还在apoc.do.when()的其他部分引用了arr.domainarr.email,但是apoc.do.when()不在范围内。

您也不需要将arr传递给过程调用;第一个参数中的评估使用现有范围,只有之后的查询才需要您在范围之间传递变量。

另外c无效,您必须使用ON SETON MATCH SET或仅使用ON CREATE SET

所有这些,您甚至不需要使用SET,看起来您只需要使用MERGE和SET:

apoc.do.when()

请记住,MERGE就像是MATCH或CREATE(未找到匹配项),因此,在MERGE之后,它将始终绑定到一个节点(现有节点或新创建的节点),并且由于要设置在任何情况下,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 属性,我们都可以在此处使用SET。