2017-09-10 3 views
1

gremlin-driverをJavaで使用すると、GraphTraversalの "sideEffect"を使用できません。WebSocketGremlinRequestEncoderは少なくとも1つのメッセージを生成する必要があります - janusgraph-dynamodb withRemoteを使用して "sideEffect"は機能しません。

graph = EmptyGraph.instance() 
cluster = Cluster.open("conf/remote-objects.yaml"); 
graphTraversalSource = graph.traversal().withRemote(DriverRemoteConnection.using(cluster)); 
sideEffectを使用しています

私のクエリは次のようになります。

AtomicLong level1 = new AtomicLong(0);  
graphTraversalSource.V().hasLabel("user") 
      .has("uuid", "1234") 
      .sideEffect(it -> it.get().property("level", level1.getAndIncrement())).emit().repeat(in()) 
      .until(loops().is(5)).valueMap("uuid", "name", "level"); 

私は依存関係としてjanusgraph-DynamoDBのストレージ・バックエンドを使用してJavaアプリケーション内グレムリン・サーバを実行しているとに接続されたときに動作するように使用されるこのクエリをdyamodb。私はEC2で実行しているサーバーをグレムリンへのリモート接続を使用してに切り替えたとき、私は、エラーメッセージの下になって始めた:私は上記のクエリからsideEffectの一部を削除した場合

java.util.concurrent.CompletionException: io.netty.handler.codec.EncoderException: WebSocketGremlinRequestEncoder must produce at least one message., took 3.895 sec 

、それが正常に動作します。私は本当にトラバース中にカスタムプロパティを追加し、それをデータベースに保存せずに結果に含める必要があります。

答えて

0

あなたにはいくつか問題があります。最初の問題は、リモートでラムダしようとしているということです。sideEffect() LambdaはGremlinバイトコードにシリアル化することはできません。少なくともあなたが提供した形式ではありません。 - 3.2.7/3.3.0で修正されます、私はそこの最後の行を動作させるために、コンソールにimport org.apache.tinkerpop.gremlin.util.function.*をインポートする必要がありました

gremlin> cluster = Cluster.open("conf/remote-objects.yaml") 
==>localhost/127.0.0.1:8182 
gremlin> g = graph.traversal().withRemote(DriverRemoteConnection.using(cluster)) 
==>graphtraversalsource[emptygraph[empty], standard] 
gremlin> g.addV('person').as('p').addE('link').to('p') 
==>e[1][0-link->0] 
gremlin> g.V().sideEffect(Lambda.function("it.get().property('level',1)")).valueMap() 
==>[level:[1]] 

注:ただし、これを行うことができます。だから、

、あなたはラムダそのように渡すことができますが、:

  1. 私はあなたのトラバーサルはあなたがlevel1でクライアントにローカル変数を参照しているので、以前のように動作するとは思わない - サーバーではありませんそれについて何かを知ることになる。
  2. TinkerPopはラムダを避けることをお勧めします。

私はあなたのGremlinがこれを解決する方法の提案をするために何をしているのかはよく分かりません。

トラバース中にカスタムプロパティを追加し、結果をデータベースに保存せずに結果に含めることが本当に必要です。

...しかし、上記のGremlinはlevel1という値をデータベースに書き込んでいるので、あなたが何をしているのか分かりません。

+0

ラムダ部分をクリアしていただきありがとうございます。 – monali01

+0

私のデータにはメンバータイプのユーザーがいて、すべてのユーザーをループして特定のタイプを見つけるときにカスタム変数「レベル」を増やそうとしています。「管理者」と言いましょう。ユーザーの1人が「管理者」でなく、彼を後援した親またはユーザーに深く関わっていない場合、ループを停止する - 彼は管理者ではないかもしれないが、彼の親は管理者であり、彼を得ることができる必要があるその場合は親です。また、私は彼らの注文を維持する必要があるので、私は "レベル" – monali01

関連する問題