翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Gremlin コードをデプロイするコンテキストでテストする
Gremlin は、クライアントがサーバーにクエリを送信する複数の方法を提供します。これらの送信モードは、クエリの評価方法とトランザクションの動作によって異なります。これらの違いは、あるモードで開発し、別のモードでデプロイすると、予期しない結果につながる可能性があります。
スクリプトモード (文字列ベースの送信)
スクリプトモードでは、クライアントはクエリ全体をテキスト文字列としてサーバーに送信します。サーバーは、ターミナルステップを含む完全な文字列を評価し、結果をクライアントにストリーミングします。次のツールとメソッドはスクリプトモードを使用します。
Gremlin コンソール –
:remoteコマンドを使用する場合TinkerPop ドライバーを使用したクエリ文字列の送信 (Java
client.submit("g.V().count()")での の使用など)
スクリプトモードでは、クライアントは次のようなクエリを完全な文字列としてサーバーに送信します。
// 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 エンジンバージョンに適した Java、Python、Go、.NET、JavaScript、およびその他のサードパーティーの 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 では、ターミナルステップ
hasNext()– 結果が利用可能なtrue場合は を返します。falseそれ以外の場合は を返します。next()– 次の結果を返します。結果が存在しないNoSuchElementException場合はスローされます。next(n)– 次のnの結果をリストとして返します。toList()– すべての結果をリストとして返します。結果が存在しない場合は、空のリストを返します。toSet()– すべての結果をセットとして返します。結果が存在しない場合は、空のセットを返します。iterate()– 結果を返すことなく、すべての結果を反復処理します。これは、戻り値を必要としないミューテーションに使用します。
注記
個々の言語GLVs は、実装に固有の追加のターミナルステップを提供する場合があります。詳細については、言語固有のページを参照してください。
コードを 1 つのコンテキストで開発してテストすると、問題が発生する可能性があります。たとえば、Gremlin コンソールはクエリをスクリプトとして送信します。バイトコードを使用する Java ドライバーなど、別のコンテキストでデプロイする場合、コードの動作が本番環境で異なる場合があります。
重要
予期しないトランザクション動作を避けるため、Gremlin コードをデプロイするのと同じ送信モードを使用してテストしてください。