OrientDB では、各頂点に接続されたエッジが接続されています。これは、ネストされた「select」ステートメントを使用して、コレクションからノードを明示的にウォークできることを意味します。
例: ノード属性のパスを指定して、一致する終了ノードを見つけます。パスは、ノード属性のリストで構成されます (たとえば、kind
はパス内のノード内で一意です)。
さて、私が木を持っていたとします:
kind=site, name=site1
-- kind=project, name=project1
-- kind=library, name=library1
kind=site, name=site2
-- kind=project, name=project2
-- kind=library, name=library1
ユーザーは、次のパスを持つ library1 という名前のライブラリーから情報を取得したいと考えています。
[{kind=site},{kind=project,name=project1},{kind=library,name=library1}]
結果が単一のノードである限り、各ノードがトラバーサルに完全に修飾されていなくてもかまいません。
OrientDB では、プロセスは次のようになります。
- kind=site のすべてのノードから開始
- 「子」エッジを通り抜け、kind=project および name=project1 であるすべてのオブジェクトを収集します
- 子エッジをウォークスルーし、kind=library および name=library1 であるすべてのオブジェクトを収集します
これは、ネストされた select ステートメントで実行できます。kind フィールドにはインデックスが付けられているため、多数のオブジェクトから開始ノードがすばやく収集されます。パフォーマンスをさらに向上させるために、どの種類がどのテーブル (コレクション) にあるかを知っているので、選択するオブジェクトの数を絞り込むことができます (select from <table> where kind=site)。
ArrangoDB では、エッジのみがノード バインディング情報を持っているため、接続されたエッジを直接通過できないノードがあります。GRAPH_TRAVERSAL 関数では、例によって開始コレクションを指定できます。したがって、例は {kind=site} になります。それは、基本的にグラフ全体の各エッジの入力に接続されているすべてのノードを見て、すべてのグラフ エッジをスキャンして、ノードの開始リストを収集する必要があるということではないでしょうか?
エッジに接続されたオブジェクトのフルスキャンから開始する必要がないように、そのようなクエリを (AQL および/または arangojs で) どのように定式化しますか?
サンプル頂点をarangojsトラバーサル関数に送信する方法もわかりません。常に明示的な開始頂点が必要なようです。