2017-02-14 63 views

回答

0

你好我不確定你想實現什麼,有兩種可能的情況,我可以從你的描述想象:

第一:最短路徑

這裏的用例是你知道的起點頂點和目標頂點,並且您希望找到這兩者之間最短(或最便宜)的路徑。 在SHORTEST_PATHhttps://docs.arangodb.com/3.1/AQL/Graphs/ShortestPath.html#shortest-path-in-aql)功能,內置可以通過選項定義這樣的距離屬性爲它服務:

FOR v IN OUTBOUND @start TO @end @@edgeCollections OPTIONS {weightAttribute: "value", defaultWeight: 1} 
    RETURN v 

這會給你從開始的路徑上的所有頂點結束以來最低的一些價值屬性。如果你需要的「最高值」你可以複製的價值,並在不同的領域與1/value再次保存,以找到在總具有values

二的最高金額邊最少的路徑:邊

的排序

用例是你只有起始頂點,並希望獲得連接的頂點,按邊上的值排序。在那裏,您可以簡單地將遍歷語句與簡單的排序結合起來。 (https://docs.arangodb.com/3.1/AQL/Graphs/Traversals.html#graph-traversals-in-aql):

FOR v, e IN OUTBOUND @start @@edgeCollection 
    SORT e.value DESC 
    LIMIT 1 /* Only pick the highest one */ 
    REUTRN {v: v, e: e} 

第三用例:迭代只使用最高值

在用例2所述的AQL可以鏈接到其具有被稱爲A-任意深度幾個深度先驗。所以說,你想迭代僅使用與最高值的邊緣3個步驟:

FOR v1, e1 IN OUTBOUND @start @@edgeCollection 
    SORT e1.value DESC 
    LIMIT 1 /* Only pick the highest one */ 
    /* Depth 1 done. now depth 2*/ 
    FOR v2, e2 IN OUTBOUND v1 @@edgeCollection 
    SORT e2.value DESC 
    LIMIT 1 /* Only pick the highest one */ 
    FOR v3, e3 IN OUTBOUND v2 @@edgeCollection 
     SORT e3.value DESC 
     LIMIT 1 /* Only pick the highest one */ 
     RETURN [v1,v2,v3] 

第四用例:

深度不是先驗已知的,在這種情況下,純AQL在當前發佈版本(3.1)不能制定這個。在JavaScript中使用遍歷模塊(https://docs.arangodb.com/3.1/Manual/Graphs/Traversals/UsingTraversalObjects.html#getting-started)將更容易使用Foxx服務(https://docs.arangodb.com/3.1/Manual/Foxx/#foxx),該模塊有點更靈活,但只能在Javascript中實現。

+0

感謝您的回覆,但不幸的是您的解決方案不適合我的使用案例,請讓我澄清一下。 – DegHueg

+0

在你寫的第二個場景中,對搜索期間所有將被視爲邊緣的邊緣有一個限制。我想在每個關卡上獲得一個最高的valye邊緣。因此,應該在每個級別執行排序和限制,並且如果每個下一級別的邊緣應該從前一個級別中具有最高值的頂點選擇。 F.e.從圖:A→B→C→B→D→C→E,其中A→B的值比A→CI的值要高A→B→D – DegHueg

+0

有一個看看ArangoDB中的Foxx微服務,你可以在那裏做,因爲它可以讓你進行多個單一的深度查詢,並始終沿着具有最高「價值」的邊緣進行查詢。而且速度非常快:)如果你想停止在形成一個「圓」的邊上循環,只保留你訪問過的所有頂點的數組,如果你得到一個副本,停止迭代並返回結果。 –