2016-07-10 61 views
1

我有兩個疑問。neo4j如何與兩個匹配工作

第一個查詢

match (user)-[r:CreatesChat]-(chatitems) 

第二個查詢

match (chatitems)-[r:PartOf]-(teamschat)-[s:OwnedBy]-() 

我想第一個3個用戶從第一個查詢

,並從第二返回第3隊返回查詢

目標是檢查第一個查詢的用戶是否有se COND查詢

我的Neo4j查詢

match (user)-[r:CreatesChat]-(chatitems) 
with user.id as uid,chatitems.id as chatid 
order by uid desc 
with collect([uid])[..3] as users,collect([chatid])[..3] as chats 
UNWIND users AS idusers 
match (chatitems)-[r:PartOf]-(teamschat)-[s:OwnedBy]-() 
return idusers 

該查詢返回

返回133239排在1360毫秒,顯示第1000行

但我執行查詢

match (user)-[r:CreatesChat]-(chatitems) 
with user.id as uid,chatitems.id as chatid 
order by uid desc 
with collect([uid])[..3] as users,collect([chatid])[..3] as chats 
UNWIND users AS idusers 
return idusers 

idusers retu rned are right

在539毫秒內返回3行。

我如何關聯這兩個查詢?

+0

你能澄清你的意圖,關於第二部分你的問題與團隊?您是否試圖以某種順序獲得排名前三的球隊,並查看您的第一個查詢中是否有任何用戶在其中?或者,您是否試圖查看您的第一個查詢中的3個用戶是否擁有某人擁有的團隊?或者如果他們在同一個團隊中?更好地表達你想要做的事情可以幫助我們給出更準確的答案。 – InverseFalcon

+0

我想按排名順序排名前三名的球隊,看看是否有任何用戶在他們的球隊 – user3712581

回答

1

我想你想收集前3名用戶和前3名球隊,然後放鬆每一個收集。類似這樣的:

MATCH (user:User)-[:CreatesChat]->(chatitems:Chat) 
WITH user ORDER BY user.id DESC LIMIT 3 
WITH collect(user) AS users 
MATCH (chatitems:Item)-[:PartOf]->(teamsChat:Team)-[:OwnedBy]-() 
WITH users, teamsChat ORDER BY teamsChat.id DESC LIMIT 3 
WITH users, collect(teamsChat) AS teams 
UNWIND users AS user 
UNWIND teams AS team 
MATCH p=(chatitems:Item)-[:PartOf]-(team)-[:OwndedBy]-(user) 
RETURN p 
+0

我對你使用collect()和放鬆在這裏感到困惑,尤其是在你收集teamChat作爲球隊並立即展開的情況下。同樣,你已經收集了用戶,完成任何事情,但將它與WITH一起傳遞,然後解開它。我在這裏錯過了關於UNWIND正在做什麼的重要事情嗎?或者有沒有一些理由讓傳遞匹配的行被皺起了眉頭?如果你刪除了收集和解開,你不會得到相同的答案嗎? – InverseFalcon

+0

呃。好的,我想我看到了問題。如果我們簡單地沿着行傳遞它們,它們匹配WITH中的其他部分,並受LIMIT的影響,而不是獨立於它。因此,爲了保留查詢的一部分中的有限行,我們需要通過收集查詢來保護它免受查詢後面部分的限制,並且在後面展開它。像這樣的其他情況要注意?任何其他方式來隔離訂單和限制操作,以便我們可以在不改變的情況下通過以前的結果另外,收集隊伍的原因是什麼?因爲這裏沒有限制嗎? – InverseFalcon

+1

是的,沒錯。在[post](https://neo4j.com/blog/common-confusions-cypher/)中有限制+收集的解釋。我認爲你對第二次收集/解圍團隊是正確的,可能沒有必要,但我認爲它有助於明確地說明發生了什麼。 –