View a markdown version of this page

Gremlin コードをデプロイするコンテキストでテストする - Amazon Neptune

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Gremlin コードをデプロイするコンテキストでテストする

Gremlin は、クライアントがサーバーにクエリを送信する複数の方法を提供します。これらの送信モードは、クエリの評価方法とトランザクションの動作によって異なります。これらの違いは、あるモードで開発し、別のモードでデプロイすると、予期しない結果につながる可能性があります。

スクリプトモード (文字列ベースの送信)

スクリプトモードでは、クライアントはクエリ全体をテキスト文字列としてサーバーに送信します。サーバーは、ターミナルステップを含む完全な文字列を評価し、結果をクライアントにストリーミングします。次のツールとメソッドはスクリプトモードを使用します。

スクリプトモードでは、クライアントは次のようなクエリを完全な文字列としてサーバーに送信します。

// Script mode – the entire string, including .next(), is sent to the server // V('non-existing-id') yields nothing because no vertex with that ID exists Cluster cluster = Cluster.build().addContactPoint("your-neptune-endpoint") .port(8182).enableSsl(true).create(); Client client = cluster.connect(); client.submit("g.V('existing-id').addV('person').V('non-existing-id').next()");

サーバーは、 を含む完全なクエリを評価します.next()。が結果.next()を見つけられない場合、サーバーは を生成NoSuchElementExceptionし、トランザクションはロールバックします

バイトコードモード (GLV トラバーサルオブジェクト)

バイトコードモードでは、クライアントは Gremlin 言語バリアント (GLV) を使用してトラバーサルオブジェクトをローカルに構築します。ドライバーはトラバーサルステップをバイトコードとしてシリアル化し、サーバーに送信します。.toList() や などのターミナルステップをクライアント側.next()実行して、サーバーから返された結果を反復処理します。バイトコードモードは、使用する Neptune エンジンバージョンに適した JavaPythonGo.NETJavaScript、およびその他のサードパーティーの TinkerPop 準拠ドライバーで使用できます。

バイトコードモードでは、同じクエリは次のようになります。

// Bytecode mode – the driver sends the traversal steps as bytecode // .next() executes on the client to iterate results Cluster cluster = Cluster.build().addContactPoint("your-neptune-endpoint") .port(8182).enableSsl(true).create(); GraphTraversalSource g = traversal().withRemote( DriverRemoteConnection.using(cluster)); g.V("existing-id").addV("person").V("non-existing-id").next();

ドライバーは、トラバーサルステップ (g.V().addV().V()) のみをバイトコードとして送信します。サーバーはトラバーサルを正常に評価し、トランザクションをコミットして、結果セットを返します。次に、クライアントは.next()ローカルで を呼び出して結果セットから読み取ります。結果セットが空の場合、クライアントは を生成しますがNoSuchElementException、トランザクションはすでにサーバーにコミットされています

トランザクション動作の違い

これらのモードの重要な違いは、ターミナルステップがトランザクションに与える影響です。

  • スクリプトモード – サーバーはターミナルステップを評価します。結果セットが空であるために のようなターミナルステップが.next()失敗した場合、サーバーはクエリを失敗として扱い、トランザクションをロールバックします。サーバーは、同じトラバーサル ( など) にミューテーションを保持しませんaddV()

  • バイトコードモード – クライアントはターミナルステップを評価します。サーバーはトラバーサルステップのみを評価し、トランザクションを正常にコミットして、結果を返します。クライアントが空の結果セット.next()で を呼び出すと、結果としてNoSuchElementExceptionクライアント側のエラーのみが発生します。トランザクションは既にコミットされているため、サーバーミューテーションを保持します。

ターミナルステップ

Gremlin では、ターミナルステップは、評価のためにトラバーサルを Neptune に送信するステップです。バイトコードモードでは、ターミナルステップはドライバーをトリガーして、トラバーサルをシリアル化して送信します。スクリプトモードでは、ターミナルステップはサーバーで評価されるクエリ文字列の一部です。ターミナルステップは次のとおりです。

  • hasNext() – 結果が利用可能なtrue場合は を返します。falseそれ以外の場合は を返します。

  • next() – 次の結果を返します。結果が存在しないNoSuchElementException場合はスローされます。

  • next(n) – 次の n の結果をリストとして返します。

  • toList() – すべての結果をリストとして返します。結果が存在しない場合は、空のリストを返します。

  • toSet() – すべての結果をセットとして返します。結果が存在しない場合は、空のセットを返します。

  • iterate() – 結果を返すことなく、すべての結果を反復処理します。これは、戻り値を必要としないミューテーションに使用します。

注記

個々の言語GLVs は、実装に固有の追加のターミナルステップを提供する場合があります。詳細については、言語固有のページを参照してください。

コードを 1 つのコンテキストで開発してテストすると、問題が発生する可能性があります。たとえば、Gremlin コンソールはクエリをスクリプトとして送信します。バイトコードを使用する Java ドライバーなど、別のコンテキストでデプロイする場合、コードの動作が本番環境で異なる場合があります。

重要

予期しないトランザクション動作を避けるため、Gremlin コードをデプロイするのと同じ送信モードを使用してテストしてください。