3

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トラバーサル関数に送信する方法もわかりません。常に明示的な開始頂点が必要なようです。

4

1 に答える 1

1

このようなジョブを念頭に置いて、ArangoDB 2.8 (現在は後期ベータ版) でリリースされる予定の新しいAQL グラフ トラバーサルを設計しました。

最後の点に関しては 、コレクションとグラフ内のそれらの関係を知っている名前付きグラフを使用して、関連するコレクションを識別します。named graphsしたがって、使用すると仮定します。

arangosh で ArangoDB 2.8 サンプル グラフの 1 つを使用してみましょう。

var examples = require("org/arangodb/graph-examples/example-graph.js");
var graph = examples.loadGraph("traversalGraph");

コレクション内に通気口があり、circlesコレクション内の頂点を接続するエッジがありedgesます。

db.circles.toArray();
db.edges.toArray();

FILTERトラベサルの深さと組み合わせてステートメントを使用して、実行の早い段階でグラフ ブランチのトラバーサルをプルーニングできるようになりました。

ここでは、トラバーサルの最初のレイヤーにある頂点の属性をフィルター処理します。

db._query("FOR v, e, p IN 1..3 " + 
              "OUTBOUND 'circles/A' " + 
              "GRAPH 'traversalGraph' " + 
              "FILTER p.vertices[1]._key != 'G' RETURN v._key");

同様の方法でエッジの属性をフィルタリングすることもできます。

db._query("FOR v, e, p IN 1..3 "
          "OUTBOUND 'circles/A' " +
          "GRAPH 'traversalGraph' " + 
          "FILTER p.edges[0].label != 'right_foo' RETURN v._key");

AQL グラフ トラバーサルの章にも詳細な説明があり、トラバーサーがグラフをどのように走査するかについて説明しています。

于 2016-01-12T10:43:44.793 に答える