本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 引擎操作,但以下情况除外:如果使用非数字麻袋运算符。
如果数字麻袋运算符不是
+
、-
、mult
、div
、min
和max
正在使用。-
如果
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')
当比较运算符以外
eq
、neq
、within
, 和without
被使用。何时使用用户提供的聚合。
-
Gremlin 步骤永远不会转换为原生 Neptune 发动机操作
Neptune 支持以下 Gremlin 步骤,但永远不会转换为原生 Neptune 引擎操作。相反,它们是由 Gremlin 服务器执行的。
Neptune 根本不支持的 Gremlin 步骤
Neptune 根本不支持以下 Gremlin 步骤。在大多数情况下,这是因为他们需要GraphComputer
,Neptune 目前不支持。