我努力学习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