2016-08-12 6 views
1

ArangoDBでエッジをプログラムで素早く作成する最も簡単な方法は何ですか?ArangoDBでエッジをプログラムで作成する

共通の属性に基づいてドキュメント間の関係を作成したいと考えています。私は属性を選択することができたいと思います。コレクションAのすべてのドキュメントに対して、同等の属性で同じ値を持つコレクションBのすべてのドキュメントにエッジを作成します。

たとえば、コレクションに電子メールメッセージをインポートし、別のコレクションに人をインポートした場合、電子メールとコレクションの間にエッジを生成したいと考えています。電子メールメッセージでfromtoフィールドの値は、電子メールアドレスに対応することとしましょう

{ 
    "_key": 
    "name": 
    "email": 
} 

を:電子メールのスキーマは次のようになります。

{ 
    "_key": 
    "subject": 
    "body": 
    "from": 
    "to": 
} 

人のスキーマは次のようになります。我々は人々のコレクションで見つけることができる。

人物コレクション内のすべての文書に対して、コレクション、属性、エッジパラメータを入力して、同じ電子メールアドレスを持つ電子メールコレクション内のすべての文書にエッジを作成できるようにしたい現在のドキュメントのemail属性としてfrom属性に指定します。

これまでのところ、私はFoxxがこれに最適なツールかもしれないと思っていますが、私はドキュメントに圧倒されています。

最終的には、エッジを定義するドキュメント間の共有属性に基づいて完全なCRUDを作成したいと考えています。エッジが既に存在する場合はエッジを更新し、エッジが存在しない場合は作成します。

私は、コレクション内のすべてのドキュメントに対してArangoを照会し、非常に多くの結果を返す必要があるため、標準HTTP APIを使用して個々のAPI呼び出しでこれを行うのは非常に遅いことを知っています。

これを行うFoxxサービスは既にありますか?そうでない場合は、どこから作成する必要がありますか?

答えて

2

単一AQLクエリで十分です:

FOR p IN people 
    FOR e IN emails 
     FILTER p.email == e.from 
     INSERT {_from: p._id, _to: e._id} INTO sent 

頂点コレクションpeopleemailアドレスはemails頂点コレクションのfrom電子メールアドレスと一致しています。すべてのマッチについて、エッジコレクションsentに新しいエッジが挿入され、人と電子メールレコードがリンクされます。

両方の頂点コレクションに少数のドキュメントが含まれている場合は、インデックスなしでこのクエリを実行しても問題ありません(例:1,000人、メール3,000回、テストで約2秒かかります)。大規模なデータセットの場合は、email属性のpeopleにハッシュインデックスを作成し、fromのハッシュインデックスはemailsに作成してください。私のテストでは実行時間が約30msに短縮されました。

関連する問題