Amazon Neptune 的 Gremlin 标准合规性 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Amazon Neptune 的 Gremlin 标准合规性

以下各部分概述了 Grimlin 的 Neptune 实施以及它与 Apache 的不同之处。TinkerPop实现。

Neptune 在其引擎中本地实现了一些 Gremlin 步骤,并使用 ApacheTinkerPopGremlin 实施以处理其他人(请参阅Amazon Neptune 中的原生 Gremlin 步骤支持)。以下部分概述了 Neptune 的实施与TinkerPop实现。

Gremlin 的适用标准

Neptune Gemlin 实施的不同之处

Grimlin 的 Amazon Neptune 实施与 Apache 定义的实施之间存在几个重要的差异。TinkerPop.

注意

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

以下是实施差异列表:

Pre-Bound 变量

遍历对象 g 是 Pre-bound。不支持 graph 对象。

TinkerPop枚举

Neptune 不支持枚举值的完全限定类名称。例如,您在 Groovy 请求中必须使用 single,不能使用 org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single

枚举类型由参数类型决定。

下表显示允许的枚举值和相关的枚举值。TinkerPop完全限定的名称。

注意

这些区域有:incrdecr上的枚举选项Order已被弃用TinkerPop赞成ascdesc分别。请使用新选项,因为incrdecr将在未来版本中删除。

Java 代码

Neptune 不支持调用由支持的 Grimlin API 以外的任意 Java 或 Java 库调用定义的方法。例如,不允许 java.lang.*Date()g.V().tryNext().orElseGet()

日期和时间

Neptune 提供datetime方法,用于为 Gremlin 中发送的查询指定日期和时间。时髦的变体。这包括 Gremlin 控制台、使用 HTTP REST API 的文本字符串以及使用 Groovy 的任何其他序列化。日期和时间值必须使用 datetime() 函数进行指定。

重要

适用于您将 Gremlin 查询作为文本字符串 发送的方法。如果您使用的是 Gremlin 语言变体 (GLV),则必须使用该语言的本机日期类和函数。有关更多信息,请参阅“最佳实践”部分的将本机日期和时间用于 GLV 时间数据

datetime( ) 函数采用符合 ISO-8601 日期时间的字符串值,最高精度为毫秒。例如:datetime('2018-01-01T00:00:00')

ISO-8601 日期时间格式的一些示例如下所示:

  • YYYY-MM-DD

  • YYYY-MM-DDTHH:mm

  • YYYY-MM-DDTHH:mm:SS

  • YYYY-MM-DDTHH:mm:SS.ssss

  • YYYY-MM-DDTHH:mm:SSZ

重要

如果您在图表中输入一个指定了显式时区的 datetime 值,并在稍后查询该值,则该值将以协调世界时 (UTC) 的形式返回,而不会包含任何时区信息。

原因是 Neptune 将转换所有日期和时间并将其存储为 UTC 形式,以便能够有效地对其进行比较。这对性能很重要,但会导致丢失有关原始时区的信息。

脚本执行

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

在字符串查询提交中,可以使用分号 (;) 或换行符 (\n) 进行分隔来发布多个遍历。若要执行,除最后一个语句以外的每个语句都必须以 .iterate() 步骤结尾。仅返回最后遍历数据。请注意,这不适用于 GLVByteCode查询提交。

会话

Neptune 中的会话持续时间限制为仅 10 分钟。请参阅Grelin 会话TinkerPop会话参考了解更多信息。

事务

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

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

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

顶点和边缘 ID

Neptune Grelin 顶点和边缘 ID 必须属于类型String. 如果您在添加顶点或边缘时未提供 ID,则 UUID 会生成并转换为一个字符串;例如,"48af8178-50ce-971a-fc41-8c9a954cea62"。这些 ID 字符串支持 Unicode 字符,大小不能超过 55 MB。

注意

这表示用户提供的 ID 受支持,但它们在正常使用中是可选的。但是,NeptuneLoad命令要求所有 ID 使用~id字段采用 Neptune CSV 格式。

用户提供的 ID

用户提供的 ID 在 Neptune Grimlin 中允许,且具有以下规定。

  • 提供的 ID 是可选的。

  • 仅支持顶点和边缘。

  • 仅支持 String 类型。

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

注意

请勿为 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。有关属性基数的更多信息,请参阅顶点Grelin 中的话题JavaDoc.

更新顶点属性

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

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

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

Labels

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

重要

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

Variables

Neptune 不支持 Gemlin 变量且不支持bindings财产。

转义字符

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

Groovy 限制

Neptune 不支持不以开头的 Groovy 命令g. 这包括数学(例如:1+1)、系统调用(例如:System.nanoTime())和变量定义(例如:1+1)。

重要

Neptune 不支持完全限定类名称。例如,您在 Groovy 请求中必须使用 single,不能使用 org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.single

序列化

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

MIME type Serialization Configuration

application/vnd.gremlin-v1.0+gryo

GryoMessageSerializerv1d0 IO 注册表:[org.apache.tinkerpop.gremlin.gremlin.tinkergraph.结构。TinkerIo注册表 v1d0]

application/vnd.gremlin-v1.0+gryo-stringd

GryoMessageSerializerv1d0 serializeResultTo字符串:true
application/vnd.gremlin-v3.0+gryo GryoMessageSerializerv3d0 IO 注册表:[org.apache.tinkerpop.gremlin.gremlin.tinkergraph.结构。TinkerIo注册表 V3d0]

application/vnd.gremlin-v3.0+gryo-stringd

GryoMessageSerializerv3d0 serializeResultTo字符串:true

application/vnd.gremlin-v1.0+json

GraphSONMessageSerializergremlLv1d0 IO 注册表:[org.apache.tinkerpop.gremlin.gremlin.tinkergraph.结构。TinkerIo注册表 v1d0]

application/vnd.gremlin-v2.0+json

GraphSONMessageSerializerv2d0   (only works with WebSockets) IO 注册表:[org.apache.tinkerpop.gremlin.gremlin.tinkergraph.结构。TinkerIo注册表 v2d0]

application/vnd.gremlin-v3.0+json

GraphSONMessageSerializerV3d0

application/json

GraphSONMessageSerializerV3d0 IO 注册表:[org.apache.tinkerpop.gremlin.gremlin.tinkergraph.结构。TinkerIo注册表 V3d0]

application/vnd.graphbinary-v1.0

GraphBinaryMessageSerializerV1

Lambda 步骤

Neptune 不支持 Lambda 步骤。

不支持的 Gremlin 方法

Neptune 不支持以下 Gremlin 方法:

  • 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())

不支持的 Gremlin 步骤

Neptune 不支持以下 Gremlin 步骤:

  • Gremlinio () 步在 Neptune 中不支持。例如,查询g.io("graph.xml").read().iterate()不会和 Neptune 一起使用。

其他功能

Grimlin 的 Neptune 实现并没有暴露graph对象。以下部分介绍支持和不支持的 graph 功能。

Gremlin 图形支持的功能

以下是一组由 Neptune Gremlin 图形实现的功能。这些功能与由 graph.features() 命令返回的功能相同。

图形功能 Enabled
事务 true
ThreadedTransactions false
Computer false
持久性 true
ConcurrentAccess true
变量功能 Enabled
Variables false
SerializableValues false
UniformList值 false
BooleanArray值 false
DoubleArray值 false
IntegerArray值 false
StringArray值 false
BooleanValues false
ByteValues false
DoubleValues false
FloatValues false
IntegerValues false
LongValues false
MapValues false
MixedList值 false
StringValues false
ByteArray值 false
FloatArray值 false
LongArray值 false
顶点功能 Enabled
MetaProperties false
DuplicateMulti属性 false
AddVertices true
RemoveVertices true
MultiProperties true
UserSuppliedId true
AddProperty true
RemoveProperty true
NumericIds false
StringIds true
UuidIds false
CustomIds false
AnyIds false
顶点属性功能 Enabled
UserSuppliedId false
AddProperty true
RemoveProperty true
NumericIds true
StringIds true
UuidIds false
CustomIds false
AnyIds false
属性 true
SerializableValues false
UniformListValues false
BooleanArray值 false
DoubleArray值 false
IntegerArray值 false
StringArray值 false
BooleanValues true
ByteValues true
DoubleValues true
FloatValues true
IntegerValues true
LongValues true
MapValues false
MixedList值 false
StringValues true
ByteArray值 false
FloatArray值 false
LongArray值 false
边缘功能 Enabled
AddEdges true
RemoveEdges true
UserSuppliedId true
AddProperty true
RemoveProperty true
NumericIds false
StringIds true
UuidIds false
CustomIds false
AnyIds false
边缘属性功能 Enabled
属性 true
SerializableValues false
UniformList值 false
BooleanArray值 false
DoubleArray值 false
IntegerArray值 false
StringArray值 false
BooleanValues true
ByteValues true
DoubleValues true
FloatValues true
IntegerValues true
LongValues true
MapValues false
MixedList值 false
StringValues true
ByteArray值 false
FloatArray值 false
LongArray值 false