Amazon Neptune 中的 Gremlin 標準合規 - Amazon Neptune

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

Amazon Neptune 中的 Gremlin 標準合規

以下各節提供了 Gremlin 的 Neptune 實作概觀,以及它與 Apache TinkerPop 實作的不同之處。

Neptune 在其引擎中以原生方式實現了一些小鬼步驟,並使用 Apache TinkerPop Grimlin 實現來處理其他步驟(請參閱)。Amazon Neptune 的原生 Gremlin 步驟支援

注意

如需 Gremlin 主控台和 Amazon Neptune 中所顯示實作差異的一些具體範例,請參閱快速入門的 使用 Gremlin 存取 Amazon Neptune 中的圖形 一節。

Gremlin 的適用標準

指令碼中的變數和參數

如果與預先繫結的變數有關,則周遊物件 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 子,你可能會遇到,他們都聽起來很有說服力的需要參數化。

但是,變數宣告功能和參數化功能 (以及警告) 都只適用於使用. TinkerPop GremlinGroovyScriptEngine 當 Gramlin 服務器使用 G gremlin-language ANTLR ramlin 的語法解析查詢時,它們不適用。ANTLR語法不支持變量聲明或參數化,因此在使用時ANTLR,您不必擔心無法參數化。由於ANTLR語法是較新的元件 TinkerPop,因此您在網際網路上可能遇到的較舊內容通常不會反映這種差異。

Neptune 在其查詢處理引擎中使用ANTLR語法,而不是使用語法GremlinGroovyScriptEngine,因此它不支援變數或參數化或屬性。bindings因此,與無法參數化有關的問題不適用於 Neptune。使用 Neptune,只需在通常參數化的位置按原狀提交查詢就非常安全。因此,前面的範例可以簡化,而不會造成任何效能損失,如下所示:

String query = "g.V(1)"; List<Result> results = client.submit(query).all().get();

TinkerPop 枚舉

Neptune 不支援列舉值的完全合格類別名稱。例如,您必須在 Groovy 請求中使用 single,而不是 org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single

列舉類型由參數類型決定。

下表顯示允許的列舉值和相關的 TinkerPop 完整名稱。

Java 程式碼

Neptune 不支持調用除了支持的小靈以外的任意 Java 或 Java 庫調用定義的方法APIs。例如,不允許 java.lang.*Date()g.V().tryNext().orElseGet()

元素上的屬性

Neptune 不支持 TinkerPop 3.7.0 中引入的materializeProperties標誌以返回元素的屬性。其結果是,Neptune 仍然只返回頂點或邊作為引用只是他們的idlabel

指令碼執行

所有查詢開頭必須為周遊物件 g

在字串查詢提交中,您可以發出多重周遊,並以分號 (;) 或換行符號字元 (\n) 分隔。若要執行,除了最後一個以外的每個陳述式結尾必須是 .iterate() 步驟。只有最後的周遊資料會傳回。請注意,這不適用於查GLV ByteCode 詢提交。

工作階段

Neptune 中的工作階段僅限持續 10 分鐘。如需詳細Gremlin 指令碼型工作階段資訊,請參閱〈TinkerPop工作階段參考〉。

交易

Neptune 會在每個 Gremlin 周遊開始時開啟新交易,並在周遊成功完成時關閉交易。發生錯誤時交易將還原。

以分號 (;) 或換行符號字元 (\n) 分隔的多重陳述式包含在單一交易內。除了最後一個以外的每個陳述式結尾必須為要執行的 next() 步驟。只有最後的周遊資料會傳回。

使用 tx.commit()tx.rollback() 的手動交易邏輯不受支援。

重要

這「只」適用於以「文字字串」傳送 Gremlin 查詢的方法 (請參閱 Gremlin 交易)。

頂點和邊 IDs

Neptune 小鬼頂點和邊緣IDs必須是類型。String這些 ID 字串支援 Unicode 字元,且大小不能超過 55 MB。

支持用戶提IDs供的,但在正常使用中它們是可選的。如果在添加頂點或邊緣時未提供 ID,Neptune 會生成一個UUID並將其轉換為字符串,形式如下所示:"48af8178-50ce-971a-fc41-8c9a954cea62"。這些UUIDs不符合RFC標準,因此,如果您需要標準UUIDs,則應在外部生成它們,並在添加頂點或邊時提供它們。

注意

Neptune Load 命令要求您使IDs用 Neptune CSV 格式的 ~id 欄位提供。

使用者提供 IDs

在 Neptune Gemlin 中允許用戶提供IDs,具有以下規定。

  • 提供IDs的是可選的。

  • 僅支援頂點和邊緣。

  • 僅支援 String 類型。

若要建立使用自訂 ID 的新頂點,請使用 property 步驟搭配 id 關鍵字:g.addV().property(id, 'customid')

注意

不要將引號放在 id 關鍵字旁邊。它指的是 T.id

所有頂點IDs必須是唯一的,且所有邊IDs必須是唯一的。不過,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

頂點屬性 IDs

頂點屬性IDs是自動生成的,並且在查詢時可以顯示為正數或負數。

頂點屬性的基數

Neptune 支援成組基數和單一基數。如未指定,則選取設定基數。這表示,如果您設定屬性值,它將新增新的值至屬性,但前提是其不能出現在值組內。此為 Set 的 Gremlin 列舉值。

不支援 List。如需有關屬性基數的詳細資訊,請參閱 Grimlin 中的頂點主題。 JavaDoc

更新頂點屬性

若要更新屬性值,而不新增額外的值給值組,請在 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 語言文件的逸出特殊字元一節所述。

Groovy 限制

Neptune 不支援開頭不是 g 的 Groovy 命令。這包括數學 (例如 1+1)、系統呼叫 (例如 System.nanoTime()) 和變數定義 (例如 1+1)。

重要

Neptune 不支援完整的類別名稱。例如,您必須在 Groovy 請求中使用 single,而不是 org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single

序列化

Neptune 支持基於請求的MIME類型以下序列化。

MIME類型 序列化 組態

application/vnd.gremlin-v1.0+json

GraphSONMessageSerializerV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v1.0+json;types=false

GraphSONUntypedMessageSerializerV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerV2 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v2.0+json;types=false

GraphSONUntypedMessageSerializerV2 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/vnd.gremlin-v3.0+json;types=false

GraphSONUntypedMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/json

GraphSONUntypedMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1

application/vnd.graphbinary-v1.0-stringd

GraphBinaryMessageSerializerV1 serializeResultToString: true

application/vnd.gremlin-v1.0+json

GraphSONMessageSerializerGremlinV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerV2(僅適用於 WebSockets) ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3

application/json

GraphSONMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1

雖然 Neptune 支援這些不同的序列化器類型,但其使用指引非常簡單。如果您要連接到 NeptuneHTTP,請優先考慮使用 Graph SON 3 替代版本中的嵌入式類型,application/vnd.gremlin-v3.0+json;types=false因此使用起來很複雜。如果您使用的是 Apache TinkerPop 驅動程式,您可能不需要像使用預設值那樣做任何選擇application/vnd.graphbinary-v1.0。通常只有在與 Gramlin 控制台一起使用時才有用,因為它將所有結果轉換為簡單顯application/vnd.graphbinary-v1.0-stringd示的字符串表示。由於舊有原因,剩餘的格式仍然存在。

注意

此處顯示的序列化程序表是指從 TinkerPop 3.7.0 開始命名。如果您想進一步了解此變更,請參閱TinkerPop 升級文件。Gryo 序列化支援已在 3.4.3 中棄用,並在 3.6.0 中正式移除。如果您明確使用 Gryo 或預設使用 Gryo 的驅動程式版本,則應切換至 GraphBinary 或升級驅動程式。

Lambda 步驟

Neptune 不支援 Lambda 步驟。

不支援的 Gremlin 方法

Neptune 不支援以下 Gremlin 方法:

  • 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())

重要

這「只」適用於以「文字字串」傳送 Gremlin 查詢的方法。

不支援的 Gremlin 步驟

Neptune 不支援以下 Gremlin 步驟:

  • Neptune 中僅部分支援 Gremlin io( ) 步驟。它可以在讀取內容中使用,如 g.io((url)).read() 中所示,但不能寫入。

Neptune 中的 Gremlin 圖形功能

Gremlin 的 Neptune 實作不會公開 graph 物件。下表列出 Grimlin 功能,並指出 Neptune 是否支持它們。

Neptune 對 graph 功能的支援

Neptune 圖形功能 (如果支援) 與 graph.features() 命令將傳回的功能相同。

圖形功能 已啟用?
Transactions 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