2015-10-19 50 views
2

可以說我有以下節點的關係:無法正確訂購和限制子節點;帶+可選MATCH

(:User)-[:MEMBER]->(:Room)<-[:HAS]-(:Photo)

而且:User可以(:User)-[:FRIEND]-(:User)到其他:User

:Room可能有照片或可能不會。

什麼我'努力實現 - 獲得5 :Room'由.creationdate排序S,得到4 :Photo的每一個的那些房間和.date對它們進行排序(如果有任何的照片),並同時獲得5個朋友,這是這個房間的成員,沒有任何分類。我試圖在一個查詢中做到這一點,但我幾乎放棄了,也許有沒有辦法做到這一點,我需要作爲單獨的數據庫請求?

到目前爲止,查找查找我爲邏輯正確的查詢不起作用 - 例如,它只返回4個:Photo的總數,其中一些查詢沒有與其他節點的任何連接。

查詢:

MATCH (u:User {id:'E17YfQyRgl'})-[:MEMBER]-(r:Room) 
WITH r ORDER BY r.creationdate LIMIT 5 
OPTIONAL MATCH r-[:HAS]-(ph:Photo) 
WITH ph ORDER BY ph.date LIMIT 4 
OPTIONAL MATCH r-[:MEMBER]-(fr:User)-[:FRIEND]-(u:User {id:'E17YfQyRgl'}) 
return r,COLLECT(ph),COLLECT(fr)[..5] 

正如你可以看到我使用的收集,LIMIT和ORDER不一致的混搭,...但我只是失去了現在,能理解的任何幫助。

回答

2

只要您將一個標識符留在WITH子句之外,它就會變爲未綁定狀態。你認爲你正在使用一個標識符,但實際上你在所有節點上匹配。

尤其

WITH ph ORDER BY ph.date LIMIT 4 
OPTIONAL MATCH r-[:MEMBER]-(fr:User)-[:FRIEND]-(u:User {id:'E17YfQyRgl'}) 

r不再綁定到任何東西。它並未包含在前面的WITH條款中;你只攜帶了ph。您可以選擇在所有節點上匹配。嘗試是這樣的:

MATCH (:User {id:'E17YfQyRgl'})-[:MEMBER]-(r:Room) 
WITH r ORDER BY r.creationdate LIMIT 5 
OPTIONAL MATCH (r)-[:HAS]-(ph:Photo) 
WITH r, ph ORDER BY ph.date 
WITH r, COLLECT(ph)[..5] AS photos 
OPTIONAL MATCH (r)-[:MEMBER]-(fr:User)-[:FRIEND]-(:User {id:'E17YfQyRgl'}) 
RETURN r, photos, COLLECT(fr)[..5] 
+0

哦,我看到的,我想過這個問題,我記得我是想這樣的事情,是不是'用R,pH值ORDER BY ph.date'打算從重新排序我[R先前的r.creationdate與ph.date的關係與r?無論如何,我一定會嘗試它的明天,thx,我會回來後,我會得到一些睡眠=) –

+0

是的。您可以通過r.creationdate,ph.date'將其更改爲'WITH r,ph ORDER。 –

+0

對不起,妮可,我被捲入開發,沒有時間去正確地回到這個問題,現在我使用查詢非常類似於您的答案,似乎everthign是好的,謝謝! –