我在Neo4j网站上尝试了Cypher示例,其中一个问题让我感到有些困惑。
有三个电影节点分别具有title
s" The Matrix"," The Matrix Reloaded"和#34;矩阵革命"。 Matrix节点具有id
" 603"。
还有三个演员节点,各自有name
s"基努·里维斯","劳伦斯·菲什伯恩"和" Carrie-Anne Moss"。
所有演员和所有电影之间都有ACTS_IN
个关系。
这是一个应该返回The Matrix中演员所扮演的所有其他电影的查询:
START matrix=node:node_auto_index(id="603")
MATCH (matrix)<-[:ACTS_IN]-(actor)-[:ACTS_IN]->(movie)
RETURN actor.name + ' acts in ' + movie.title;
这是(正确的)结果:
Keanu Reeves acts in The Matrix Reloaded
Keanu Reeves acts in The Matrix Revolutions
Laurence Fishburne acts in The Matrix Reloaded
Laurence Fishburne acts in The Matrix Revolutions
Carrie-Anne Moss acts in The Matrix Reloaded
Carrie-Anne Moss acts in The Matrix Revolutions
为什么Matrix节点本身未包含在结果中?
答案 0 :(得分:3)
MATCH
子句指定路径。路径可能有循环,但永远不会包含两次相同的关系。在
MATCH (matrix)<-[:ACTS_IN]-(actor)-[:ACTS_IN]->(movie)
两个ACTS_IN关系总是不同的。因此矩阵总是不等于电影,因为没有一个演员与同一部电影有两个ACTS_IN关系。
如果您将一个演员的多个关系添加到同一个电影中,您将获得具有movie =“The Matrix”的匹配。原因可能是演员扮演多个角色。
在这种情况下,自然语言中的查询将是:哪些电影让矩阵的所有演员都参与其中?
START matrix=node:node_auto_index(id="603")
MATCH matrix<-[:ACTED_IN]-actor
WITH actor
MATCH actor-[:ACTED_IN]->movie
RETURN distinct movie.title;
查询由两个与WITH
语句链接的部分构成: