Amazon Neptune 的原生 Gremlin 步驟支援 - Amazon Neptune

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

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( ) – 除非步驟與 by()from()to() 調變器搭配使用,否則cyclicPath()該步驟通常可以轉換為原生 Neptune 引擎操作。例如,在以下查詢中,不會轉換 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())
  • id( ) – 除非在屬性上使用 id() 步驟,否則會轉換此步驟,如下所示:

    g.V().has('code','ANC').properties('code').id()
  • mergeE() – 如果參數 (合併條件、 onCreateonMatch) 為常數 (null、常數 或 )Map,則可以將mergeE()步驟轉換為原生 Neptune select() 引擎操作Map 可以轉換疊加邊緣中的所有範例。

  • mergeV() – 如果參數 (合併條件、 onCreate和 ) 為常數 (null、常數 或 )Map,則可以將 mergeV(onMatch) 步驟轉換為原生 Neptune select() 引擎操作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 運算子。

    • 如果使用 +-multdivminmax 以外的數字 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( )unfold() 步驟只有在用於 Word 配方頁面上建議的 Upsert 模式時,以及與下列cap()內容搭配使用時,才能轉換為原生 Neptune 引擎操作: TinkerPop

    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')
    • 使用 eqneqwithinwithout 以外的比較運算子時。

    • 利用使用者提供的彙總時。

永不轉換為原生 Neptune 引擎操作的 Gremlin 步驟

Neptune 中支援下列 Gemlin 步驟,但這些步驟永遠不會轉換為原生 Neptune 引擎操作。相反地,它們是由 Gemlin 伺服器執行。

Neptune 完全不支援的 Gremlin 步驟

Neptune 中完全不支援下列 Gremlin 步驟。在大多數情況下,這是因為它們需要一個 GraphComputer,但 Neptune 目前不支援它。

實際上部分支援該io()步驟,因為它可以從 read() URL 用於 ,但不能用於 write()