

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

# Gremlin コードをデプロイするコンテキストでテストする
<a name="best-practices-gremlin-console-glv-differences"></a>

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

**スクリプトモード (文字列ベースの送信)**  
スクリプトモードでは、クライアントはクエリ全体をテキスト文字列としてサーバーに送信します。サーバーは、*ターミナルステップ*を含む完全な文字列を評価し、結果をクライアントにストリーミングします。次のツールとメソッドはスクリプトモードを使用します。
+ [Gremlin コンソール](access-graph-gremlin-console.md) – `:remote` コマンドを使用する場合
+ [Neptune グラフノートブック](graph-notebooks.md)
+ [AWS SDK または CLI AWS を使用した HTTP](access-graph-gremlin-rest.md)
+ 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](access-graph-gremlin-java.md)、[Python](access-graph-gremlin-python.md)、[Go](access-graph-gremlin-go.md)、[.NET](access-graph-gremlin-dotnet.md)、[JavaScript](access-graph-gremlin-node-js.md)、およびその他のサードパーティーの 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 では、[ターミナルステップ](https://tinkerpop.apache.org/docs/current/reference/#terminal-steps)は、評価のためにトラバーサルを Neptune に送信するステップです。バイトコードモードでは、ターミナルステップはドライバーをトリガーして、トラバーサルをシリアル化して送信します。スクリプトモードでは、ターミナルステップはサーバーで評価されるクエリ文字列の一部です。ターミナルステップは次のとおりです。
+ `hasNext()` – 結果が利用可能な`true`場合は を返します。`false`それ以外の場合は を返します。
+ `next()` – 次の結果を返します。結果が存在しない`NoSuchElementException`場合はスローされます。
+ `next(n)` – 次の {{n}} の結果をリストとして返します。
+ `toList()` – すべての結果をリストとして返します。結果が存在しない場合は、空のリストを返します。
+ `toSet()` – すべての結果をセットとして返します。結果が存在しない場合は、空のセットを返します。
+ `iterate()` – 結果を返すことなく、すべての結果を反復処理します。これは、戻り値を必要としないミューテーションに使用します。

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

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

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