当后续查询在 Neo4j 密码查询中没有匹配结果时,使用 "WITH" 的链接结果不起作用
Chaining result with "WITH" doesn't work when the subsequent query doesn't have matched result in Neo4j cypher query
比如我创建了两个链接节点:
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`.
如何使第二个查询返回匹配的演员结果?
无法匹配任何内容的 MATCH
将始终 return 没有行。
因此,在 #2 中,由于第二个 MATCH
失败,因此 return 没有行。
您可以使用 OPTIONAL MATCH
代替第二个 MATCH
,您应该会看到结果。
[编辑]
对于更新的问题,这个(有点难看的)解决方法应该有效:
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;
比如我创建了两个链接节点:
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`.
如何使第二个查询返回匹配的演员结果?
无法匹配任何内容的 MATCH
将始终 return 没有行。
因此,在 #2 中,由于第二个 MATCH
失败,因此 return 没有行。
您可以使用 OPTIONAL MATCH
代替第二个 MATCH
,您应该会看到结果。
[编辑] 对于更新的问题,这个(有点难看的)解决方法应该有效:
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;