次のサイクルを回避しながら、再帰的なグループ メンバーシップ構造をトラバースするために、ArangoDB のトラバーサル オブジェクトを使用しています。2 つの別々のトラバーサルの結果を結合する必要がある場合があります。AQLを活用してトラバーサル結果を結合する効率的な方法はありますか? 私は現在、JavaScriptを使用して結果をメモリに結合しています。
質問する
255 次
1 に答える
3
これをトラバーサルグラフを使って説明したいと思います。方向に2 つのトラバーサルを行うANY
ため、結果の数は少し多くなります。結合操作の結果となる共通の隣人を持つポイントから開始します。1 つのクエリでは共通点が見られますが、A
他の反復ではそうではありません。E
B
基本的な反復:
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 に答える