View a markdown version of this page

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

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

Amazon Neptune 中的 Gremlin 標準合規

以下各節提供 Gremlin 的 Neptune 實作概觀,以及其與 Apache TinkerPop 實作的差異。

Neptune 會在其引擎中以原生方式實作一些 Gremlin 步驟,並使用 Apache TinkerPop Gremlin 實作來處理其他步驟 (請參閱 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,您可能會遇到很多這樣的範例,而且關於需要參數化,它們聽起來都非常有說服力。

不過,變數宣告功能和參數化功能 (以及警告) 只在使用 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 類別。

指令碼可能不包含的內容

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 仍然只會傳回頂點或邊緣做為參考,只有其 idlabel

工作階段

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 的 Gremlin 列舉值。

不支援 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

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   (only works with 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
注意

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

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