我想知道为什么这两个查询会给我不同的结果。
START keanu=node(1)
MATCH keanu -[r:ACTED_IN]-> (movieToDelete)
OPTIONAL MATCH movieToDelete -[relationshipsToDelete]- ()
WHERE "Neo" IN r.roles
RETURN movieToDelete, relationshipsToDelete;
并且
START keanu=node(1)
MATCH keanu -[r:ACTED_IN]-> (movieToDelete)
WHERE "Neo" IN r.roles
OPTIONAL MATCH movieToDelete -[relationshipsToDelete]- ()
RETURN movieToDelete, relationshipsToDelete;
在第一个查询中,我在可选匹配后过滤Neo,在第二个查询中,我在可选匹配之前过滤Neo。第一个查询实际上返回一个行,其中r变量在角色中没有Neo。但是,有一个r变量,它确实包含一个名为roles的属性。
答案 0 :(得分:0)
以前(可选)MATCH子句始终是其中的一部分。
来自docs:
在多个(可选)MATCH子句的情况下,谓词在 在前面的地方总是有一部分模式 比赛。如果WHERE是,则结果和性能都可能受到影响 放入错误的MATCH条款。
http://docs.neo4j.org/chunked/stable/query-where.html
编辑: 如果您在neo4j浏览器中对示例影片数据进行尝试,然后将结果更改为表视图,则可能更清楚cypher查询实际返回的内容:
第一个查询将采用keanu,他参与的所有电影,可选地匹配其他关系并过滤这些可选的匹配关系(它不会过滤keanu的电影)
第二个查询将采用keanu,将所有电影与角色Neo匹配,并在此过滤的电影集上,它将执行可选匹配
因此,第一个查询结果包含与第二个相同的内容,以及keanu所在的电影,但不是角色Neo