当后续查询在Neo4j cypher查询中没有匹配结果时,使用“WITH”链接结果不起作用

时间:2015-01-29 17:48:28

标签: neo4j cypher

例如,我创建了两个链接节点:

create (a:ACTOR {id: "a1", name: "bruce wellis"})
create (m:MOVIE {id: "m1", title: "die hardest"})
create (a)-[:ACTED_IN]->(m)

1。来自此密码查询:

match (a:ACTOR {id: "a1"})
with a
optional match (m:MOVIE {id: "m1"})
set m += {
    title: "die easier"
}
return a;

我可以得到结果:

+-----------------------------------------+
| a                                       |
+-----------------------------------------+
| Node[1000]{name:"bruce wellis",id:"a1"} |
+-----------------------------------------+
1 row
Properties set: 1

查询成功返回了actor节点。

2。 (更新)但是如果你使匹配MOVIE子查询失败:

match (a:ACTOR {id: "a1"})
with a
optional match (m:MOVIE {id: "mm"})
set m += {
    title: "die easier"
}
return a;

我收到了错误:

CypherTypeException: Expected m to be a node or a relationship, but it was :`null`. 

如何让第二个查询返回匹配的actor结果?

1 个答案:

答案 0 :(得分:3)

无法匹配任何内容的MATCH将始终不返回任何行。

因此,在#2中,由于第二个MATCH失败,因此不返回任何行。

您可以使用OPTIONAL MATCH代替第二个MATCH,您应该会看到结果。

[EDITED] 对于更新的问题,这个(有点难看)的解决方法应该有效:

MATCH (a:ACTOR {id: "a1"})
WITH a
OPTIONAL MATCH (m:MOVIE {id: "mm"})
WITH a, COLLECT(m) AS cm
FOREACH(m IN cm | SET m += {title: "die easier"})
RETURN a;