本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Neptune 中的 Gremlin 標準合規
以下各節提供 Gremlin 的 Neptune 實作概觀,以及其與 Apache TinkerPop 實作的差異。
Neptune 會在其引擎中以原生方式實作一些 Gremlin 步驟,並使用 Apache TinkerPop Gremlin 實作來處理其他步驟 (請參閱 Amazon Neptune 的原生 Gremlin 步驟支援)。
注意
如需 Gremlin 主控台和 Amazon Neptune 中所顯示實作差異的一些具體範例,請參閱快速入門的 使用 Gremlin 存取 Amazon Neptune 中的圖形資料 一節。
主題
Gremlin 的適用標準
Gremlin 語言是由 Apache TinkerPop Documentation
和 Gremlin 的 Apache TinkerPop 實作定義,而不是由型式規格定義。 對於數值格式,Gremlin 遵循 IEEE 754 標準 (IEEE 754-2019 - 浮點數運算的 IEEE 標準
。如需詳細資訊,另請參閱 Wikipedia IEEE 754 頁面 )。
指令碼中的變數和參數
如果與預先繫結的變數有關,則周遊物件 g 在 Neptune 中是預先繫結的,而且不支援 graph 物件。
雖然 Neptune 不支援指令碼中的 Gremlin 變數或參數化,但是您可能經常會在網際網路上遇到 Gemlin 伺服器的範例指令碼,其中包含變數宣告,例如:
String query = "x = 1; g.V(x)"; List<Result> results = client.submit(query).all().get();
在提交查詢時,還有許多使用參數化
Map<String,Object> params = new HashMap<>(); params.put("x",1); String query = "g.V(x)"; List<Result> results = client.submit(query).all().get();
參數範例通常與警告相關聯,這些警告關於盡可能不參數化所產生的效能損失。對於 TinkerPop,您可能會遇到很多這樣的範例,而且關於需要參數化,它們聽起來都非常有說服力。
不過,變數宣告功能和參數化功能 (以及警告) 只在使用 GremlinGroovyScriptEngine 時才適用於 TinkerPop 的 Grimlin 伺服器。當 Gremlin 伺服器使用 Gramlin 的 gremlin-language ANTLR 文法來解析查詢時,它們不適用。ANTLR 語法不支援變數宣告或參數化,因此在使用 ANTLR 時,您不必擔心無法參數化。因為 ANTLR 文法是 TinkerPop 的較新元件,因此您在網際網路上可能遇到的較舊內容通常不會反映這種差異。
Neptune 會在其查詢處理引擎中使用 ANTLR 文法,而不是 GremlinGroovyScriptEngine,因此它不支援變數或參數化或 bindings 屬性。因此,與無法參數化有關的問題不適用於 Neptune。使用 Neptune,只需在通常參數化的位置按原狀提交查詢就非常安全。因此,前面的範例可以簡化,而不會造成任何效能損失,如下所示:
String query = "g.V(1)"; List<Result> results = client.submit(query).all().get();
指令碼執行
Neptune 的 Gremlin 引擎會使用 TinkerPop 的 gremlin-language ANTLR 文法剖析查詢。它不會執行 GremlinGroovyScriptEngine(如同某些 TinkerPop 型 Gremlin Server 部署),因此提交至 Neptune 的指令碼必須僅包含 Gremlin 語言,而非任意 Groovy 或 Java 程式碼。
指令碼可以透過各種方式傳送至 Neptune,例如透過 Gremlin REST 端點、Gremlin 主控台,或透過 TinkerPop 語言驅動程式 (例如 Java 驅動程式的指令碼用戶端
重要的是,不要將 Gremlin 語言本身與您可能已在其他地方看到包裝 Gremlin 範例的任何程式設計語言的語法糖或一般用途函數混淆。當這類程式碼出現在 TinkerPop 教學課程或線上範例時,取決於 Neptune 未提供的 Groovy 或 Java 執行時間。
重要
本節中的所有內容都適用於文字字串 Gremlin 提交。以 Java、Python 或 .NET 等主機語言建置的 GLV (Gremlin Language Variant) 位元組程式碼提交不受這些限制,因為主機語言周遊建置器會產生 Neptune 引擎直接使用的位元組碼。
指令碼可能包含的內容
-
所有查詢開頭必須為周遊物件
g。 -
可以在單一提交中發出多個周遊,並以分號 (
;) 或換行字元 () 分隔\n。最後一個 以外的每個陳述式都必須以要執行.iterate()的步驟結尾;只會傳回最終周遊的資料。
參考 TinkerPop 列舉值
當 TinkerPop 列舉值預期為步驟引數時 (例如, 上的基數property()或 上的順序by()),請使用 ANTLR 文法辨識的短格式值。Neptune 不會在此位置解析完全合格的 Java 類別名稱,例如org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single,不接受 ;請single改用 。
下表列出允許的短格式值,以及每個值所屬的基礎 TinkerPop 類別。
| 允許值 | 類別 |
|---|---|
id, 金鑰, label, value |
|
T.id, T.key, T.label, T.value |
|
set, single |
org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality |
asc, desc, shuffle |
|
Order.asc, Order.desc, Order.shuffle |
|
全域, 本機 |
|
Scope.global, Scope.local |
|
全部, first, last, mixed |
|
normSack |
org.apache.tinkerpop.gremlin.process.traversal.SackFunctions.Barrier |
addAll, 及, assign, div,
max, min, minus, mult,
或, sum, sumLong |
|
keys, values |
|
BOTH, IN, OUT |
|
any, 無 |
org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent.Pick |
指令碼可能不包含的內容
Neptune 的文字字串 Gremlin 查詢不支援下列項目,因為它們依賴 Neptune 不提供的 Groovy 或 Java 執行期支援:
-
開頭不是 的 Groovy 陳述式
g。其中包含:算術表達式,例如
1 + 1系統呼叫,例如
System.nanoTime()變數宣告,例如
x = 1; g.V(x)
-
支援的 Gremlin APIs以外的 Java 方法或程式庫呼叫。例如,不允許
java.lang.*、Date()和g.V().tryNext().orElseGet(...)。 -
以 Java 類型做為引數的 Gremlin 方法。這些只能從 JVM 語言主機連線,無法從文字字串提交連線。範例:
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.program(org.apache.tinkerpop.gremlin.process.computer.VertexProgram)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.sideEffect(java.util.function.Consumer)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.from(org.apache.tinkerpop.gremlin.structure.Vertex)org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.to(org.apache.tinkerpop.gremlin.structure.Vertex)
例如,下列周遊無法提交為文字字串:
g.V().addE('something').from(__.V().next()).to(__.V().next())。
元素上的屬性
Neptune 不支援在 TinkerPop 3.7.0 中引入的materializeProperties旗標,以傳回 元素上的屬性。因此,Neptune 仍然只會傳回頂點或邊緣做為參考,只有其 id和 label。
工作階段
Neptune 中的工作階段僅限持續 10 分鐘。如需更多資訊,請參閱 Gremlin 指令碼型工作階段和 TinkerPop 工作階段參考
交易
Neptune 會在每個 Gremlin 周遊開始時開啟新交易,並在周遊成功完成時關閉交易。發生錯誤時交易將還原。
以分號 (;) 或換行符號字元 (\n) 分隔的多重陳述式包含在單一交易內。除了最後一個以外的每個陳述式結尾必須為要執行的 next() 步驟。只有最後的周遊資料會傳回。
使用 tx.commit() 和 tx.rollback() 的手動交易邏輯不受支援。
重要
這「只」適用於以「文字字串」傳送 Gremlin 查詢的方法 (請參閱 Gremlin 交易)。
頂點和邊緣 ID
Neptune Gremlin 頂點和邊緣 ID 必須為 String 類型。這些 ID 字串支援 Unicode 字元,且大小不能超過 55 MB。
使用者提供的 ID 受到支援,但它們在正常使用狀況下為選用。如果您在新增頂點或邊緣時未提供 ID,Neptune 會產生 UUID 並將其轉換為字串,格式如下:"48af8178-50ce-971a-fc41-8c9a954cea62"。這些 UUID 不符合 RFC 標準,因此,如果您需要標準 UUID,則應在外部產生它們,並在您新增頂點或邊緣時提供它們。
注意
不過,Neptune Load 命令要求您使用 Neptune CSV 格式的 ~id 欄位提供 ID。
使用者提供的 ID
使用者提供的 ID 允許使用在 Neptune Gremlin,條文如下。
提供的 ID 是選用的。
僅支援頂點和邊緣。
僅支援
String類型。
若要建立使用自訂 ID 的新頂點,請使用 property 步驟搭配 id 關鍵字:g.addV().property(id, 'customid')。
注意
不要將引號放在 id 關鍵字旁邊。它指的是 T.id。
所有的頂點 ID 必須各不相同,且所有的邊緣 ID 必須各不相同。不過,Neptune 確實允許頂點和邊緣具有相同的 ID。
如果您嘗試使用 g.addV() 建立新頂點,而使用該 ID 的頂點已存在,則操作會失敗。例外狀況為,如果您為頂點指定新的標籤,操作即會成功,但會將新標籤及指定的任何其他屬性新增至現有的頂點。不會覆寫任何項目。此舉不會建立新的頂點。頂點 ID 將維持不變,仍保有其唯一性。
例如,以下的 Gremlin 主控台命令會成功:
gremlin> g.addV('label1').property(id, 'customid') gremlin> g.addV('label2').property(id, 'customid') gremlin> g.V('customid').label() ==>label1::label2
頂點屬性 ID
Vertex 屬性 ID 將自動產生,且查詢時可顯示為正數或負數。
頂點屬性的基數
Neptune 支援成組基數和單一基數。如未指定,則選取設定基數。這表示,如果您設定屬性值,它將新增新的值至屬性,但前提是其不能出現在值組內。此為 Set
不支援 List。如需屬性基數的詳細資訊,請參閱 Gremlin JavaDoc 中的 Vertex
更新頂點屬性
若要更新屬性值,而不新增額外的值給值組,請在 property 步驟中指定 single 基數。
g.V('exampleid01').property(single, 'age', 25)
這會移除屬性所有現有的值。
標籤
Neptune 支援頂點的多個標籤。當您建立標籤時,您可以指定多重標籤並用 :: 分隔。例如,g.addV("Label1::Label2::Label3") 將新增有三種不同標籤的頂點。hasLabel 步驟將比對此頂點和這三個標籤:hasLabel("Label1")、hasLabel("Label2") 和 hasLabel("Label3")。
重要
:: 分隔符號僅針對本用途保留。您不能在 hasLabel 步驟中指定多重標籤。例如,hasLabel("Label1::Label2") 不符合任何內容。
逸出字元
Neptune 會解析所有逸出字元,如 Apache Groovy 語言文件的逸出特殊字元
序列化
Neptune 根據請求的 MIME 類型支援下列序列化。
透過 Neptune,您可以使用 TinkerPop 提供的許多序列化程式,並支援 GraphSON 和 GraphBinary 的各種版本和組態。如需目前支援的序列化程式,請參閱下表。雖然存在許多選項,但要使用的指引非常簡單:
-
如果您使用的是 Apache TinkerPop 驅動程式,則偏好驅動程式的預設值,而不明確指定一個驅動程式。除非您有非常具體的原因,否則您可能不需要在驅動程式初始化中指定序列化程式。一般而言,驅動程式使用的預設值為
application/vnd.graphbinary-v1.0。 -
如果您是透過 HTTP 連線至 Neptune,請優先使用
application/vnd.gremlin-v3.0+json;types=false做為替代 GraphSON 3 版本中的內嵌類型,讓使用 變得複雜。 -
application/vnd.graphbinary-v1.0-stringd通常只有在與 Gremlin 主控台搭配使用時才有用,因為它會將所有結果轉換為字串表示法以簡單顯示。 -
由於傳統原因,其餘格式仍然存在,通常不應在沒有明確原因的情況下與驅動程式搭配使用。
| MIME type | Serialization | Configuration |
|
GraphSONUntypedMessageSerializerV1 |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1】 |
|
GraphSONMessageSerializerV2 |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2】 |
|
GraphSONUntypedMessageSerializerV2 |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2】 |
|
GraphSONMessageSerializerV3 |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3】 |
|
GraphSONUntypedMessageSerializerV3 |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3】 |
|
GraphSONUntypedMessageSerializerV3 |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1】 |
|
GraphBinaryMessageSerializerV1 |
|
|
GraphBinaryMessageSerializerV1 |
serializeResultToString: true |
|
GraphSONMessageSerializerGremlinV1 |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1】 |
|
GraphSONMessageSerializerV2 (only works with WebSockets) |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2】 |
|
GraphSONMessageSerializerV3 |
|
|
GraphSONMessageSerializerV3 |
ioRegistries:【org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3】 |
|
GraphBinaryMessageSerializerV1 |
|
注意
此處顯示的序列化程式資料表是指截至 TinkerPop 3.7.0 的命名。如果您想要進一步了解此變更,請參閱 TinkerPop 升級文件
Lambda 步驟
Neptune 不支援 Lambda 步驟。
不支援的 Gremlin 步驟
Neptune 不支援以下 Gremlin 步驟:
Neptune 中僅部分支援 Gremlin io( ) 步驟
。您可以在讀取內容中使用它,如 中所示 g.io("https://example.com/data/my-graph.graphml").read(),但無法使用它來寫入。若要讀取您存放為 Amazon S3 物件的檔案,請先產生預先簽章的 URL。然後將該 HTTPS URL 傳遞至g.io()。如需預先簽章 URLs 的詳細資訊,請參閱《Amazon S3 使用者指南》中的使用預先簽章 URLs 下載和上傳物件。
Neptune 中的 Gremlin 圖形功能
Gremlin 的 Neptune 實作不會公開 graph 物件。下表列出 Grimlin 功能,並指出 Neptune 是否支持它們。
Neptune 對 graph 功能的支援
Neptune 圖形功能 (如果支援) 與 graph.features() 命令將傳回的功能相同。
| 圖形功能 | 已啟用? |
|---|---|
交易 |
true |
ThreadedTransactions |
false |
Computer |
false |
Persistence |
true |
ConcurrentAccess |
true |
Neptune 對變數功能的支援
| 變數功能 | 已啟用? |
|---|---|
Variables |
false |
SerializableValues |
false |
UniformListValues |
false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
false |
ByteValues |
false |
DoubleValues |
false |
FloatValues |
false |
IntegerValues |
false |
LongValues |
false |
MapValues |
false |
MixedListValues |
false |
StringValues |
false |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |
Neptune 對頂點功能的支援
| 頂點功能 | 已啟用? |
|---|---|
MetaProperties |
false |
DuplicateMultiProperties |
false |
AddVertices |
true |
RemoveVertices |
true |
MultiProperties |
true |
UserSuppliedIds |
true |
AddProperty |
true |
RemoveProperty |
true |
NumericIds |
false |
StringIds |
true |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Neptune 對頂點屬性功能的支援
| 頂點屬性功能 | 已啟用? |
|---|---|
UserSuppliedIds |
false |
AddProperty |
true |
RemoveProperty |
true |
NumericIds |
true |
StringIds |
true |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Properties |
true |
SerializableValues |
false |
| UniformListValues | false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
true |
ByteValues |
true |
DoubleValues |
true |
FloatValues |
true |
IntegerValues |
true |
LongValues |
true |
MapValues |
false |
MixedListValues |
false |
StringValues |
true |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |
Neptune 對邊緣功能的支援
| 邊緣功能 | 已啟用? |
|---|---|
AddEdges |
true |
RemoveEdges |
true |
UserSuppliedIds |
true |
AddProperty |
true |
RemoveProperty |
true |
NumericIds |
false |
StringIds |
true |
UuidIds |
false |
CustomIds |
false |
AnyIds |
false |
Neptune 對邊緣屬性功能的支援
| 邊緣屬性功能 | 已啟用? |
|---|---|
Properties |
true |
SerializableValues |
false |
UniformListValues |
false |
BooleanArrayValues |
false |
DoubleArrayValues |
false |
IntegerArrayValues |
false |
StringArrayValues |
false |
BooleanValues |
true |
ByteValues |
true |
DoubleValues |
true |
FloatValues |
true |
IntegerValues |
true |
LongValues |
true |
MapValues |
false |
MixedListValues |
false |
StringValues |
true |
ByteArrayValues |
false |
FloatArrayValues |
false |
LongArrayValues |
false |