我在 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
上方,仅合并有效,但未创建任何内容。
有什么建议吗?
先谢谢了。
答案 0 :(得分:1)
您在这里到处都在混用ar
和arr
。
外部查询arr
中有一个列表。然而,您在arr
通话中为ar
传递了apoc.do.when()
并将其视为地图(ar.domain
和ar.email
在{{ 1}})
您还在apoc.do.when()
的其他部分引用了arr.domain
和arr.email
,但是apoc.do.when()
不在范围内。
您也不需要将arr
传递给过程调用;第一个参数中的评估使用现有范围,只有之后的查询才需要您在范围之间传递变量。
另外c
无效,您必须使用ON SET
,ON 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。