View a markdown version of this page

Amazon Neptune 中的 Gremlin 标准合规性 - Amazon Neptune

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

Amazon Neptune 中的 Gremlin 标准合规性

以下各节概述了 Gremlin 的 Neptune 实现及其与 Apache 实现的区别。 TinkerPop

海王星在其引擎中原生实现了一些 Gremlin 步骤,并使用 Apache TinkerPop Gremlin 实现来处理其他步骤(参见)。Amazon Neptune 中的原生 Gremlin 步骤支持

注意

有关 Gremlin 控制台和 Amazon Neptune 中所示的这些实施差别的一些具体示例,请参阅“快速入门”的使用 Gremlin 访问 Amazon Neptune 中的图形数据部分。

Gremlin 的适用标准

脚本中的变量和参数

就预绑定变量而言,遍历对象g位于海王星 Pre-bound 中,不支持该graph对象。

尽管 Neptune 在脚本中不支持 Gremlin 变量或参数化,但您可能经常在互联网上遇到包含变量声明的 Gremlin Server 示例脚本,例如:

String query = "x = 1; g.V(x)"; List<Result> results = client.submit(query).all().get();

还有许多在提交查询时利用参数化(或绑定)的示例,例如:

Map<String,Object> params = new HashMap<>(); params.put("x",1); String query = "g.V(x)"; List<Result> results = client.submit(query).all().get();

参数示例通常与在可能的情况下未进行参数化会导致性能损失的警告相关联。你可能会遇到很多这样的例子 TinkerPop ,而且它们听起来都很有说服力,说明需要进行参数化。

但是,变量声明功能和参数化功能(以及警告)仅适用于使用 TinkerPop的 Gremlin 服务器。GremlinGroovyScriptEngine当 Gremlin 服务器使用 Gremlin 的 gremlin-language ANTLR 语法来解析查询时,它们不适用。ANTLR 语法不支持变量声明或参数化,因此,在使用 ANTLR 时,您不必担心参数化失败。由于ANTLR语法是其中的新组成部分 TinkerPop,因此您在互联网上可能遇到的旧内容通常并不能反映出这种区别。

Neptune 在其查询处理引擎中使用 ANTLR 语法,而不是 GremlinGroovyScriptEngine,因此它不支持变量、参数化或 bindings 属性。因此,与参数化失败相关的问题在 Neptune 中不适用。使用 Neptune,只需按通常发生参数化的位置提交查询就完全安全了。因此,可以简化前面的示例,而不会造成任何性能损失,如下所示:

String query = "g.V(1)"; List<Result> results = client.submit(query).all().get();

脚本执行

海王星的 Gremlin 引擎使用的 ANTLR 语法解析查询。 TinkerPop gremlin-language运行GremlinGroovyScriptEngine(就像某些 TinkerPop-based Gremlin 服务器部署一样),因此提交给 Neptune 的脚本必须仅包含 Gremlin 语言,不能包含任意 Groovy 或 Java 代码。

可以通过多种方式将脚本发送到海王星,例如通过 Gremlin REST 端点 Gremlin 控制台或通过 TinkerPop 语言驱动程序(例如 Java 驱动程序的脚本客户端)发送脚本。本节中描述的限制适用于这些文本字符串提交路径中的任何一个。

重要的是不要将 Gremlin 语言本身与你可能在其他地方看到的任何编程语言的句法糖或通用函数混淆。此类代码出现在 TinkerPop 教程或在线示例中的位置,这取决于 Neptune 不提供的 Groovy 或 Java 运行时。

重要

本节中的所有内容均适用于 Gremlin 提交的文本字符串。使用 Java、Python 或.NET 等宿主语言构建的 GLV(Gremlin 语言变体)字节码提交不受这些限制,因为主机语言遍历生成器生成的字节码供 Neptune 的引擎直接使用。

脚本可能包含的内容

  • 所有查询必须以遍历对象 g 开头。

  • 可以在单个提交中进行多次遍历,以分号 (;) 或换行符 () 分隔。\n除最后一条语句以外的所有语句都必须以要执行的.iterate()步骤结尾;只返回最终遍历的数据。

引用 TinkerPop 枚举值

如果 TinkerPop 枚举值应作为步进参数(例如,基数 on property() 或 order onby()),则使用 ANTLR 语法识别的短格式值。Neptune 在此位置无法解析完全限定的 Java 类名,例如,不org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single被接受;改用single

下表列出了允许的短格式值以及每个值所属的基础 TinkerPop 类。

脚本可能不包含的内容

对海王星的文本字符串 Gremlin 查询支持以下内容,因为它们依赖于 Neptune 不提供的 Groovy 或 Java 运行时支持:

  • 不是以开头的 Groovy 语句。g这包括:

    • 算术表达式,例如 1 + 1

    • 系统调用,例如 System.nanoTime()

    • 变量声明,例如 x = 1; g.V(x)

  • 支持的 Gremlin API 以外的 Java 方法或库调用。例如,不允许 java.lang.*Date()g.V().tryNext().orElseGet(...)

  • 以 Java 类型作为参数的 Gremlin 方法。这些只能从 JVM-language 主机访问,不能通过文本字符串提交来访问。示例:

    • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.program(org.apache.tinkerpop.gremlin.process.computer.VertexProgram)

    • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.sideEffect(java.util.function.Consumer)

    • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.from(org.apache.tinkerpop.gremlin.structure.Vertex)

    • org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal.to(org.apache.tinkerpop.gremlin.structure.Vertex)

    例如,以下遍历不能作为文本字符串提交:。g.V().addE('something').from(__.V().next()).to(__.V().next())

元素属性

海王星不支持 TinkerPop 3.7.0 中引入的用于返回元素属性的materializeProperties标志。因此,Neptune 仍然仅会将顶点或边缘作为引用返回,并且随附它们的 idlabel

会话

Neptune 中的会话持续时间限制为仅 10 分钟。有关更多信息,请参阅基于 Gremlin 脚本的会话TinkerPop会话参考。

事务

Neptune 在每个 Gremlin 遍历开始时打开新的事务,并在遍历成功完成后结束事务。事务会在出现错误时回滚。

用分号 (;) 或换行符 (\n) 分隔的多个语句包含在单个事务中。最后一个以外的每个语句都必须以要执行的 next() 步骤结尾。仅返回最后遍历数据。

不支持使用 tx.commit()tx.rollback() 的手动事务逻辑。

重要

适用于您将 Gremlin 查询作为文本字符串发送的方法(请参阅Gremlin 事务)。

顶点和边缘 ID

Neptune Gremlin 顶点和边缘 ID 必须属于 String 类型。这些 ID 字符串支持 Unicode 字符,大小不能超过 55MB。

User-supplied 支持 ID,但在正常使用中它们是可选的。如果您在添加顶点或边缘时不提供 ID,Neptune 会生成一个 UUID 并将其转换为字符串,格式如下:"48af8178-50ce-971a-fc41-8c9a954cea62"。这些 UUID 不符合 RFC 标准,因此,如果您需要标准 UUID,则应在外部生成它们,并在添加顶点或边缘时提供它们。

注意

Neptune Load 命令要求您使用 ~id 字段采用 Neptune CSV 格式提供 ID。

User-supplied 身份证

User-supplied 海王星小精灵允许携带身份证,但有以下规定。

  • 提供的 ID 是可选的。

  • 仅支持顶点和边缘。

  • 仅支持 String 类型。

要使用自定义 ID 创建新顶点,请将 property 步骤与 id 关键字一起使用:g.addV().property(id, 'customid')

注意

请勿为 id 关键字加上引号。它指的是 T.id

所有顶点 ID 必须是唯一的,并且所有边缘 ID 也必须是唯一的。但是,Neptune 的确允许顶点和边缘具有相同的 ID。

如果您尝试使用 g.addV() 创建新顶点并且已存在具有该 ID 的顶点,则此操作将失败。此情况的例外是,如果为顶点指定新标签,该操作将成功,但会将新标签和指定的任何其他属性添加到现有顶点。不会覆盖任何内容。未创建新顶点。顶点 ID 不会更改并会保持唯一。

例如,以下 Gremlin 控制台命令将成功:

gremlin> g.addV('label1').property(id, 'customid') gremlin> g.addV('label2').property(id, 'customid') gremlin> g.V('customid').label() ==>label1::label2

顶点属性 ID

顶点属性 ID 会自动生成且可以在查询时显示为正数或负数。

顶点属性的基数

Neptune 支持集基数和单一基数。如果未指定,则集基数处于选中状态。这意味着,如果您设置一个属性值,它会向该属性添加新值,但是仅当它未显示在一组值中时。这是 Set 的 Gremlin 枚举值。

不支持 List。有关属性基数的更多信息,请参阅 Gremlin 中的顶点主题。 JavaDoc

更新顶点属性

要更新属性值而无需向一组值添加其他值,请在 property 步骤中指定 single 基数。

g.V('exampleid01').property(single, 'age', 25)

这将删除该属性的所有现有值。

标签

Neptune 对于一个顶点支持多个标签。创建标签时,您可以指定多个标签,同时使用 :: 分隔它们。例如,g.addV("Label1::Label2::Label3") 添加具有三个不同标签的顶点。hasLabel 步骤与具有以下任一三个标签的此顶点相匹配:hasLabel("Label1")hasLabel("Label2")hasLabel("Label3")

重要

:: 分隔符仅用于此用途。您不能在 hasLabel 步骤中指定多个标签。例如,hasLabel("Label1::Label2") 与任何内容都不匹配。

转义字符

Neptune 解析所有转义字符,如 Apache Groovy 语言文档的转义特殊字符部分中所述。

序列化

Neptune 根据请求的 MIME 类型支持以下串行化。

借助 Neptune,您可以使用 TinkerPop 提供的许多序列化器,并支持 GraphSon 和... 的各种版本和配置。 GraphBinary有关当前支持的序列化器,请参见下表。虽然存在许多选项,但使用指南却很简单:

  • 如果您使用的是 Apache TinkerPop 驱动程序,则最好使用该驱动程序的默认值,不要明确指定。除非您有非常具体的理由这样做,否则您可能不需要在驱动程序初始化中指定序列化器。通常,驱动程序使用的默认序列化器是 application/vnd.graphbinary-v1.0

  • 如果您通过 HTTP 连接到 Neptune,请优先使用 application/vnd.gremlin-v3.0+json;types=false,因为 GraphSON 3 替代版本中的嵌入式类型会导致其使用变得复杂。

  • 通常,application/vnd.graphbinary-v1.0-stringd 只有在与 Gremlin 控制台结合使用时才有用,因为它可以将所有结果转换为字符串表示形式以便于显示。

  • 由于遗留原因,其余格式仍然存在,但通常情况下,不应在没有明确理由的情况下将这些格式与驱动程序一起使用。

MIME 类型 序列化 配置

application/vnd.gremlin-v1.0+json;types=false

GraphSONUntypedMessageSerializerV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerV2 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v2.0+json;types=false

GraphSONUntypedMessageSerializerV2 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/vnd.gremlin-v3.0+json;types=false

GraphSONUntypedMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/json

GraphSONUntypedMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1

application/vnd.graphbinary-v1.0-stringd

GraphBinaryMessageSerializerV1 serializeResultToString: true

application/vnd.gremlin-v1.0+json

GraphSONMessageSerializerGremlinV1 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV1]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerV2(仅适用于 WebSockets) ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV2]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3

application/json

GraphSONMessageSerializerV3 ioRegistries: [org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1
注意

此处显示的序列化器表指的是自 TinkerPop 3.7.0 起的命名。如果您想进一步了解此更改,请参阅TinkerPop 升级文档。Gryo 序列化支持在 3.4.3 中已弃用,在 3.6.0 中已正式删除。如果您明确使用 Gryo 或使用默认情况下使用 Gryo 的驱动程序版本,则应切换到 GraphBinary 或升级您的驱动程序。

Lambda 步骤

Neptune 不支持 Lambda 步骤。

不受支持的 Gremlin 步骤

Neptune 不支持以下 Gremlin 步骤:

  • Neptune 中仅部分支持 Gremlin io( ) 步骤。你可以像在读取上下文中一样使用它g.io("https://example.com/data/my-graph.graphml").read(),但你不能用它来写入。要读取您作为 Amazon S3 对象存储的文件,请先生成预签名 URL。然后将该 HTTPS 网址传递给g.io()。有关预签名 URL 的更多信息,请参阅 Amazon S3 用户指南中的下载和上传带有预签名 URL 的对象。

Neptune 中的 Gremlin 图形特征

Gremlin 的 Neptune 实现不公开 graph 对象。下表列出了 Gremlin 特征,并指明了 Neptune 是否支持这些特征。

Neptune 支持图形功能

Neptune 图形特征(如果支持)与 graph.features() 命令返回的特征相同。

图形特征 是否启用?
Transactions true
ThreadedTransactions false
Computer false
Persistence true
ConcurrentAccess true

Neptune 对变量特征的支持

变量特征 是否启用?
Variables false
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues false
ByteValues false
DoubleValues false
FloatValues false
IntegerValues false
LongValues false
MapValues false
MixedListValues false
StringValues false
ByteArrayValues false
FloatArrayValues false
LongArrayValues false

Neptune 对顶点特征的支持

顶点特征 是否启用?
MetaProperties false
DuplicateMultiProperties false
AddVertices true
RemoveVertices true
MultiProperties true
UserSuppliedIds true
AddProperty true
RemoveProperty true
NumericIds false
StringIds true
UuidIds false
CustomIds false
AnyIds false

Neptune 对顶点属性特征的支持

顶点属性特征 是否启用?
UserSuppliedIds false
AddProperty true
RemoveProperty true
NumericIds true
StringIds true
UuidIds false
CustomIds false
AnyIds false
Properties true
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues true
ByteValues true
DoubleValues true
FloatValues true
IntegerValues true
LongValues true
MapValues false
MixedListValues false
StringValues true
ByteArrayValues false
FloatArrayValues false
LongArrayValues false

Neptune 对边缘特征的支持

边缘特征 是否启用?
AddEdges true
RemoveEdges true
UserSuppliedIds true
AddProperty true
RemoveProperty true
NumericIds false
StringIds true
UuidIds false
CustomIds false
AnyIds false

Neptune 对边缘属性特征的支持

边缘属性特征 是否启用?
Properties true
SerializableValues false
UniformListValues false
BooleanArrayValues false
DoubleArrayValues false
IntegerArrayValues false
StringArrayValues false
BooleanValues true
ByteValues true
DoubleValues true
FloatValues true
IntegerValues true
LongValues true
MapValues false
MixedListValues false
StringValues true
ByteArrayValues false
FloatArrayValues false
LongArrayValues false