0

ユーザーが Gremlin クエリを入力して、結果の D3 グラフを返すことができるクエリとグラフの視覚化フレームワークを実装しようとしています。D3 グラフは JSON を使用して構築されます。これは、Gremlin クエリからの個別の頂点エッジの出力を使用して作成されます。次のような単純なクエリの場合:

g.V.filter{it.attr_a == "foo"}

これはうまくいきます。ただし、次のようなより複雑なクエリを実行しようとすると:

g.E.filter{it.attr_a == 'foo'}.groupBy{it.attr_b}{it.outV.value}.cap.next().findAll{k,e->e.size()<=3}

- Find all instances of *value*
- Grouped by unique *attr_b*
- Where *attr_a* = foo
- And *attr_b* is paired with no more than 2 other instances of *value*

代わりに、出力は次の形式になります。

attr_b1: {value1, value2, value3}
attr_b2: {value4}
attr_b3: {value6, value7}

結果をグラフとして表示できるように、Gremlin が結果をノードとエッジのリストとして出力する方法があるかどうかを知りたいです。D3 コードを編集してこの新しい出力を取り込むことができることは認識していますが、現在、クエリのタイプ/複雑さに制限がないため、キー/値のペアが毎回同じになるとは限りません。

ありがとう。

4

1 に答える 1

1

あなたは、Gremlin の結果を視覚化する際の重要な問題の 1 つと私が考える問題にぶつかりました。それらは何でもかまいません。Gremlin の結果は、単なる頂点とエッジのリストではない場合があります。私が考えることができるこれを実際に制御する方法はありません。結局のところ、実際に視覚化できるのは、D3 が期待するパターンに一致する結果のみです。そのパターンを検出し、そのような場合にのみ視覚化することから始めます (単に、認識されていないパターンを JSON として表示するだけです)。

次のような結果になる特定の例を考えてみます。

attr_b1: {value1, value2, value3}
attr_b2: {value4}
attr_b3: {value6, value7}

D3にそこに何を視覚化してもらいたいですか? その結果を得るためにトラバースされた頂点/エッジは? もしそうなら、あなたは立ち往生しているかもしれません。Gremlin には、パイプラインをイントロスペクトして何が通過しているかを確認する方法はありません。つまり、パイプライン内で触れられた頂点とエッジをユーザーが明示的に収集しない限り、それらにアクセスすることはできません。このようにパイプラインを「スパイ」できると便利ですが、現時点ではそうではありません。これに役立つ新しい種類のパイプライン実装を作成するために、TinkerPop 内で内部議論が行われましたが、現時点では存在しません。

したがって、「スパイ」機能がなければ、唯一の回避策は次のようになると思います。

  1. クライアント側で頂点/エッジ リストを検出し、d3 でそれらのみをレンダリングします。これにより、視覚化が必要な場合、ユーザーは常にそのような形式でデータを返すグレムリンを作成する必要がありました。ユーザーの手に委ねます。
  2. 結果がビジュアライゼーション エンジンによって期待されるものと一致しない場合に、ユーザーが頂点/エッジに明示的に副作用を与えることができる頂点/エッジのリストのサーバー側バインディングを提供する可能性があります。繰り返しますが、視覚化が必要な場合、ユーザーは必要に応じてグレムリンを適切に作成する必要があります。
于 2013-12-16T13:45:59.173 に答える