2015-12-02 140 views
0

我試圖圍繞一個查詢來包裹我的頭。例如,我有這種模式(photo:Photo)-[:AUTHOR]->(user:User)。用戶可以有朋友(user:User)-[:FRIEND]->(friend:User)。那麼,如何查詢我在哪裏可以找到由我或我的朋友製作的所有:Photo,並按日期排序,如果有的話?Neo4j匹配與一個或另一個節點有關係的節點

MATCH (user:User {id: 'me'}), (user)-[:FRIEND]-(friend:User) 
//other pattern matches that I need to do 
OPTIONAL MATCH (photo:Photo)-[:AUTHOR]-(user | friend) 
RETURN photo 
ORDER BY photo.date 
LIMIT 42 

但據我所知,此結構(user | friend)無效。那麼,正確的做法是什麼?

回答

3

如果只尋找到定義User節點的單個關係,一個簡單的方法是使用長度爲0的可變長度關係爲1。此收集的所有節點爲0的距離(在開始節點是)中並用的1

MATCH (user:User {id: 'me'})-[:FRIEND*0..1]-(me_and_friend:User) 
OPTIONAL MATCH (photo:Photo)-[:AUTHOR]-(me_and_friend) 
RETURN photo 
ORDER BY photo.date 
LIMIT 42 

的距離的所有節點的更通用的解決方案將是collect不同節點成陣列,結合這些陣列,然後再次使用UNWINDMATCH

MATCH (user:User {id: 'me'}), (user)-[:FRIEND]-(friend:User) 
WITH collect(user)+collect(friend) AS me_and_friends 
UNWIND me_and_friends AS allusers 
OPTIONAL MATCH (photo:Photo)-[:AUTHOR]-(allusers) 
RETURN photo 
ORDER BY photo.date 
LIMIT 42 

如果您使用更長的路徑或更復雜的模式,這可能很有用。

+0

哇,我應該考慮以這種方式放鬆自己。從來沒有使用可變長度,這有趣的是,你可以使用0長度'引用'節點本身,真棒片段,謝謝! 如果其他人想要發佈一些方便的解決方案,我會等待一段時間才能接受答案。 –

+0

哎呀,對不起,忘了這個問題,接受!謝謝! –

相關問題