1

私のgremlinクエリには、次のものがあります。

vert.as('x').
both.or(
  _().has("time").filter{ it.time.toInteger() > startTime.toInteger() },
  _().has("isRead"), _().has("isWrite")).dedup().gather.scatter.
store(y).loop('x'){c++ < limit.toInteger()}.iterate();

私のグレムリン スクリプトでは y を返しますが、y には明らかに頂点しかありません。頂点ごとにそれらを反復処理することで、手動で各エッジを手動で取得できますが、リスト y で返される他のノード間のエッジのみを含むリストを返す必要があります。

特に、データ構造内で返されたサブグラフをローカルで再作成できるようにする必要があるため、その情報を返すために gremlin が使用されています。これらのニーズに影響を与える私のユースケースに関するその他の詳細は、電球スクリプトを実行している rexster サーバーがネットワーク経由でデータをプッシュする必要があるため、各ノードエッジを手動で反復処理するのが遅すぎるという事実です。スクリプトを使用して最初に返された各頂点間のエッジのセットがない場合は、各エッジに沿って検出された各頂点をチェックして、最初に返されたセット内にあることを確認する必要があります。非常に理想的ではありません。

基本的に、結果は、返された頂点のいずれかを見たときに、返されたセット内でどの頂点がリンクされているかを知ることができるようなものでなければなりません。手動でのチェックやルックアップを行う必要はありません。単にデータセットにある必要があります。

編集1:

gremlin のツリー パイプライン機能は、私がやりたいことを正確に実行するのに非常に適していることがわかりました。問題は、ツリーを使用するようになったので、使用できる形式に戻す必要があることです...頂点またはエッジのいずれかしか返すことができないため、すぐにツリーを返すことはできません。

編集2:

espeedは正しいです。最初は bothE を使用する必要があります。しかし、いくつか満たしたい条件があります... 先ほどほぼ達成しましたが、フィルターを正しく機能させることができませんでした。

vert.as('l').
bothE.gather.scatter.as('edge').bothV.or(
  _().has("time").filter{ it.getProperty('time').toInteger() >= startTime.toInteger() },
  _().has("isRead"), _().has("isWrite")).
dedup().store(results).as('vertice').back('edge').store(results).back('vertice')
.loop('l'){c++ < limit.toInteger()}.iterate();

1 つのパイプラインで 2 つのバックを使用できない理由がわかりません (これで NullPointerException が発生します)。私が解決したい基本的な問題は、幅優先検索を実行し、上記のすべてを満たすノードのみを保存し、テストに合格したすべての頂点間のエッジを保存することです。

4

2 に答える 2

2

コードをあまりいじらずに、おそらく最も簡単な方法は次のとおりです。

results = [] as Set
vert.as('l').
bothE.as('e').gather.scatter.as('edge').bothV.or(
  _().has("time").filter{ it.getProperty('time').toInteger() >= startTime.toInteger()}.store(results),
  _().has("isRead"), _().has("isWrite")).store(results))
.sideEffect{e,m->results<<m.e}
.loop('l'){c++ < limit.toInteger()}.iterate();

Setステップを回避できるため、結果を宣言することに注意してくださいdedup。ステップで頂点をフィルタリングすると、基本的に頂点が保存されますor

于 2014-04-13T12:23:46.810 に答える