2015-10-14 37 views
3

我試圖找出一個暗號查詢,以確定一組節點,諸如一組確定如下之間的最短路徑的之間的最短路徑暗號查詢,爲組節點

MATCH (u:User) WITH u ORDER by u.score DESC LIMIT 10 RETURN u 

假定的圖的形式

(:User)-[:Owns]-(:Box) 

第一個限制是我只想返回匹配第一個查詢的用戶之間的路徑。

第二個限制是我不希望在用戶集中只包含一個用戶的鏈接時包含Box元素。我只對盒子元素感興趣,其中有一個匹配的用戶擁有盒子。可能有其他用戶未被選中鏈接到Box,但我對他們沒有興趣。

從某種意義上說,我認爲我正在尋求提取所有鏈接匹配用戶集的節點/路徑的子網,但我是Cypher/Neo4j的新手,無法解決這個問題。

任何指針感激地收到。

+0

你是說你想要的最短路徑的結果爲每個排列前10名用戶? –

+0

是的。我用表單查詢來解決這個問題:「WITH u ORDER BY u.score DESC LIMIT 10 MATCH u- [r] - >(c:Box)WITH u,c,r,count(r)as rc WHERE rc > 1 RETURN u,r,c「,換句話說,試圖只包含鏈接到多個用戶的Box,但這當然包括鏈接到不在我選擇的用戶的Boxes。然後,我想到了shortestPath,但請注意,這隻能應用於兩個已識別的節點。所以是的,我實際上試圖找出每個選擇的用戶之間的最短路徑,儘管這可能是一種無效的方式去實現它。 – esjmb

+0

我也嘗試過MATCH p =(u) - [:Owns] - (m),m - [] - (:User)類型的結構,但是我試過讓包含Box節點的鏈接只有一個用戶選擇集。這基本上是我的問題。如何確定Box的範圍。我顯然缺少一些東西:) – esjmb

回答

2
MATCH (u:User) 
WITH u ORDER by u.score DESC LIMIT 10 
WITH collect(ID(u)) AS user_ids 
MATCH (user1:User), (user2:User) 
MATCH path=allShortestPaths((user1)-[*0..3]-(user2)) 
WHERE ID(user1) IN user_ids AND ID(user2) IN user_ids AND user1 <> user2 
RETURN path 

您可以增加可變路徑長度(3在這種情況下),但性能會迅速降解取決於你的網絡上。

上述查詢不會過濾出只有大於一個用戶的Box元素的路徑。如果你只是想通過一個盒子直接鏈接,這很容易,但我不確定這是你想要的。如果是你可以這樣做:

MATCH (u:User) 
WITH u ORDER by u.score DESC LIMIT 10 
WITH collect(ID(u)) AS user_ids 
MATCH path=(user1:User)-[:Owns]-(box:Box)-[:Owns]-(user2:User) 
WHERE ID(user1) IN user_ids AND ID(user2) IN user_ids AND user1 <> user2 
RETURN path, user1, box, user2 

老實說,也許這就是你想要的。查詢返回後,您可能需要處理結果。這取決於你在做什麼與他們,我想;)

+1

布賴恩,非常感謝你。第二個例子完全解決了我的問題。 – esjmb