2013-07-13 62 views
0

最短路徑我想執行類似以下的最短路徑查詢:暗號:與約束

START source=node:myIndex(name="<src>"), destination=node:myIndex(name = "<dst>")                    
MATCH p = shortestPath(source-[:REL1*..5]-destination), 
      source-[sourceRel:REL1]-m, 
      destination-[destRel:REL1]-k 
WHERE sourceRel.a=<someValue> and destRel.a=<someOtherValue>                          
RETURN NODES(p); 

我想<src><dst>之間的最短路徑與物業a具有一定的價值約束在第一個關係從src和dst分別到下一個節點。

但是,neo4j只是返回找到的最短路徑,而沒有考慮到我的約束。 我在做什麼錯?爲最短路徑查詢指定最短路徑的第一個「跳躍」約束的正確方法是什麼?

編輯:我正在使用Neo4j 1.8.2。

+0

我想你可能會誤解最短路徑。通過使用第二個源和目標,您將包含使用它們之間的REL1的單跳,這會導致對最短路徑的否定。 – Nicholas

回答

0

現在知道我想要做什麼在當前的Neo4j版本中是不可能的(謝謝Wes),我使用一種解決方法來實現這一目標。 首先,我得既爲src和目的節點的下一個節點相匹配的約束:

START n=node:myIndex(name="<nodename>")        
MATCH n<-[rel:REL1]-m 
WHERE rel.a=<somevalue> 
RETURN m 

這個樣子,我有SRC和DST中的「下一個」節點的兩個節點ID。 我現在使用計算這兩個節點ID之間的最短路徑,並預先安排原始源並追加原始目標節點以獲取完整路徑。 它需要3個查詢而不是1個,但可能不像Wes所建議的那樣昂貴。

2

從2.0.0-M03開始,沒有什麼好方法可以將約束條件引入shortestPath。他們正在研究一種新的語法來做到這一點,但它仍處於設計階段。爲了做到這一點,你需要採取不使用shortestPath的效率較低的路線,按照長度排序並獲得最短的匹配所有約束條件的路線。