2017-02-14 7 views
0

私のグラフでは、valueというフィールドを持つエッジがあると言います。開始頂点を選択した後、常に最も高い値を持つエッジを選択してパスを見つけたいと思います。不幸にも私は正しいクエリを書く方法を理解できません.ArangoDBで可能でしょうか?ArangoDBで最大の値を持つエッジに続くパスを見つける

答えて

0

こんにちは、私はあなたが達成したいものをわからないよ、私はあなたの説明から想像することができる2つのシナリオがあります。

最初に:ここに最短パス

ユースケースは、あなたが開始を知っています頂点とターゲット頂点の間にあり、それらの間の最短(または最も安い)パスを探したいとします。 機能は、このようなオプションで距離属性を定義することによって、それを提供することができます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 

これはあなたの価値の最低のいくつかを持って開始から終了までのパス上のすべての頂点を与えます属性。あなたが「最高値」を必要とする場合は、値をコピーでき、最少のエッジがvalues

第二の総最高の合計に持つパスを見つけるために、さまざまな分野で1/valueで再度保存:エッジ

のソート

ユースケースは、開始頂点のみを持ち、接続した頂点をエッジの値で並べ替えることです。そこでは単純にトラバーサル文を単純なソートと組み合わせることができます。 (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

2番目のシナリオでは、検索時に表示されるすべてのエッジ全体に制限があります。私は各レベルで最高のバレーエッジを取得したいと思います。ソートとリミットは、各レベルで実行し、各次レベルのエッジを前のレベルの最高値を持つ頂点から選択する必要があります。 F.e. A→BがA→B→Dよりも高い値を持つA→B、C→B→D、C→Eのグラフから – DegHueg

+0

ArangoDBのFoxxマイクロサービスを見ると、複数の単一の深さのクエリを作成することができます。そしてそれは非常に速いです:)あなたが 'サークル'を形成するエッジでループするのを止めたいのであれば、あなたが訪れたすべての頂点の配列を保持し、重複を取得したら、反復を止めて結果を返します。 –

関連する問題