Neo4j:Cypher示例查询的结果让我困惑

时间:2013-08-26 07:36:23

标签: neo4j cypher

我在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节点本身未包含在结果中?

1 个答案:

答案 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语句链接的部分构成:

  1. 找到矩阵的演员
  2. 找到这些演员的所有电影