为什么我的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的示例的曲线图部分被创建的示例电影图形数据集。
您的查询提出不同的问题。
第一个查询问:
查找基努·里维斯,一个他在担任特定影片,并在一个特定的电影一个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行。
我希望能够充分解释这两个查询之间的差异。
谢谢伟大的答案 – 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
是,无论keanu
和actor
演过一部电影。这是对的只是在寻求电影,其中keanu
没有采取行动,(不关心actor
的参与或没有第二个查询不同。
请发布两个结果和原始数据集 –