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

问题描述:

为什么这两个查询产生不同的结果:为什么我的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的示例的曲线图部分被创建的示例电影图形数据集。

+0

请发布两个结果和原始数据集 –

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

第一个查询问:

查找基努·里维斯,一个他在担任特定影片,并在一个特定的电影一个coactor,并与coacter,找到他们的coactor(coactor2 )coactor2从未在中扮演过我们之前选择的一个特定电影

第二查询问:

查找基努·里维斯,一个他在担任特定影片,并在一个特定的电影一个coactor,并与coacter,找到他们的coactor(coactor2 )coactor2在任何电影中从未与基努里维斯合作过(另外,确保coactor2实际上并不是Keanu Reeves)。

在结果中,“Emil Eifrem”在The Matrix中与Keanu合作,所以Emil不会出现在第二个查询的结果中,无论哪个一个特定的电影被用于每一行。

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

作为这里一排的一个具体例子,一个特定的电影匹配是矩阵重装上阵,其中雨果编织是一个共同作用者。 Hugo Weaving在The Matrix与Emil合作,Emil从未在The Matrix Reloaded中扮演过角色。

Emil在第一个查询中计数为6的原因是因为Keanu(Laurence Fishburne,Hugo Weaving和Carrie-Anne Moss)在3部不是The Matrix(The Matrix Reloaded)和“黑客帝国革命”),所有这三位合作者与埃米尔在黑客帝国合作,埃米尔从未在“黑客帝国重装上阵”或“黑客帝国革命”中扮演过角色。 3(coactors)* 2(电影)= Emil出现在结果集中的6行。

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

+0

谢谢伟大的答案 – Riwogo

既然你说你的第二个查询可以得到你想要的结果,那就让我们来分析一下。

MATCH (keanu:Person {name:"Keanu Reeves"})-[:ACTED_IN]->(kMovie)<-[:ACTED_IN]-(actor:Person)被识别的名称基努·里维斯的人(S)为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东西(但不基努本人)。

RETURN actor2.name, COUNT(actor2)现在你在那人的名字只是感兴趣,那个人多少结果(行)显示出来,其实你只是对前3的结果感兴趣:ORDER BY COUNT(actor2) DESC LIMIT 3

为什么这与第一个查询相比,会产生不同的结果。 WHERE NOT (actor2)-[:ACTED_IN]->(kMovie)记住,kMovie是,无论keanuactor演过一部电影。这是对的只是在寻求电影,其中keanu没有采取行动,(不关心actor的参与或没有第二个查询不同。