Amazon Neptune 中的原生 Gremlin 步骤支持 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon Neptune 中的原生 Gremlin 步骤支持

如中所述,Amazon Neptune 引擎目前没有对所有 Gremlin 步骤的完全原生支持优化 Grelin 查询. 当前的支持分为四类:

Gremlin 步骤始终可以转换为原生 Neptune 发动机操作

只要符合以下条件,许多 Gremlin 步骤就可以转换为原生 Neptune 引擎操作:

  • 在查询中,它们前面没有一个不能转换的步骤。

  • 他们的父步骤(如果有)可以转换,

  • 他们的所有孩子遍历(如果有的话)都可以转换。

如果符合这些条件,以下 Gremlin 步骤总是转换为原生 Neptune 引擎操作:

在某些情况下,Gremlin 步骤可以转换为原生 Neptune 发动机操作

在某些情况下,有些 Gremlin 步骤可以转换为原生的 Neptune 引擎操作,但在另一些情况下则不能

  • addE ()— 该addE()step 通常可以转换为本机 Neptune 引擎操作,除非立即跟着property()包含遍历作为密钥的步骤。

  • addV ()— 该addV()step 通常可以转换为本机 Neptune 引擎操作,除非立即跟着property()步骤包含遍历作为键,或者除非分配了多个标签。

  • 聚合 ()— 该aggregate()步骤通常可以转换为本机 Neptune 引擎操作,除非该步骤用于子遍历或子遍历,或者除非存储的值不是顶点、边缘、ID、标签或属性值。

    在下面的示例中,aggregate()未转换,因为它正在用于孩子遍历:

    g.V().has('code','ANC').as('a') .project('flights').by(select('a') .outE().aggregate('x'))

    在此示例中,不会转换聚合(),因为存储的是min()值:

    g.V().has('code','ANC').outE().aggregate('x').by(values('dist').min())
  • 屏障 ()— 该barrier()步骤通常可以转换为本机 Neptune 引擎操作,除非后面的步骤未转换。

  • 帽 ()— 唯一的情况是cap()步骤被转换为与unfold()step 返回顶点、边缘、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 配方网页. 不允许使用其他 coalesce () 模式。转换限于以下情况:所有子遍历都可以转换,它们都生成与输出相同的类型(顶点、边、id、值、键或标签),它们都遍历到新元素,并且它们不包含repeat()步骤。

  • 常量 ()— 常量 () 步骤当前仅在sack().by()遍历的一部分来分配常量值,如下所示:

    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()步骤通常可以转换为本机 Neptune 引擎操作,除非在sideEffect() 或optional()步骤。

  • 折 ()— 在两种情况下,fold () 步骤可以被转换,即在更新插入模式建议使用TinkerPop 配方网页,以及当它用于group().by()像这样的上下文:

    g.V().has('code','ANC').out().group().by().by(values('code', 'city').fold())
  • ID ()— 该id()step 会被转换,除非在属性上使用它,如下所示:

    g.V().has('code','ANC').properties('code').id()
  • 顺序 ()— 该order()除非满足以下条件之一,否则步骤通常可转换为本机 Neptune 引擎操作:

    • 这些区域有:order()step 位于嵌套的子遍历中,如下所示:

      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()step 通常可以转换为本机 Neptune 引擎操作,除非by()后面的语句project()与指定的标签数量不匹配,如下所示:

    g.V().has('code','ANC').project('x', 'y').by(id)
  • 范围 ()— 该range()步骤仅在有问题范围的下端为零时转换(例如,range(0,3))。

  • REPEAT ()— 该repeat()step 通常可以转换为本机 Neptune 引擎操作,除非它嵌套在另一个引擎中repeat()步骤如下所示:

    g.V().has('code','ANC').repeat(out().repeat(out()).times(2)).times(2)
  • 袋子 ()— 该sack()步骤通常可转换为本机 Neptune 引擎操作,但以下情况除外:

    • 如果使用非数字麻袋运算符。

    • 如果数字麻袋运算符不是+-multdivminmax正在使用。

    • 如果sack()在一个内部使用where()步骤根据袋子值进行过滤,如下所示:

      g.V().has('code','ANC').sack(assign).by(values('code')).where(sack().is('ANC'))
  • sum ()— 该sum()step 通常可以转换为本机 Neptune 引擎操作,但在用于计算全局求和时不能转换为如下所示:

    g.V().has('code','ANC').outE('routes').values('dist').sum()
  • 联盟 ()— 该union()step 可以转换为本机 Neptune 引擎操作,除非用作非终端步骤。

  • 展开 ()— 该unfold()步骤只能转换为本机 Neptune 引擎操作时,它在更新插入模式建议使用TinkerPop 配方网页,以及当它与之一起使用cap()如下所示:

    g.V().has('airport','country','IE').aggregate('airport').limit(2) .cap('airport').unfold()
  • 其中 ()— 该where()步骤通常可转换为本机 Neptune 引擎操作,但以下情况除外:

    • 什么时候使用 by () 调制,如下所示:

      g.V().hasLabel('airport').as('a') .where(gt('a')).by('runways')
    • 当比较运算符以外eqneqwithin, 和without被使用。

    • 何时使用用户提供的聚合。

Gremlin 步骤永远不会转换为原生 Neptune 发动机操作

Neptune 支持以下 Gremlin 步骤,但永远不会转换为原生 Neptune 引擎操作。相反,它们是由 Gremlin 服务器执行的。

Neptune 根本不支持的 Gremlin 步骤

Neptune 根本不支持以下 Gremlin 步骤。在大多数情况下,这是因为他们需要GraphComputer,Neptune 目前不支持。