2016-12-16 164 views
0

爲什麼這兩個查詢產生不同的結果:爲什麼我的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

請發佈兩個結果和原始數據集 –

回答

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

0

既然你說你的第二個查詢可以得到你想要的結果,那就讓我們來分析一下。

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的參與或沒有第二個查詢不同。

相關問題