为什么我的Cypher查询产生不同的结果?

时间:2016-12-16 14:32:58

标签: neo4j cypher

为什么这两个查询产生不同的结果:

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(kMovie)<-[:ACTED_IN]-(actor:Person),
(actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(actor2)
WHERE NOT (actor2)-[:ACTED_IN]->(kMovie) 
RETURN actor2.name, COUNT(actor2) 
ORDER BY COUNT(actor2) DESC
LIMIT 3;

第二个是:

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(kMovie)<-[:ACTED_IN]-(actor:Person),
(actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(actor2) 
WHERE NOT (actor2)-[:ACTED_IN]->()<-[:ACTED_IN]-(keanu) 
AND keanu <> actor2
RETURN actor2.name, COUNT(actor2) 
ORDER BY COUNT(actor2) DESC
LIMIT 3;

第二个给我正确的结果,但我不知道为什么第一个结果不同?

第一个结果:

╒═════════════╤═══════════════╕
│"actor2.name"│"COUNT(actor2)"│
╞═════════════╪═══════════════╡
│"Emil Eifrem"│"6"            │
├─────────────┼───────────────┤
│"Tom Hanks"  │"4"            │
├─────────────┼───────────────┤
│"Stephen Rea"│"3"            │
└─────────────┴───────────────┘

第二个结果:

╒═════════════╤═══════════════╕
│"actor2.name"│"COUNT(actor2)"│
╞═════════════╪═══════════════╡
│"Tom Hanks"  │"4"            │
├─────────────┼───────────────┤
│"Stephen Rea"│"3"            │
├─────────────┼───────────────┤
│"Ben Miles"  │"3"            │
└─────────────┴───────────────┘

数据集是可以从Neo4j中的示例图形部分创建的示例电影图形数据集。

2 个答案:

答案 0 :(得分:0)

您的查询提出了不同的问题。

第一个问题是:

找到基努·里维斯,他在中扮演的一部特定电影,以及中某个特定电影的合作者,以及该合作者,找到一个合作者THEM(coactor2),其中coactor2从未在我们之前选择的一个特定电影中演出。

第二个问题是:

找到基努·里维斯,他在中扮演的一部特定电影,以及中某个特定电影的合作者,以及该合作者,找到一个合作者THEM(coactor2),其中coactor2从未在任何电影中与Keanu Reeves合作(同样,确保coactor2实际上不是Keanu Reeves)。

在结果中,&#34; Emil Eifrem&#34;在The Matrix中与Keanu合作,因此无论每行使用哪个一个特定电影,Emil都不会出现在第二个查询的结果中。

Emil出现在第一个查询结果中的原因是,对于结果集中的某些行,您匹配的一个特定电影(kMovie)不是The Matrix,而是其他一些电影。在这些行中,Emil是其他电影的coactor的coactor(coactor2),并且没有在该行中匹配一个特定电影的任何行为。

作为这里一行的一个具体例子,一个特定的电影匹配的是The Matrix Reloaded,其中Hugo Weaving是一个coactor。 Hugo Weaving与The Matrix中的Emil合作,Emil从未在The Matrix Reloaded中演过。

Emil在第一次询问中得分为6的原因是因为有2个与基努(Laurence Fishburne,Hugo Weaving和Carrie-Anne Moss)合作的两部电影不是The Matrix(The Matrix Reloaded and “矩阵革命”(The Matrix Revolutions),以及所有这三个共同演员在“黑客帝国”(The Matrix)上与埃米尔(Emil)合作,而埃米尔(Emil)从未在“黑客帝国”(The Matrix Reloaded)或“矩阵革命3(coactors)* 2(电影)=在Emil出现在结果集中的地方发出6行。

我希望能够充分解释两个查询之间的差异。

答案 1 :(得分:0)

既然你说你的第二个查询可以获得你想要的结果,那就让我们打破那个结果。

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(kMovie)<-[:ACTED_IN]-(actor:Person)正在将名为Keanu Reeves的人员标识为keanu,其中ACTED_IN是我们称之为kMovie的内容,至少是另一个人称为actor ACTED_IN

(actor)-[:ACTED_IN]->()<-[:ACTED_IN]-(actor2) WHERE NOT (actor2)-[:ACTED_IN]->()<-[:ACTED_IN]-(keanu) AND keanu <> actor2那个演员还ACTED_IN(另一个)actor2 ACTED_IN,它没有与keanu一起ACTED_IN(但不是keanu本人)。

RETURN actor2.name, COUNT(actor2)现在您只是对该人的名称以及该人显示的结果(行数)感兴趣,实际上您只对前3个结果感兴趣:ORDER BY COUNT(actor2) DESC LIMIT 3

与第一个查询相比,为什么会产生不同的结果。 WHERE NOT (actor2)-[:ACTED_IN]->(kMovie)请记住,kMovie是一部同时keanuactor投放的电影。这与仅查询电影的第二个查询不同keanu没有采取行动(不关心actor的参与与否。