我努力學習Cypher和我有一個trust network的數據,我想查詢誰相信「15最信任的人」的人,所以我寫了這個查詢,QUERY1:爲什麼這兩個Cypher查詢返回不同的結果?
QUERY1:
MATCH (u1:USER)-[:TRUST]->(u2:USER)
with u2.Id as id, COUNT(u2) AS score
order by score desc
limit 15
match p=(w1:USER)-[:TRUST]->(w2:USER {Id: id})
return w1.Id as user1, w2.Id as user2
,我以後想要將最後兩行查詢更改爲:
QUERY2:
MATCH (u1:USER)-[:TRUST]->(u2:USER)
with u2.Id as id, COUNT(u2) AS score
order by score desc
limit 15
match p=(w1:USER)-[:TRUST]->(w2:USER {Id: id})-[:TRUST]->(w3:USER)
return w1.Id as user1,w2.Id as user2, w3.Id as user3
並且在分析結果後,我猜測有什麼不對! 所以我硬編碼id
到特定的值,例如575,然後count(p)
等於1937520,但是,如果我運行硬編碼ID查詢的最後一行,作爲一個獨立的查詢:
QUERY3:
MATCH r=(u1:USER)-[:TRUST]->(u2:USER {Id: "575"})-[:TRUST]->(u3:USER)
return count(r)
的count(r)
等於到129168!
我檢查了用戶「575」信任207人並且被624人信任,所以QUERY3結果似乎是正確的:207 * 624 = 129168。我的問題是爲什麼?! 我不明白QUERY2有什麼問題,第二個問題是否意味着QUERY1結果也是錯誤的?
EDIT1: 感謝的答案,但我仍然有這個問題,所以我檢查了另一個場景,我已經得到了以下結果: 如果我寫這樣的查詢:
QUERY4:
MATCH (n) WITH n limit 15 return "1"
我將在輸出中打印15「1」,所以這意味着QUERY2的最後一部分執行15次,無論我是否對Id進行硬編碼,就像它在for循環中一樣。所以這裏的問題是,我認爲WHIT X LIMIT N doSomeThing
將像foreach(x : X)
循環執行,如果我使用x,並且不會,如果我不使用x。愚蠢的假設...
你是對的,但如果我改變(W2:用戶{ID:ID})QUERY2的一部分(W2:用戶{ID: 「575」})我得到1937520結果,不這意味着最後一個匹配部分爲USER「575」運行15次,因爲限制15? –
謝謝,我編輯了答案來反映這一點。問題在於WITH上缺少DISTINCT,導致查詢多次返回同一用戶。 – yawmoght