1

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

4

1 に答える 1

3

これをトラバーサルグラフを使って説明したいと思います。方向に2 つのトラバーサルを行うANYため、結果の数は少し多くなります。結合操作の結果となる共通の隣人を持つポイントから開始します。1 つのクエリでは共通点が見られますが、A他の反復ではそうではありません。EB

基本的な反復:

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

circles/Aこの結果から["B","G"]始まると、circles/Eこの結果から始まります["F", "B"]-したがって、明らかに"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
于 2016-05-04T09:05:11.037 に答える