2013-02-11 90 views
9

我正在處理一個項目,我必須處理圖表...... 我使用圖形來獲取兩站之間的巴士和自行車的路線。獲取兩個節點之間的所有路由neo4j

事實是,我所有的關係都包含從關係的起點到結束所需的時間。

爲了獲得節點之間的最短路徑,我使用了密碼的最短路徑函數。但是,最短的路徑並不是最快的......

有沒有辦法讓兩個節點之間沒有通過關係鏈接的所有路徑?

感謝

編輯:

其實我改變我的圖形,使其更容易。 所以我仍然有我所有的節點。現在,關係類型對應於從一個節點到另一個節點所需的時間。

cypher的shortestPath函數給出包含較少關係的路徑。我希望它返回的所有類型(時間)是最小的路徑.. 這可能嗎?

感謝

+0

您是否需要使用Cypher?我可以想到一些將會打印出來的gremlin腳本,它應該非常整潔。 – Nicholas 2013-02-13 02:58:41

+0

事實上,我使用nodeJs ..我有一個圖書館來查詢我的neo4j圖,讓我做一些密碼查詢...而不是gremlin查詢... – 2013-02-13 14:03:50

回答

11

在暗號,讓沒有關係的聯繫,並排序的重量總共兩個節點之間的所有路徑,您可以使用1.9推出了減少功能:

start a=node(...), b=node(...) // get your start nodes 
match p=a-[r*2..5]->b // match paths (best to provide maximum lengths to prevent queries from running away) 
where not(a-->b) // where a is not directly connected to b 
with p, relationships(p) as rcoll // just for readability, alias rcoll 
return p, reduce(totalTime=0, x in rcoll: totalTime + x.time) as totalTime 
order by totalTime 

你可以拋出一個最後限制1個,如果你只需要最短的話。

+0

你是什麼意思「獲得兩個節點之間沒有通過關係鏈接的所有路徑?」?如果不通過關係鏈接,節點之間如何形成路徑? – 2016-12-08 21:08:59

+0

不是直接鏈接,我的意思是。 (還要注意,這是非常古老的......語法現在甚至不會運行)。請參閱3.0中的Apoc以獲取更好的方法。 – 2016-12-09 20:26:07

4

可以使用的Dijkstra/Astar算法實現,這似乎是爲你一個完美的結合。看看http://api.neo4j.org/1.8.1/org/neo4j/graphalgo/GraphAlgoFactory.html

不幸的是,你不能使用Cypher的。

+0

是的,我想過這樣做..我只是想想知道是否有辦法通過密碼獲得兩個節點之間的所有路徑,因爲在獲得所有可能的路徑之後,我可以解析它們並獲得最快的路徑。並且使用密碼來獲取那些對我來說更容易, m使用neo4j和nodejs .. – 2013-02-11 15:33:05

+1

儘管首先獲取兩個節點之間的所有路徑,然後過濾可能會慢得多,因爲算法不能很聰明並立即選擇最佳路徑,即採取「快捷方式」 – 2013-02-11 20:03:07

+6

We可能應該以某種方式將更多的這些算法暴露給密碼。 – 2013-02-12 03:37:49

相關問題