2016-07-13 9 views
0

neo4jから来て、Arangoを初めて使用しています。AQL Arango - エッジを使用して頂点と近傍を取得

私は自分のデータをクエリし、対応するデータ構造を構築しようとしています。

だから私は何かのようにしている:

Circle A 
    /  \ 
Square A Circle B 
      / \   \ 
     Circle C Square B Square D 

サークルは、文書コレクションに格納されています。 正方形はドキュメントコレクションに格納されます。

次に、適切に対応する2つのエッジコレクション HAS_CIRCLEとHAS_SQUAREがあります。

私はサークルBとそのネイバーを望んでいることを知っています。そういう構造です。

{ 
    circle: {data from Circle B}, 
    parents: [{data from Circle A}], 
    children: [{data from Circle C}], 
    squares: [{data from Square B}, {data from Square D}] 
} 

*この構造を入れ子にするつもりはありません。私が{サークルAのデータ}をparentsにしたいときのように、私はこれも親、子、正方形を持っているとは思っていません。文字通りそのノードに含まれるメタデータを探しています。

私はこのように始めることができると知っています...しかし、私はすぐに失われます。基本を行うときでさえ、私はそれを正しく収集し、配列をキーに関連付けることはできません。

FOR c in Circle 
    FILTER c.name === 'Circle B' 
    FOR hc in HAS_CIRCLE 
     FILTER hc._from === c._id 

答えて

2

あなたは欠けている必要がありますthe trip to the graph documentation in ArangoDB。確かに、古典的な結合(試したような)でドキュメントクエリーを使用して、グラフの反復を行い、他のRDBMS上の従来のSQLと同様にマップすることができます。

このようなクエリでは、あなたuse the pattern matching traversalsただし、ArangoDBは、その本当のグラフパワーを発表:

FOR vertex, edge, path IN 
    1..5 
    OUTBOUND 
    'circle/A' 
    GRAPH circesAndSquares 
    FILTER edge.name == 'Circle B' 
    RETURN {vertices: vertex, edges: edge, paths: path} 

edgeが現在のトラバースステップ、vertex頂点のエッジドキュメントが含まれています。 FILTERを入力すると、一致しないドキュメントはRETURNステートメントから非表示になります。名前でドキュメントの

FILTER path.vertices[*].isValid == true 

例はHOWTOの作業を示しています

FILTER path.edges[1].name == 'Circle B' 

あなたはまた、任意の反復の深さに基づいてフィルタリングすることができますパスは、その後用語でトラバーサルを中止することがあり、反復の深さ、上でフィルタリングすることができます匿名のグラフやArangoDBにデータを挿入する方法について説明します。 ArangoDBには特別なedge collection typeがあり、_from_toの属性を暗黙的に認識して強制しますが、この制限の他に任意の文書で記入することができます。

combine regular AQL queries with graph traversals, as demonstrated in this exampleでもかまいません。

+1

ありがとうございました。私の最終的なアプローチを以下に加えました。 – savv

+0

こんにちは、あなたの解決策を「受け入れた」とマークする必要があります;-) – dothebart

1

@dothebartに感謝します。これは正しい方向に私を指摘してくれました。

私のクエリは、次のようになりました。これが最も理想的ですが、私が探していた結果をもたらすならば、まだ100%ではありません。

FOR c IN Circle 
    FILTER c.name == 'Circle B' 
     RETURN { 
      "circle" : c, 
      "parents": (FOR parents IN INBOUND b._id HAS_CIRCLE RETURN parents)), 
      "children": (FOR children IN OUTBOUND b._id HAS_CIRCLE RETURN children), 
      "squares": (FOR squares IN OUTBOUND b._id HAS_SQUARE RETURN squares) 
     } 
関連する問題