Neo4j,Cypher,过滤顺序,为什么?

时间:2014-07-01 13:32:14

标签: filter neo4j match cypher

我想知道为什么这两个查询会给我不同的结果。

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的属性。

1 个答案:

答案 0 :(得分:0)

以前(可选)MATCH子句始终是其中的一部分。

来自docs:

  

在多个(可选)MATCH子句的情况下,谓词在   在前面的地方总是有一部分模式   比赛。如果WHERE是,则结果和性能都可能受到影响   放入错误的MATCH条款。

http://docs.neo4j.org/chunked/stable/query-where.html

编辑: 如果您在neo4j浏览器中对示例影片数据进行尝试,然后将结果更改为表视图,则可能更清楚cypher查询实际返回的内容:

第一个查询将采用keanu,他参与的所有电影,可选地匹配其他关系并过滤这些可选的匹配关系(它不会过滤keanu的电影)

第二个查询将采用keanu,将所有电影与角色Neo匹配,并在此过滤的电影集上,它将执行可选匹配

因此,第一个查询结果包含与第二个相同的内容,以及keanu所在的电影,但不是角色Neo