本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Neptune 中的 Gremlin 標準合規
以下各節提供了 Gremlin 的 Neptune 實作概觀,以及它與 Apache TinkerPop 實作的不同之處。
Neptune 在其引擎中以原生方式實現了一些小鬼步驟,並使用 Apache TinkerPop Grimlin 實現來處理其他步驟(請參閱)。Amazon Neptune 的原生 Gremlin 步驟支援
注意
如需 Gremlin 主控台和 Amazon Neptune 中所顯示實作差異的一些具體範例,請參閱快速入門的 使用 Gremlin 存取 Amazon Neptune 中的圖形 一節。
主題
Gremlin 的適用標準
鬼靈語言是由 Apache TinkerPop 文檔
和阿帕奇 TinkerPop 實現的小精靈,而不是由一個正式的規範來定義。 對於數字格式,格林遵循 IEEE 754 標準(IEEE754-2019-IEEE
浮點運算的標準)。 有關更多信息,另請參閱維基百科 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 子,你可能會遇到,他們都聽起來很有說服力的需要參數化。
但是,變數宣告功能和參數化功能 (以及警告) 都只適用於使用. 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 完整名稱。
允許值 | 類別 |
---|---|
id , key , label , value |
|
T.id , T.key , T.label , T.value |
|
set , single |
或者. 修補程式. 格林. VertexProperty |
asc , desc , shuffle |
|
Order.asc , Order.desc , Order.shuffle |
|
global , local |
|
Scope.global , Scope.local |
|
all , first , last , mixed |
|
normSack |
或者. 修補程序. 格林. 進程遍歷. SackFunctions |
addAll , and , assign , div ,
max , min , minus , mult ,
or , sum , sumLong |
|
keys , values |
|
BOTH , IN , OUT |
|
any , none |
Java 程式碼
Neptune 不支持調用除了支持的小靈以外的任意 Java 或 Java 庫調用定義的方法APIs。例如,不允許 java.lang.*
、Date()
和 g.V().tryNext().orElseGet()
。
元素上的屬性
Neptune 不支持 TinkerPop 3.7.0 中引入的materializeProperties
標誌以返回元素的屬性。其結果是,Neptune 仍然只返回頂點或邊作為引用只是他們的id
和label
。
指令碼執行
所有查詢開頭必須為周遊物件 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
不支援 List
。如需有關屬性基數的詳細資訊,請參閱 Grimlin 中的頂點
更新頂點屬性
若要更新屬性值,而不新增額外的值給值組,請在 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類型 | 序列化 | 組態 |
|
GraphSONMessageSerializerV1 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1] |
|
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 (僅適用於 WebSockets) |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2] |
|
|
|
|
GraphSONMessageSerializerV3 |
ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3] |
|
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 升級文件
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 |