2017-06-18 162 views
1

我是一個新的ArangoDB用戶,我有一個問題,我不知道如何解決它。我有一個由超過340k節點和超過430k的週期鏈接組成的圖,我試圖找到A和B之間的路徑。我確信在這兩個節點之間的路徑中,我將遇到循環,因此我使用了選項followCycles。作爲查詢我使用的東西:如何只循環一次循環?

FOR target, unused, path IN 1..150 OUTBOUND "A" connected OPTIONS {followCycles: True, uniqueEdges: "none"} FILTER target._id == "B" LIMIT 1 RETURN path

IMO此查詢應該返回我也考慮到環A和B之間的路徑。不幸的是,查詢無法找到路徑,並且因爲圖的維度而「永遠」運行。

無論如何,我已經注意到,如果我使用中間節點,我可以找到路徑。我不喜歡的東西:

FOR target, unused, path IN 1..150 OUTBOUND "A" connected OPTIONS {followCycles: True, uniqueEdges: "none"} FILTER target._id == "intermediate" LIMIT 1 RETURN path

FOR target, unused, path IN 1..150 OUTBOUND "intermediate" connected OPTIONS {followCycles: True, uniqueEdges: "none"} FILTER target._id == "B" LIMIT 1 RETURN path 我懷疑是因爲循環值150是不夠的,我也試圖與15000但我有同樣的結果。

您是否知道是否有一個選項可以說只遍歷一次循環或其他內容以避免該問題?

感謝

回答

0

如果你只是在尋找AB以下查詢應該爲你工作之間的路徑。

FOR target, unused, path IN 1..150 OUTBOUND "myCollection/A" connected 
OPTIONS {uniqueVertices: "global", bfs: true} 
    FILTER target._id == "myCollection/B" 
    LIMIT 1 
    RETURN path 

uniqueVertices: "global"每個頂點(節點)在遍歷期間只訪問一次。這意味着沒有循環。

使用bfs: true您使用寬度優先算法。這意味着遍歷首先遍歷所有找到的深度爲1和2的頂點,依此類推。使用此功能,您可以通過避免跟蹤路徑來找到較短的路徑,直至達到最大深度(150),以認識到它們沒有連接路徑。

有關AQL圖遍歷的更多信息,您應該看看docs

+0

謝謝我也用followCycles –