2016-05-02 1 views
0

ArangoDBのtraversal objectを使用して、次のサイクルを回避しながら再帰的なグループメンバーシップ構造をトラバースします。 2つの別々のトラバーサルの結果に参加する必要がある場合があります。 AQLを利用してトラバーサル結果に効率的に参加する方法はありますか?私は現在、JavaScriptのメモリに結果に参加しています。ArangoDBでのトラバーサルオブジェクトの結果への結合

+0

回答が役に立ちましたか?はいの場合は、「受け入れ」とマークできますか?そうでない場合、何が欠けていますか? – dothebart

+0

@dothebartあなたの答えをありがとう。私はチームの優先順位がシフトしたので、最近この問題を見る機会はありませんでしたが、私は過去にあなたの提案に似たものを試しましたが、実際には正しい結果が得られましたが、パフォーマンスは悪かったです。さらに、私の特定の問題には多くのサイクルがあり、同じノードを繰り返し訪れたことでさらにパフォーマンスが低下しました。したがって、訪問された頂点の複数のセット間の交差点を見つけることに加えて、各ツリーの深さが約5程度になる可能性があるため、クエリはサイクルを回避する方法を指定する必要があります。 – user2941476

+0

私はGRAPH_NEIGHBORS関数を使ってサイクルを避けるためにノードから頂点を取得しましたが、複数の呼び出しを行ったり複数の呼び出し結果を交差させたりするとパフォーマンスが低下しました。 – user2941476

答えて

2

the traversal graphを使用して説明します。私たちはANY方向に2つのトラバースを行いますので、結果の数は少し大きくなります。我々は、結合操作の結果となる共通点を持つ点で開始します。 1つのクエリでは、AEが表示されます。これはBが共通している必要がありますが、反復のものは含まれていません。

基本的な反復:

FOR v IN 1..1 ANY 'circles/A' GRAPH 'traversalGraph' RETURN v._key 

circles/Aから始まって、これはこれは["F", "B"]になりcircles/Eから始めて、["B","G"]につながる - そう、その明白な、我々は唯一の参加の結果として"B"を取得する必要があります。

私たちの最初の可能なアプローチは、2つのサブクエリを使用してINTERSECTIONを使用してそれらを結合することです:

LET firstTraversal = (FOR v IN 1..1 ANY 'circles/A' GRAPH 'traversalGraph' RETURN v) 
LET secondTraversal = (FOR v IN 1..1 ANY 'circles/E' GRAPH 'traversalGraph' RETURN v) 
RETURN INTERSECTION(firstTraversal, secondTraversal) 

ここに問題がある可能性が高価になる可能性がある、オブジェクトの完全な深さの比較が行われることを、可能性があり。したがって、別のアプローチは、_key属性を使用してそれらに参加することができます:

LET firstTraversal = (FOR v IN 1..1 ANY 'circles/A' GRAPH 'traversalGraph' RETURN v) 
LET secondTraversal = (FOR v IN 1..1 ANY 'circles/E' GRAPH 'traversalGraph' RETURN v) 
FOR oneSet IN firstTraversal 
    FOR otherSet IN secondTraversal 
    FILTER oneSet._key == otherSet._key RETURN oneSet 
関連する問題