View a markdown version of this page

在您將部署 Girmlin 程式碼的內容中測試該程式碼 - Amazon Neptune

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

在您將部署 Girmlin 程式碼的內容中測試該程式碼

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) 在本機建置周遊物件。驅動程式會將周遊步驟序列化為位元組碼,並將其傳送至伺服器。在用戶端.next()執行 .toList()或 等終端步驟,以反覆查看伺服器傳回的結果。您可以搭配適用於所用 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可能會提供其實作專屬的其他終端步驟。如需詳細資訊,請參閱特定語言頁面。

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

重要

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