2013-03-30 90 views
1

假設約翰向Met銷售商品,Met在銷售商品給Bob和Alen, 和Alen再次向John出售商品。 我需要的是一個Cypher查詢,返回所有實例,如本例 John..Met..Alen,因爲Alen再次向John出售商品,使其成爲一個封閉的圓圈,同時顯示關係屬性(數量)的最低數量。我如何從整個數據庫做到這一點,讓我所有的實際圈數和最小數量。謝謝!獲得閉環內的所有節點和關係屬性

回答

3

從Stefans的回答開始,至少你會想把路徑的長度考慮在內。

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return p, lenght(p) 

每個節點只最短路徑長度

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return n, min(lenght(p)) 

,如果你想獲得的最短路徑:

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
with n, collect(nodes(p)) as nodes, min(length(nodes(p))) as l 
return n, head(filter(p in nodes : length(p) = l)) as shortest_circle,l 

見一個例子Neo4j的控制檯:http://console.neo4j.org/r/wrm522

你會注意到的一點是,如果你掃描整個圖表,你會得到對於圓的每個節點多次相同的圓。

這使用節點,長度,收集,頭和過濾器函數和最小聚合。 參見:http://docs.neo4j.org/chunked/milestone/query-function.html

正如Stefan已經說過的,掃描所有節點非常可能相當昂貴。

0

你可以做這樣的查詢:

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return p 

其中5 IST爲一個循環的最大深度。

請參閱Neo4j console中的示例。然而,使用「節點(*)」會觸發一個全局查詢,它會隨着圖的大小線性縮放。

+0

好吧,這對於閉環很好,但最低金額是多少... –

+0

對於閉環我使用start n = node(18)match(n) - >(a) - >(m) - >(s) - >(n)返回n,a,m,s; –

相關問題