2017-06-18 5 views
1

私はArangoDBの新しいユーザーです。問題を解決する方法がわかりません。私はグラフを340kノードとサイクル430k以上のリンクで構成されていると私はAとBの間のパスを見つけるしようとしている。私は2つのノード間のパスでは、私はループが発生するので、 followCycles。 IMOこのクエリは、ループを考慮し、私にAとBの間にそのパスを返す必要がありますサイクルを1回だけ行う方法は?

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

:クエリとして、私は何かを使用しています。残念なことに、そのクエリはパスを見つけることができず、グラフの次元のために "永遠に"実行されます。

私は中間ノードを使用するとパスを見つけることができます。私は理由値150が十分ではありませんループで、私は15000でも試してみましたが、私は同じ結果を持っていたと思われる

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 :私のような何かをしました。

問題を回避するためにループを1回だけトラバースするように指定するオプションがあるかどうか知っていますか?

おかげ

答えて

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"とすると、各頂点(ノード)は、トラバーサル中に1回しか訪れません。つまり、ループは守られません。

bfs: trueでは、幅優先アルゴリズムを使用します。つまり、最初に探索されたすべての頂点が深度1、次に2の順に実行されます。これを使うと、最大深度(150)に達するまで経路をたどることを回避して経路が見つからないようにすることができます。

AQLグラフのトラバーサルの詳細については、docsを参照してください。

+0

ありがとう、私もfollowCycles –