Neo4j图形学院,练习4,第5部分:相似的查询不同的结果,为什么?

Neo4j图形学院,练习4,第5部分:相似的查询不同的结果,为什么?,neo4j,cypher,Neo4j,Cypher,在Graph Academy中,我们有练习4第5部分,其中有一个问题: 2.检索电影及其演员,其中一名演员还导演了电影,返回演员姓名、导演姓名和电影标题 我试过这个: MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person) WHERE exists((d)-[:ACTED_IN]->(m)) RETURN p.name, d.name, m.title MATCH(p:Person)-[:ACTED_IN

在Graph Academy中,我们有练习4第5部分,其中有一个问题: 2.检索电影及其演员,其中一名演员还导演了电影,返回演员姓名、导演姓名和电影标题

我试过这个:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person)
WHERE exists((d)-[:ACTED_IN]->(m))
RETURN p.name, d.name, m.title
MATCH(p:Person)-[:ACTED_IN]->(m:Movie)(m))
返回p.name、d.name、m.title
除了重复的信息外,结果似乎还可以。

结果出来后,我看到了graph academy的预期查询,它有一些小的更改,将DIRECTED改为ACTED:IN,并将exists改为DIRECTED,如下所示:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(d:Person)
WHERE exists((d)-[:DIRECTED]->(m))
RETURN p.name, d.name, m.title
MATCH(p:Person)-[:ACTED_IN]->(m:Movie)(m))
返回p.name、d.name、m.title
根据这一结果:

我们可以看到,没有像演员“汤姆·汉克斯”、导演“汤姆·汉克斯”这样的重复信息


我的问题是,为什么Neo4j在这么小的变化下表现出这样的行为?

这与遍历单个模式匹配时的某种唯一性行为有关

Cypher使用一种称为RELATIONSHIP_PATH的唯一性,这意味着对于每个路径,关系必须是唯一的——每个路径只能遍历一次

这样做有多种原因,最值得注意的是,它隐式地防止了可变长度遍历的无限循环,因为无限循环要求您能够反复遍历相同的关系

在第一个查询中,匹配项为:

MATCH(p:Person)-[:ACTED_IN]->(m:Movie)
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
MATCH (m)<-[:ACTED_IN]-(d:Person)
...