2

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

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

たとえば、電子メール メッセージをコレクションにインポートし、人を別のコレクションにインポートした場合、電子メールとコレクションの間にエッジを生成したいと考えています。電子メールのスキーマは次のようになります。

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

個人のスキーマは次のようになります。

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

from電子メール メッセージのおよびフィールドの値がto、 people コレクションにある可能性のある電子メール アドレスに対応しているとします。

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

これまでのところ、Foxx がこれに最適なツールであると考えていますが、ドキュメントには少し圧倒されています。

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

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

これを行う Foxx サービスは既にありますか? そうでない場合、どこから作成を開始すればよいですか?

4

1 に答える 1

3

単一の AQL クエリで十分です。

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

email頂点コレクション内のアドレスは、頂点コレクションの電子メール アドレスとpeople照合されます。一致するたびに、新しいエッジがエッジ コレクションに挿入され、人物と電子メール レコードがリンクされます。fromemailssent

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

于 2016-08-17T10:31:28.217 に答える