为什么这两个查询产生不同的结果:
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中的示例图形部分创建的示例电影图形数据集。
答案 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
是一部同时keanu
和actor
投放的电影。这与仅查询电影的第二个查询不同keanu
没有采取行动(不关心actor
的参与与否。