Neptune 与 Neo4j 的兼容性 - Amazon Neptune

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

Neptune 与 Neo4j 的兼容性

Neo4j 采用一体化架构方法,其中数据加载、数据 ETL、应用程序查询、数据存储和管理操作都发生在同一组计算资源中,例如 EC2 实例。Amazon Neptune 是一个以 OLTP 为中心的开放规范图形数据库,其中,架构将操作分开并解耦资源,因此它们可以动态扩展。

Neo4j 中有各种特征和工具,包括第三方工具,它们不属于 openCypher 规范,与 openCypher 不兼容,或者与 Neptune 的 openCypher 实现不兼容。下面列出了其中一些最常见的特征和工具。

Neptune 中不存在的特定于 Neo4j 的特征

  • LOAD CSV – Neptune 加载数据的架构方法与 Neo4j 不同。为了实现更好的扩展和成本优化,Neptune 对围绕资源的问题进行了分离,并建议使用其中一种 AWS 服务集成(例如 AWS Glue)执行所需的 ETL 流程,以 Neptune 批量加载程序支持的格式准备数据。

    另一个选项是使用在 AWS 计算资源(例如 Amazon EC2 实例、Lambda 函数、Amazon Elastic Container Service、AWS Batch 任务等)上运行的应用程序代码来做同样的事情。该代码可以使用 Neptune 的 HTTPS 端点Bolt 端点

  • 精细的访问控制 – Neptune 支持使用 IAM 条件键对数据访问操作进行精细的访问控制。可以在应用程序层实施额外的精细访问控制。

  • Neo4j 结构 – Neptune 确实支持使用 SPARQL SERVICE 关键字跨数据库对 RDF 工作负载进行查询联合身份验证。由于目前没有针对属性图工作负载的查询联合身份验证的开放标准或规范,因此该功能需要在应用程序层实现。

  • 基于角色的访问控制 (RBAC) – Neptune 通过分配 IAM policy 和角色来管理身份验证。IAM policy 和角色在应用程序中提供了极其灵活的用户管理级别,因此在配置集群之前,值得阅读和理解 IAM 概述中的信息。

  • 加入书签 – Neptune 集群由单个写入器实例和最多 15 个只读副本实例组成。写入到写入器实例的数据符合 ACID 标准,并为后续读取提供了强有力的一致性保证。只读副本使用与写入器实例相同的存储卷并保持最终一致,通常在写入数据后不到 100 毫秒。如果您的用例迫切需要保证新写入的读取一致性,则应将这些读取定向到集群端点,而不是读取器端点。

  • APOC 过程 – 由于 APOC 过程未包含在 openCypher 规范中,因此 Neptune 不为外部过程提供直接支持。相反,Neptune 依靠与其它 AWS 服务的集成,以可扩展、安全和稳健的方式实现类似的最终用户功能。有时 APOC 过程可以用 openCypher 或 Gremlin 重写,有些过程与 Neptune 应用程序无关。

    一般而言,APOC 过程分为以下几类:

    • 导入 – Neptune 支持使用查询语言、Neptune 批量加载程序或作为 AWS Database Migration Service 的目标使用各种格式导入数据。可以使用 AWS Glue 和 neptune-python-utils 开源软件包对数据执行 ETL 操作。

    • 导出 – Neptune 支持使用 neptune-export 实用程序导出数据,该实用程序支持多种常见的导出格式和方法。

    • 数据库集成 – Neptune 支持使用 ETL 工具(如 AWS Glue)或迁移工具(如 AWS Database Migration Service)与其它数据库集成。

    • 图形更新 – Neptune 通过支持 openCypher 和 Gremlin 查询语言,支持一系列用于更新属性图数据的丰富特征。有关重写常用过程的示例,请参阅Cypher 重写

    • 数据结构 – Neptune 通过支持 openCypher 和 Gremlin 查询语言,支持一系列用于更新属性图数据的丰富特征。有关重写常用过程的示例,请参阅Cypher 重写

    • 时态(日期时间) – Neptune 通过支持 openCypher 和 Gremlin 查询语言,支持一系列用于更新属性图数据的丰富特征。有关重写常用过程的示例,请参阅Cypher 重写

    • 数学 – Neptune 通过支持 openCypher 和 Gremlin 查询语言,支持一系列用于更新属性图数据的丰富特征。有关重写常用过程的示例,请参阅Cypher 重写

    • 高级图形查询 – Neptune 通过支持 openCypher 和 Gremlin 查询语言,支持一系列用于更新属性图数据的丰富特征。有关重写常用过程的示例,请参阅Cypher 重写

    • 比较图形 – Neptune 通过支持 openCypher 和 Gremlin 查询语言,支持一系列用于更新属性图数据的丰富特征。有关重写常用过程的示例,请参阅Cypher 重写

    • Cypher 执行 – Neptune 通过支持 openCypher 和 Gremlin 查询语言,支持一系列用于更新属性图数据的丰富特征。有关重写常用过程的示例,请参阅Cypher 重写

  • 自定义过程 – Neptune 不支持用户创建的自定义过程。此功能必须在应用程序层实现。

  • 地理空间 – 尽管 Neptune 不为地理空间特征提供原生支持,但类似的功能可以通过将 AWS 与其它服务集成来实现,如以下博客文章所示:Ross Gabay 和 Abhilash Vinod 撰写的结合使用 Amazon Neptune 和 Amazon OpenSearch Service 进行地理空间查询

  • 图形数据科学 - Neptune 目前通过 Neptune Analytics 支持图形分析,Neptune Analytics 是一款支持图形分析算法库的内存优化型引擎。

    此外,Neptune 还提供与 AWS Pandas SDK 的集成以及几个示例笔记本,这些笔记本展示了如何在 Python 环境中利用这种集成对图形数据进行分析。

  • 架构约束 – 在 Neptune 中,唯一可用的架构约束是节点或边缘的 ID 的唯一性。没有特征可以为图形中的元素指定任何其它架构约束或任何其它唯一性或值约束。Neptune 中的 ID 值是字符串,可以使用 Gremlin 进行设置,如下所示:

    g.addV('person').property(id, '1') )

    鼓励需要利用 ID 作为唯一性约束的应用程序尝试使用这种方法来实现唯一性约束。如果应用程序使用多列作为唯一性约束,则可以将 ID 设置为这些值的组合。例如,id=123, code='SEA' 可以表示为 ID='123_SEA',以实现复杂的唯一性约束。

  • 多租赁 – Neptune 仅支持每个集群单个图形。要使用 Neptune 构建多租户系统,要么使用多个集群,要么在单个图形中对租户进行逻辑分区,然后使用应用程序端逻辑强制分离。例如,添加属性 tenantId 并将其包含在每个查询中,如下所示:

    MATCH p=(n {tenantId:1})-[]->({tenantId:1}) RETURN p LIMIT 5)

    Neptune 无服务器使得使用多个数据库集群实现多租赁变得相对容易,每个数据库集群都可以根据需要独立自动扩展。

Neptune 对 Neo4j 工具的支持

Neptune 为 Neo4j 工具提供了以下替代方案:

  • Neo4j 浏览器 – Neptune 提供开源图形笔记本,提供以开发人员为中心的 IDE,用于运行查询和可视化结果。

  • Neo4j Bloom – Neptune 支持使用第三方可视化解决方案进行丰富的图形可视化,例如 Graph-explorer、Tom Sawyer、Cambridge Intelligence、Graphistry、metaphacts 和 G.V()。

  • GraphQL – Neptune 目前通过自定义 AWS AppSync 集成支持 GraphQL。请参阅使用 Amazon Neptune 和 AWS Amplify 构建图形应用程序博客文章,以及示例项目使用 AWS AppSync 和 Amazon Neptune 构建无服务器卡路里跟踪器应用程序

  • NeoSemantics – Neptune 原生支持 RDF 数据模型,因此建议希望运行 RDF 工作负载的客户使用 Neptune 的 RDF 模型支持。

  • Arrows.app – 使用导出命令导出模型时创建的密码与 Neptune 兼容。

  • Linkurious Ogma此处提供了与 Linkurious Ogma 的集成示例。

  • Spring Data Neo4j – 这目前与 Neptune 不兼容。

  • Neo4j Spark 连接器 – Neo4j Spark 连接器可以在 Spark 任务中使用,以使用 openCypher 连接到 Neptune。以下是一些示例代码和应用程序配置:

    示例代码:

    SparkSession spark = SparkSession .builder() .config("encryption.enabled", "true") .appName("Simple Application").config("spark.master", "local").getOrCreate(); Dataset<Row> df = spark.read().format("org.neo4j.spark.DataSource") .option("url", "bolt://(your cluster endpoint):8182") .option("encryption.enabled", "true") .option("query", "MATCH (n:airport) RETURN n") .load(); System.out.println("TOTAL RECORD COUNT: " + df.count()); spark.stop();

    应用程序配置:

    <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-connector-apache-spark_2.12-4.1.0</artifactId> <version>4.0.1_for_spark_3</version> </dependency>

此处未列出的 Neo4j 特征和工具

如果您使用的工具或特征未在此处列出,则我们不确定它是否与 Neptune 或 AWS 中的其它服务兼容。如果您还有其它问题,请联系 AWS Support 或联系您的客户团队。