

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

# 应用程序从 Neo4j 迁移到 Neptune
<a name="migration-app-migration"></a>

将数据从 Neo4j 迁移到 Neptune 之后，下一步是迁移应用程序本身。与数据一样，根据您使用的工具、要求、架构差异等，有多种方法可以迁移应用程序。下面概述了在此过程中通常需要考虑的事项。

## 从 Neo4j 移到 Neptune 时迁移连接
<a name="migration-app-connections"></a>

如果您目前不使用 Bolt 驱动程序，或者想使用其它驱动程序，则可以连接到 [HTTPS 端点](access-graph-opencypher-queries.md)，该端点提供对返回数据的完全访问权限。

如果您的应用程序使用 [Bolt 协议](access-graph-opencypher-bolt.md)，则可以将这些连接迁移到 Neptune，并让应用程序使用与在 Neo4j 中使用的相同驱动程序进行连接。要连接到 Neptune，您可能需要对应用程序进行以下一项或多项更改：
+ 需要更新 URL 和端口才能使用集群端点和集群端口（默认为 8182）。
+ Neptune 要求所有连接都使用 SSL，因此您需要为每个连接指定对其进行加密。
+ Neptune 通过分配 [IAM policy 和角色](iam-auth.md)来管理身份验证。IAM policy 和角色在应用程序中提供了极其灵活的用户管理级别，因此在配置集群之前，请务必阅读和理解 [IAM 概述](iam-auth.md)中的信息。
+ 如[Neptune 中的 Bolt 连接行为](access-graph-opencypher-bolt.md#access-graph-opencypher-bolt-connections)中所述，Neptune 中 Bolt 连接的行为与它在 Neo4j 中的行为在几个方面有所不同。
+ 您可以在[使用 openCypher 和 Bolt 的 Neptune 最佳实践](best-practices-opencypher.md)中找到更多信息和建议。

[使用 Bolt 协议向 Neptune 进行 openCypher 查询](access-graph-opencypher-bolt.md)中提供了常用语言（例如 Java、Python、.NET 和 NodeJS）的代码示例，以及使用 IAM 身份验证等连接场景的代码示例。

## 从 Neo4j 移到 Neptune 时将查询路由到集群实例
<a name="migration-app-routing"></a>

Neo4j 客户端应用程序使用[路由驱动程序](https://neo4j.com/docs/driver-manual/1.7/client-applications/#routing_drivers_bolt_routing)并指定[访问模式](https://neo4j.com/docs/driver-manual/1.7/sessions-transactions/#driver-transactions-access-mode)，将读取和写入请求路由到因果集群中的相应服务器。

将客户端应用程序迁移到 Neptune 时，请使用 [Neptune 端点](feature-overview-endpoints.md)将查询高效地路由到集群中的相应实例：
+ 所有与 Neptune 的连接都应在 URL 中使用 `bolt://`，而不是 `bolt+routing://` 或 `neo4j://`。
+ 集群端点连接到集群中的当前主实例。使用集群端点将写入请求路由到主实例。
+ 读取器端点在集群中的只读副本实例之间[分配连接](best-practices-general-basic.md#best-practices-general-loadbalance)。如果您的单实例集群没有只读副本实例，则读取器端点将连接到主实例，而主实例支持写入操作。如果集群确实包含一个或多个只读副本实例，则向读取器端点发送写入请求会生成异常。
+ 集群中的每个实例也可以有自己的实例端点。如果您的客户端应用程序需要向集群中的特定实例发送请求，请使用实例端点。

有关更多信息，请参阅 [Neptune 端点注意事项](feature-overview-endpoints.md#feature-overview-endpoint-considerations)。

## Neptune 中的数据一致性
<a name="migration-app-consistency"></a>

使用 Neo4j 因果集群时，只读副本最终与核心服务器保持一致，但是客户端应用程序可以通过使用[因果链](https://neo4j.com/docs/driver-manual/1.7/sessions-transactions/#driver-transactions-causal-chaining)来确保因果关系的一致性。因果链需要在事务之间传递书签，这允许客户端应用程序写入核心服务器，然后从只读副本中读取自己的写入内容。

在 Neptune 中，只读副本实例最终与写入器一致，副本滞后通常小于 100 毫秒。但是，在复制更改之前，对现有边缘和顶点的更新以及新边缘和顶点的添加在副本实例上不可见。因此，如果您的应用程序需要通过读取每次写入操作在 Neptune 上即时保持一致，请使用集群端点执行先写后读操作。这是唯一一次使用集群端点进行读取操作。在所有其它情况下，请使用读取器端点进行读取。

## 将查询从 Neo4j 迁移到 Neptune
<a name="migration-app-queries"></a>

尽管 Neptune [对 openCypher 的支持](https://aws.amazon.com/blogs/database/announcing-the-general-availability-of-opencypher-support-for-amazon-neptune/)大大减少了从 Neo4j 迁移查询所需的工作量，但在迁移时仍有一些差异需要评测：
+ 如上面的[数据模型优化](migration-data-migration.md#migration-data-model-optimization)所述，可能需要对数据模型进行修改，以便为 Neptune 创建优化的图形数据模型，而这反过来又需要对查询进行更改并进行测试。
+ Neo4j 提供了各种特定于 Cypher 的语言扩展，这些扩展未包含在 Neptune 实现的 openCypher 规范中。根据用例和使用的特征，openCypher 语言中可能有一些变通办法，或者使用 Gremlin 语言或通过[重写 Cypher 查询以在 Neptune 上的 openCypher 中运行](migration-opencypher-rewrites.md)中描述的其它机制。
+ 应用程序通常使用其它中间件组件来与数据库进行交互，而不是 Bolt 驱动程序本身。请检查[Neptune 与 Neo4j 的兼容性](migration-compatibility.md)以了解是否支持您正在使用的工具或中间件。
+ 在失效转移的情况下，Bolt 驱动程序可能会继续连接到之前的写入器或读取器实例，因为提供给连接的集群端点已解析为 IP 地址。应用程序中的正确错误处理应该可以解决这个问题，如[在失效转移后创建新连接](best-practices-opencypher.md#best-practices-opencypher-renew-connection)中所述。
+ 当由于无法解决的冲突或锁定等待超时而取消事务时，Neptune 将使用 `ConcurrentModificationException` 进行响应。有关更多信息，请参阅 [引擎错误代码](errors-engine-codes.md)。作为最佳实践，客户端应始终捕获并处理这些异常。

  当多个线程或多个应用程序同时写入系统时，偶尔会出现 `ConcurrentModificationException`。由于[事务隔离级别](transactions-neptune.md#transactions-neptune-mutation)，这些冲突有时可能是不可避免的。
+ Neptune 支持对相同的数据同时运行 Gremlin 和 openCypher 查询。这意味着，在某些情况下，您可能需要考虑使用具有更强大查询功能的 Gremlin 来执行查询的某些功能。

如上面的[预调配基础设施](migration-provisioning-infrastructure.md)所述，每个应用程序都应通过调整大小操作来确保实例数量、实例大小和集群拓扑都针对应用程序的特定工作负载进行了优化。

此处讨论的迁移应用程序的注意事项是最常见的注意事项，但这并不是一个详尽的清单。每个应用程序都是唯一的。如果您还有其它问题，请联系 AWS Support 或联系您的客户团队。

## 迁移特定于 Neo4j 的特征和工具
<a name="migration-app-neo4j-specific"></a>

Neo4j 具有各种自定义特征和附加组件，它们具有您的应用程序可能依赖的功能。在评估是否需要迁移此功能时，通常需要调查 AWS 中是否有更好的方法来实现相同的目标。考虑到 [Neo4j 和 Neptune 之间的架构差异](migration-architectural-differences.md)，您通常可以找到利用其它 AWS 服务或[集成](integrations.md)的有效替代方案。

有关特定于 Neo4j 的特征和建议的解决方法的列表，请参阅[Neptune 与 Neo4j 的兼容性](migration-compatibility.md)。