2015-01-09 33 views
1

我對Cypher非常新,我需要幫助來解決我正面臨的問題。 在我的圖中,我有一個路徑代表數據流我需要知道路徑中的每個節點距離路徑的最後一個節點的距離。 例如,如果我有以下路徑:查找每個節點與路徑的最後一個節點之間的路徑的距離

的(a) - >(B) - >(C) - >(d)

的距離必須是3爲一個,2代表B,1爲d和0。 在Cypher中有沒有一種有效的方法來獲得這個結果? 非常感謝!

莫羅

+0

當你說「距離」,你的意思是跳數?或者你是否提到了你在節點之間的關係上所處理的屬性? –

回答

2

如果只是節點之間跳躍的話,我認爲這將適合該法案。

match p=(a:Test {name: 'A'})-[r*3]->(d:Test {name: 'D'}) 
with p, range(length(p),0,-1) as idx 
unwind idx as elem 
return (nodes(p)[elem]).name as Node 
, length(p) - elem as Distance 
order by Node 
+0

嗨戴夫,您的查詢符合法案,但我發現了一些問題:一些性能問題(圖形非常複雜,機器性能下降)和圖表中的週期存在。所以我認爲我必須找到一個不同的方法來完成任務...非常感謝您的幫助! –

1

在這個答案,我定義了一個路徑是「完全」如果它的起始節點沒有傳入的關係,其最終節點沒有傳出的關係。

該查詢將返回對每個「完整」路徑,其中包含每個節點的Neo4j的生成的ID的對象的集合和啤酒花的該路徑的末尾的數字:

MATCH p=(x)-[*]->(y) 
WHERE (NOT()-->(x)) AND (NOT (y)-->()) 
WITH NODES(p) AS np, LENGTH(p) AS lp 
RETURN EXTRACT(i IN RANGE(0, lp, 1) | {id: ID(np[i]), hops: lp - i}) 

注:帶有[*]匹配對於大型圖形將會代價高昂,因此您可能需要限制最大跳數值。例如,使用[*..4]來代替將最大跳躍值限制爲4.

此外,使用適當的節點標籤和關係類型限定查詢可能會加快速度。

+0

嗨,山姆,你的查詢效果很好,但是,就像我之前告訴過戴夫一樣,我發現了一些問題:一些性能問題(圖形非常複雜,機器性能下降 - 你警告過這個問題)以及週期的存在在圖中。我想我必須找到一個不同的方法來完成任務...非常感謝您的幫助! –

相關問題