本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在您將部署 Girmlin 程式碼的內容中測試該程式碼
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) 在本機建置周遊物件。驅動程式會將周遊步驟序列化為位元組碼,並將其傳送至伺服器。在用戶端.next()執行 .toList()或 等終端步驟,以反覆查看伺服器傳回的結果。您可以搭配適用於所用 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可能會提供其實作專屬的其他終端步驟。如需詳細資訊,請參閱特定語言頁面。
如果您在一個內容中開發和測試程式碼,可能會遇到問題。例如,Gremlin 主控台會將查詢提交為指令碼。如果您在不同的內容中部署程式碼,例如透過使用位元組碼的 Java 驅動程式,您的程式碼在生產環境中的行為可能會有所不同。
重要
請務必使用將部署的相同提交模式來測試 Gremlin 程式碼,以避免意外的交易行為。