本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Neptune 的原生 Gremlin 步驟支援
Amazon Neptune 引擎目前對所有 Gremlin 步驟沒有完整的原生支援。如 調校 Gremlin 查詢 中所述。目前的支援分為四個類別:
一律可以轉換為原生 Neptune 引擎操作的 Gremlin 步驟
許多 Gemlin 步驟只要符合下列條件就可以轉換為原生 Neptune 引擎操作:
它們不會在查詢前面加上無法轉換的步驟。
它們的父步驟 (如果有的話) 都可以進行轉換。
它們所有的子周遊 (如果有的話) 都可以進行轉換。
下列 Gemlin 步驟只要符合這些條件,一律轉換為原生 Neptune 引擎操作:
在某些情況下可以轉換為原生 Neptune 引擎操作的 Gremlin 步驟
在某些情況下,有些 Gemlin 步驟可以轉換為原生 Neptune 引擎操作,但在其他情況下則不能:
addE( )
– addE()步驟通常可以轉換為原生 Neptune 引擎操作,除非它緊接著包含周遊做為索引鍵的property()步驟。addV( )
– addV()步驟通常可以轉換為原生 Neptune 引擎操作,除非它緊接著包含周遊做為索引鍵的property()步驟,或除非指派了多個標籤。-
aggregate( )
– aggregate()步驟通常可以轉換為原生 Neptune 引擎操作,除非該步驟用於子周遊或次周遊,或者除非要儲存的值是頂點、邊緣、ID、標籤或屬性值以外的值。在下面範例中,不會轉換
aggregate(),因為正在子周遊中使用它:g.V().has('code','ANC').as('a') .project('flights').by(select('a') .outE().aggregate('x'))在此範例中,不會轉換 aggregate(),因為儲存的是值的
min():g.V().has('code','ANC').outE().aggregate('x').by(values('dist').min()) barrier( )
– barrier()步驟通常可以轉換為原生 Neptune 引擎操作,除非其後的步驟未轉換。-
cap( )
– 轉換 cap()步驟的唯一情況是在其與unfold()步驟結合,以傳回頂點、邊緣、ID 或屬性之彙總的展開版本時。在這個範例中,將轉換cap(),因為它後面是.unfold():g.V().has('airport','country','IE').aggregate('airport').limit(2) .cap('airport').unfold()不過,如果您移除
.unfold(),將不會轉換cap():g.V().has('airport','country','IE').aggregate('airport').limit(2) .cap('airport') coalesce( )
– 轉換 coalesce()步驟的唯一情況是在它遵循 TinkerPop 配方頁面上建議的 Upsert 模式 時。不允許其他合併 coalesce() 模式。轉換限於可以轉換所有子周遊的情況,它們都會產生與輸出相同的類型 (頂點、邊緣、ID、值、金鑰或標籤)、它們都會周遊到一個新元素,並且它們不包含 repeat()步驟。-
constant( )
– 目前,僅在周遊的 sack().by()部分內使用 constant() 步驟,以指派常數值時,才會轉換此步驟,如下所示:g.V().has('code','ANC').sack(assign).by(constant(10)).out().limit(2) -
cyclicPath( )
– cyclicPath()步驟通常可以轉換為原生 Neptune 引擎操作,除非該步驟與by()、from()或to()調幅器搭配使用。例如,在以下查詢中,不會轉換cyclicPath():g.V().has('code','ANC').as('a').out().out().cyclicPath().by('code') g.V().has('code','ANC').as('a').out().out().cyclicPath().from('a') g.V().has('code','ANC').as('a').out().out().cyclicPath().to('a') drop( )
– drop()步驟通常可以轉換為原生 Neptune 引擎操作,除非該步驟是在sideEffect() 或optional()內部使用。-
fold( )
– 只有兩種情況可以轉換 fold() 步驟,即當它用於 TinkerPop 配方頁面 上建議的 Upsert 模式 時,以及當它用於 group().by()內容時,如下所示:g.V().has('code','ANC').out().group().by().by(values('code', 'city').fold()) -
has( )
– `has()` 步驟通常可以轉換為原生 Neptune 引擎操作,前提是具有 `T` 的查詢使用述詞 `P.eq`、`P.neq` 或 `P.contains`。預期的 `has()` 變化表示這些 `P` 執行個體也要轉換為原生執行個體,例如 `hasId('id1234')`,其相當於 `has(eq, T.id, 'id1234')`。 -
id( )
– 除非在屬性上使用 id()步驟,否則會轉換此步驟,如下所示:g.V().has('code','ANC').properties('code').id() -
mergeE()
– 如果參數 (合併條件、 onCreate和onMatch) 為常數 (null、常數 或select())Map,則可以將mergeE()步驟轉換為原生 Neptune 引擎操作Map。可以轉換疊加邊緣中的所有範例。 -
mergeV()
– 如果參數 (合併條件、 onCreate和 ) 為常數 (null、常數 或 )Map,則可以將 mergeV(onMatch) 步驟轉換為原生 Neptuneselect()引擎操作Map。可以轉換上方頂點中的所有範例。 -
order( )
– order()步驟通常可以轉換為原生 Neptune 引擎操作,除非下列其中一個條件成立:-
order()步驟是在巢狀子周遊內,如下所示:g.V().has('code','ANC').where(V().out().order().by(id)) 例如,本機排序正在與
order(local)搭配使用。-
正在排序依據的
by()調幅中使用自訂比較器。使用sack()的範例如下:g.withSack(0). V().has('code','ANC'). repeat(outE().sack(sum).by('dist').inV()).times(2).limit(10). order().by(sack()) 在同一個元素上有多個排序。
-
-
project( )
– project()步驟通常可以轉換為原生 Neptune 引擎操作,除非project()後面的by()陳述式數目與指定的標籤數目不符,如下所示:g.V().has('code','ANC').project('x', 'y').by(id) range( )
– 僅在有問題範圍的下限為零 (例如, range(0,3)) 時,才會轉換range()步驟。-
repeat( )
– repeat()步驟通常可以轉換為原生 Neptune 引擎操作,除非它在另一個repeat()步驟內形成巢狀,如下所示:g.V().has('code','ANC').repeat(out().repeat(out()).times(2)).times(2) -
sack( )
– sack()步驟通常可以轉換為原生 Neptune 引擎操作,但在下列情況下除外:如果使用非數字 sack 運算子。
如果使用
+、-、mult、div、min和max以外的數字 sack 運算子。-
如果在
where()步驟內使用sack(),根據 sack 值進行篩選,如下所示:g.V().has('code','ANC').sack(assign).by(values('code')).where(sack().is('ANC'))
-
sum( )
– sum()步驟通常可以轉換為原生 Neptune 引擎操作,但在用來計算全域求和時不能轉換,如下所示:g.V().has('code','ANC').outE('routes').values('dist').sum() union( )
– union()步驟可以轉換為原生 Neptune 引擎操作,只要它是查詢中的最後一個步驟,但終端步驟除外。-
unfold( )
– 僅在 TinkerPop 配方頁面 上建議的 Upsert 模式 中使用 unfold()步驟時,以及此步驟與cap()搭配使用時,才能將此步驟轉換為原生 Neptune 引擎操作,如下所示:g.V().has('airport','country','IE').aggregate('airport').limit(2) .cap('airport').unfold() -
where( )
– where()步驟通常可以轉換為原生 Neptune 引擎操作,但在下列情況下除外:-
使用 by() 調幅時,如下所示:
g.V().hasLabel('airport').as('a') .where(gt('a')).by('runways') 使用
eq、neq、within和without以外的比較運算子時。利用使用者提供的彙總時。
-
永不轉換為原生 Neptune 引擎操作的 Gremlin 步驟
Neptune 中支援下列 Gemlin 步驟,但這些步驟永遠不會轉換為原生 Neptune 引擎操作。相反地,它們是由 Gemlin 伺服器執行。
Neptune 完全不支援的 Gremlin 步驟
Neptune 中完全不支援下列 Gremlin 步驟。在大多數情況下,這是因為它們需要一個 GraphComputer,但 Neptune 目前不支援它。
io() 步驟實際上是部分受到支援,因為它可以用來從 URL 進行 read(),但不能進行 write()。