本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Neptune 中的原生 Gremlin 步骤支持
如调整 Gremlin 查询中所述,Amazon Neptune 引擎目前并不完全原生支持所有 Gremlin 步骤。当前支持分为四类:
始终可以转换为原生 Neptune 引擎操作的 Gremlin 步骤
只要满足以下条件,许多 Gremlin 步骤可以转换为原生 Neptune 引擎操作:
在查询中,它们前面没有无法转换的步骤。
它们的父步骤(如果有)可以转换。
它们的所有子遍历(如果有)都可以转换。
如果满足这些条件,以下 Gremlin 步骤将始终转换为原生 Neptune 引擎操作:
在某些情况下可以转换为原生 Neptune 引擎操作的 Gremlin 步骤
在某些情况下,一些 Gremlin 步骤可以转换为原生 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()
步骤的唯一情况是它遵循食谱页面上推荐的 Upsert 模式。TinkerPop 不允许使用其它 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 ()
— 只要带有 `T 的查询使用谓词 `p.eq`、`p.neq` 或 `p.contains`,`has () `步骤通常可以转换为原生 Neptune 引擎操作。预计 “has ()” 的变体意味着那些 “P” 的实例也要转换为原生实例,例如 `hasid ('id1234') `,它等同于 `has (eq,t.id,'id1234')`。 -
id( )
– 除非在属性上使用 id()
步骤,否则将转换该步骤,如下所示:g.V().has('code','ANC').properties('code').id()
-
merGee ()
— 如果参数(合并条件, onMatch
和)恒定(null
常量select()
或 a),则onCreate
该mergeE()
步骤可以转换为原生 Neptune 引擎操作。Map
Map
上移边缘中的所有示例都可以转换。 -
mergeV ()
— 如果参数(合并条件, onCreate
和)恒定(常量或null
a),则可以将 mergeV (onMatch
) 步骤转换为原生 Neptune 引擎操作。Map
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 运算符。
如果使用的是
+
、-
、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 ()
— 只有在食谱 页面推荐的 Upsert 模式中使用该 unfold()
步骤时,以及将其与以下内容一起 cap()
使用时,才能将其转换为原生 Neptune 引擎操作:TinkerPopg.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 支持以下 Gremlin 步骤,但它们从不转换为原生 Neptune 引擎操作。相反,它们由 Gremlin 服务器执行。
Neptune 中根本不支持的 Gremlin 步骤
Neptune 根本不支持以下 Gremlin 步骤。在大多数情况下,这是因为它们需要 GraphComputer
,而 Neptune 目前不支持。
实际上,io()
步骤得到了部分支持,因为它可以用来从 URL 进行 read()
,但不用来 write()
。