

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在您將部署 Girmlin 程式碼的內容中測試該程式碼
<a name="best-practices-gremlin-console-glv-differences"></a>

Gremlin 提供多種方式，可讓用戶端將查詢提交至伺服器。這些提交模式在查詢的評估方式和交易行為方面有所不同。如果您在一個模式中開發並部署到另一個模式中，這些差異可能會導致非預期的結果。

**指令碼模式 （以字串為基礎的提交）**  
在指令碼模式中，用戶端會以文字字串的形式將整個查詢傳送至伺服器。伺服器會評估完整的字串，包括任何*終端步驟*，並將結果串流回用戶端。下列工具和方法使用指令碼模式：
+ [Gremlin 主控台](access-graph-gremlin-console.md) – 使用 `:remote`命令時
+ [Neptune 圖形筆記本](graph-notebooks.md)
+ [HTTP 搭配 AWS SDK 或 AWS CLI](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) 在本機建置周遊物件。驅動程式會將周遊步驟序列化為位元組碼，並將其傳送至伺服器。在*用戶端*`.next()`執行 `.toList()`或 等終端步驟，以反覆查看伺服器傳回的結果。您可以搭配適用於所用 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可能會提供其實作專屬的其他終端步驟。如需詳細資訊，請參閱特定語言頁面。

如果您在一個內容中開發和測試程式碼，可能會遇到問題。例如，Gremlin 主控台會將查詢提交為指令碼。如果您在不同的內容中部署程式碼，例如透過使用位元組碼的 Java 驅動程式，您的程式碼在生產環境中的行為可能會有所不同。

**重要**  
請務必使用將部署的相同提交模式來測試 Gremlin 程式碼，以避免意外的交易行為。