Amazon Neptune 引擎版本 1.3.2.0(2024 年 6 月 10 日) - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon Neptune 引擎版本 1.3.2.0(2024 年 6 月 10 日)

截至 2024 年 6 月 10 日,引擎版本 1.3.2.0 正在普遍部署中。请注意,新版本在每个区域的发布需要几天的时间。

注意

引擎版本 1.3.0.0 为自定义参数组和自定义集群参数组引入了一种新格式。因此,如果您要从 1.3.0.0 之前的引擎版本升级到引擎版本 1.3.0.0 或更高版本,则必须使用参数组系列 neptune1.3 重新创建所有现有的自定义参数组和自定义集群参数组。早期版本使用参数组系列 neptune1neptune1.2,而这些参数组不适用于版本 1.3.0.0 及更高版本。同样,对于 1.4.0.0 及更高的引擎版本,您应使用 1.4.0.0 集群参数组。请参阅Amazon Neptune 参数组了解更多信息。

警告

引擎版本 1.3.2.0 存在一些潜在问题,您需特别注意。有关更多信息,请参阅下面的 1.3.2.0 版本中的问题缓解部分。

此引擎版本中的改进

常规改进
  • 支持 TLS 1.3 版本,包括加密套件 TLS_AES_128_GCM_SHA256 和 TLS_AES_256_GCM_SHA384。TLS 1.3 为可选配置,TLS 1.2 仍为最低要求版本。

Gremlin 改进
  • TinkerPop 3.7.x 升级

    • 大幅扩展了 Gremlin 语言功能。

      • 新增字符串、列表和日期处理步骤。

      • 新增在 mergeV() 步骤中指定基数的语法。

      • union() 现在可作为起始步骤使用。

      • 如需了解 3.7.x 版本的详细变更,请参阅 TinkerPop 升级文档

    • 升级适用于 Java 客户端的 Gremlin 语言驱动时请注意,序列化器类已进行部分重命名。如果已指定,则需要更新配置文件和代码中的包和类名。

  • StrictTimeoutValidation(仅在通过实验室模式启用 StrictTimeoutValidation 后生效,需配置 StrictTimeoutValidation=enabled):当 StrictTimeoutValidation 参数设置为值 enabled 时,通过请求选项或查询提示指定的单查询超时时间,不得超过参数组中设置的全局超时值。若超出限制,Neptune 会抛出 InvalidParameterException。当该参数值为 disabled 时,可通过 /status 端点的响应确认此设置;在 Neptune 1.3.2.0 版本中,该参数的默认值为 Disabled

openCypher 改进
  • 与之前的引擎版本相比,Amazon Neptune 引擎版本 1.3.2.0 的 openCypher 查询性能的速度提高了 9 倍,吞吐量提高了 10 倍。

  • 低延迟查询和吞吐量性能改进:低延迟 openCypher 查询的整体性能改进。新版本还提高了此类查询的吞吐量。使用参数化查询时,这些改进更为显著。

  • 支持查询计划缓存:查询提交至 Neptune 时,查询字符串会被解析、优化并转换为查询计划,然后由引擎执行。应用程序通常依赖通用查询模式,这些模式会通过传入不同参数值来实例化。查询计划缓存可以通过缓存查询计划,避免对此类重复的模式进行解析和优化,从而降低整体延迟。

  • 改进 DISTINCT 聚合查询的性能。

  • 改进涉及可空变量的联接查询的性能。

  • 改进涉及“id(node/relationship)不等于某值”条件的查询的性能。

  • 扩展了对日期时间功能的支持(仅在实验室模式启用 DatetimeMillisecond 后生效,需配置 DatetimeMillisecond=enabled)。有关更多信息,请参阅 Neptune openCypher 实施中的时间支持(Neptune Analytics 和 Neptune 数据库 1.3.2.0 及更高版本)

在此引擎版本中修复的缺陷

常规改进
  • 在验证对 Graphlytics 存储桶访问权限时,更新了 NeptuneML 的错误提示信息。

Gremlin 修复
  • 修复了 DFE 查询转换中缺失标签信息的问题,该问题出现在非路径贡献步骤包含标签的场景中。例如:

    g.withSideEffect('Neptune#useDFE', true). V(). has('name', 'marko'). has("name", TextP.regex("mark.*")).as("p1"). not(out().has("name", P.within("peter"))). out().as('p2'). dedup('p1', 'p2')
  • 修复了 DFE 查询转换中的 NullPointerException 错误,该错误在查询被拆分为两个 DFE 片段执行时发生,且第一个片段被优化为不可满足节点。例如:

    g.withSideEffect('Neptune#useDFE', true). V(). has('name', 'doesNotExists'). has("name", TextP.regex("mark.*")). inject(1). V(). out(). has('name', 'vadas')
  • 修复了查询中 by() 调节器包含 ValueTraversal 且输入为 Map 时,Neptune 可能会抛出 InternalFailureException。例如:

    g.V(). hasLabel("person"). project("age", "name").by("age").by("name"). order().by("age")
openCypher 修复
  • 改进了 UNWIND 操作(例如将列表展开为单独值),以帮助防止出现内存不足(OOM)的情况。例如:

    MATCH (n)-->(m) WITH collect(m) AS list UNWIND list AS m RETURN m, list
  • 修复了通过 UNWIND 注入 ID 时,多个 MERGE 操作中的自定义 ID 优化问题。例如:

    UNWIND [{nid: 'nid1', mid: 'mid1'}, {nid: 'nid2', mid: 'mid2'}] as ids MERGE (n:N {`~id`: ids.nid}) MERGE (m:M {`~id`: ids.mid})
  • 修复了在复杂查询中访问属性和多跳双向关系时的内存激增问题。例如:

    MATCH (person1:person)-[:likes]->(res)-[:partOf]->(group)-[:knows]-(:entity {name: 'foo'}), (person1)-[:knows]->(person2)-[:likes]-(res2), (comment)-[:presentIn]->(:Group {name: 'barGroup'}), (person1)-[:commented]->(comment2:comment)-[:partOf]->(post:Post), (comment2)-[:presentIn]->(:Group {name: 'fooGroup'}), (comment)-[:contains]->(info:Details)-[:CommentType]->(:CommentType {name: 'Positive'}), (comment2)-[:contains]->(info2:Details)-[:CommentType]->(:CommentType {name: 'Positive'}) WHERE datetime('2020-01-01T00:00') <= person1.addedAfter <= datetime('2023-01-01T23:59') AND comment.approvedBy = comment2.approvedBy MATCH (comment)-[:contains]->(info3:Details)-[:CommentType]->(:CommentType {name: 'Neutral'}) RETURN person1, group.name, info1.value, post.ranking, info3.value
  • 修复了以 null 作为分组变量的聚合查询问题。例如:

    MATCH (n) RETURN null AS group, sum(n.num) AS result
SPARQL 修复
  • 修复了 SPARQL 解析器,提高了处理包含大量三元组和大令牌的 INSERT DATA 等大查询的解析速度。

1.3.2.0 版本中的问题缓解

  • 在版本 1.3.2.0 中,当在内层 WITH 子句中使用参数化的 skiplimit 时,查询计划缓存存在问题。例如:

    MATCH (n:Person) WHERE n.age > $age WITH n skip $skip LIMIT $limit RETURN n.name, n.age parameters={"age": 21, "skip": 2, "limit": 3}

    在这种情况下,第一次查询计划中的 skip 和 limit 参数值会被应用到后续查询,可能导致意外结果。

    缓解方法

    为防止该问题,在提交包含参数化 skip 和/或 limit 子句的查询时,请添加查询提示 QUERY:PLANCACHE "disabled"。或者,也可以将这些值直接硬编码到查询中。

    选项 1:使用查询提示禁用查询计划缓存:

    Using QUERY:PLANCACHE "disabled" MATCH (n:Person) WHERE n.age > $age WITH n skip $skip LIMIT $limit RETURN n.name, n.age parameters={"age": 21, "skip": 2, "limit": 3}

    选项 2:硬编码 skip 和 limit 值:

    MATCH (n:Person) WHERE n.age > $age WITH n skip 2 LIMIT 3 RETURN n.name, n.age parameters={"age": 21}
  • 使用数值过滤条件的查询在启用查询计划缓存时可能返回错误结果。为避免此问题,请使用查询提示 QUERY:PLANCACHE "disabled" 跳过查询计划缓存。例如,使用:

    USING QUERY:PLANCACHE "disabled" MATCH (n:person) WHERE n.yearOfBirth > $year RETURN n parameters={"year":1950}
  • 多次使用相同参数名的查询可能失败,提示错误 Parameter name should not be a number and/or contain _internal_ or _modified_user_ string within it. These are reserved for planCache. Otherwise, rerun with HTTP parameter planCache=disabled。在这种情况下,可以像上面那样跳过查询计划缓存,或者像下面示例中那样对参数进行重复设置:

    MATCH (n:movie) WHERE n.runtime>=$minutes RETURN n UNION MATCH (n:show) WHERE n.duration>=$minutes RETURN n parameters={"minutes":130}

    使用提示 QUERY:PLANCACHE "disabled" 或修改参数:

    MATCH (n:movie) WHERE n.runtime>=$rt_min RETURN n UNION MATCH (n:show) WHERE n.duration>=$dur_min RETURN n parameters={"rt_min":130, "dur_min":130}
  • 使用 Bolt 协议执行的查询,如果是 UNION 或 UNION ALL 查询,可能会返回错误结果。为避免此问题,可以考虑通过 HTTP 端点执行该特定查询。或者,在使用 Bolt 协议时,将联合查询的每一部分分别执行。

此版本支持的查询语言版本

在将数据库集群升级到版本 1.3.2.0 之前,请确保您的项目与以下查询语言版本兼容:

  • 支持的 Gremlin 最早版本:3.7.1

  • 支持的 Gremlin 最新版本:3.7.1

  • openCypher 版本:Neptune-9.0.20190305-1.0

  • SPARQL 版本:1.1

引擎版本 1.3.2.0 的升级路径

您可以从引擎版本 1.2.0.0 或更高版本升级到此版本。

升级到此版本

如果数据库集群运行的引擎版本有此版本的升级路径,则可以立即对其进行升级。您可以使用控制台上的数据库集群操作或使用 SDK 升级任何符合条件的集群。以下 CLI 命令将立即升级符合条件的集群:

对于 Linux、OS X 或 Unix:

aws neptune modify-db-cluster \ --db-cluster-identifier (your-neptune-cluster) \ --engine-version 1.3.2.0 \ --allow-major-version-upgrade \ --apply-immediately

对于 Windows:

aws neptune modify-db-cluster ^ --db-cluster-identifier (your-neptune-cluster) ^ --engine-version 1.3.2.0 ^ --allow-major-version-upgrade ^ --apply-immediately

您可以指定 --no-apply-immediately,而不是 --apply-immediately。要执行主要版本升级,需要使用 allow-major-upgrade 参数。另外,请务必包括引擎版本,否则您的引擎可能会升级到其它版本。

如果集群使用自定义集群参数组,请确保包含以下参数以指定此参数组:

--db-cluster-parameter-group-name (name of the custom DB cluster parameter group)

同样,如果集群中的任何实例使用自定义数据库参数组,请确保包含此参数以指定此参数组:

--db-instance-parameter-group-name (name of the custom instance parameter group)

升级前始终先测试

发布新的主要或次要 Neptune 引擎版本时,请务必先在该版本上测试您的 Neptune 应用程序,然后再升级到该版本。即使是次要版本升级,也可能引入会影响代码的新特征或行为。

首先,将当前版本的发行说明页面与目标版本的发行说明页面进行比较,以查看查询语言版本是否会发生变化或是否会发生其它重大更改。

在升级生产数据库集群之前测试新版本的最佳方法是克隆生产集群,以便克隆运行新的引擎版本。然后,您可以在不影响生产数据库集群的情况下在克隆上运行查询。

请在升级之前始终创建手动快照

在执行升级之前,我们强烈建议您始终创建数据库集群的手动快照。拥有自动快照只能提供短期保护,而手动快照在您显式删除它之前仍然可用。

在某些情况下,作为升级过程的一部分,Neptune 会为您创建手动快照,但您不应依赖此快照,无论如何都应创建自己的手动快照。

当您确定不需要将数据库集群恢复到其升级前的状态时,可以显式删除自己创建的手动快照以及 Neptune 可能已创建的手动快照。如果 Neptune 创建手动快照,则其名称将以 preupgrade 开头,后跟数据库集群的名称、源引擎版本、目标引擎版本和日期。

注意

如果您在待处理操作正在进行时尝试升级,则可能会遇到如下错误:

We're sorry, your request to modify DB cluster (cluster identifier) has failed. Cannot modify engine version because instance (instance identifier) is running on an old configuration. Apply any pending maintenance actions on the instance before proceeding with the upgrade.

如果遇到此错误,请等待待处理操作完成,或者立即触发维护时段,让之前的升级完成。

有关升级引擎版本的更多信息,请参阅维护 Amazon Neptune 数据库集群。如果您有任何问题或疑问,可通过社区论坛和 Amazon Premium Support 联系 Amazon Support 团队。