neo4j - 在 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
,只有合并有效,但没有创建任何内容。
有什么建议吗?
提前致谢。
解决方案
你在这里混ar
在一起arr
。
在您的外部查询arr
中是一个列表。然而你在你的电话中传递arr
了 for并将其视为一张地图(显然不会在这里工作)ar
apoc.do.when()
ar.domain
ar.email
apoc.do.when()
您还在的 else 部分中引用了arr.domain
and ,但不在范围内。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 。
推荐阅读
- powerbi - 以 YTD 方式计算分类字段 - PowerBI DAX
- sql - 从表中删除重复的记录不起作用
- python - 在 Python 中计算两个格式化日期之间的天数会导致“OverflowError: int too big to convert”
- javascript - 点击后清除输入数据
- php - 使用 PHP 和 MySQL 查询多个表
- verilog - 测试台 clk 不前进
- tsql - 如何从累积值创建总计
- firebase - Firestore 安全规则限制字段条目
- html - 视频不会在旧版 Microsoft Edge 中自动播放
- java - 为什么当我键入“sout”时 IntelliJ 不显示“System.out.println()”快捷方式?