跳至主要内容

Amazon Neptune:深入了解 AWS 的完全托管图数据库

了解 Amazon Neptune 如何通过属性图与 RDF 等图模型处理高度关联的数据。学习如何使用 Gremlin、openCypher 和 SPARQL 为欺诈检测与推荐等真实任务编写查询。
· 12分钟 阅读

使用 AI 探索

如果您还不熟悉,Amazon Neptune 是 AWS 提供的一项完全托管的图数据库服务,专为存储和查询高度关联的数据(如社交网络)而设计。它针对这样一种场景进行了优化:数据点之间的关系与数据本身同等重要。

正如您稍后将看到的,Amazon Neptune 支持两大图模型:属性图(具有带键值属性的节点和边)以及包含主语-谓语-宾语三元组的 RDF(资源描述框架)。Amazon Neptune 与三种主流查询语言兼容,包括 Gremlin、openCypher 和 SPARQL。这些都很令人兴奋,下面开始吧。

什么是 Amazon Neptune?

如前所述,Amazon Neptune 是一款为快速关系查询而构建的专用图数据库,能够以低延迟处理数十亿个节点和边。它支持用于社交、推荐与网络分析的属性图(以灵活性著称),以及在语义网、知识图谱和通用关联数据中作为标准的 RDF。

Amazon Neptune 部署在多个 AWS 区域,实现全球覆盖与灾难恢复。若您关心安全性,它符合诸如医疗领域的 HIPAA、支付领域的 PCI DSS,以及整体安全的 ISO 等关键监管标准,因而适用于敏感与受监管的工作负载。若想进一步了解图数据库,可阅读我们的博文 What is A Graph Database? A Beginner's Guide。

Amazon Neptune 的工作原理

Amazon Neptune 的数据库引擎最初基于 Blazegraph,现已由 AWS 演进与增强,以实现高性能和高可靠性。它支持多种查询语言:Gremlin(用于遍历属性图,例如在社区图中查找“朋友的朋友”)、openCypher(用于属性图查询的声明式类 SQL 语法),以及 SPRQL(应为 SPARQL,用于查询 RDF 数据并支持语义关系与本体)。

Neptune 将数据存储在由 SSD 支持的集群卷上,并在多个可用区间进行复制以保证持久性,这使其存储对产品需求而言格外快速且响应灵敏。此外,它支持多达 15 个只读副本以分担读取流量并提升可用性,并能平滑处理实例故障。这意味着 Neptune 会自动故障转移到只读副本。

此外,AWS 高效管理硬件、软件更新和备份。因此,Neptune 是确保容错与自愈存储的极佳选择。若要更深入理解 AWS,可学习我们的 AWS Concepts 课程。

Amazon Neptune 的核心特性

Amazon Neptune 功能与优势丰富,是业内出色的选择。本节将带您了解 Neptune 需要重点关注的主要特性。

可扩展性与性能

Amazon Neptune 可根据您的使用情况实现良好扩展,并兼顾性能取舍。它会随数据增长自动扩展存储至 64TB 或更高,支持每秒数万条查询的高吞吐,并为交互式应用提供毫秒级实时响应;即便是大型且复杂的图,也能高效处理数十亿条关系。

安全与合规

Neptune 的高性能并未以安全为代价:所有静态数据使用 AWS KMS 加密、传输中使用 TLS 加密;它部署在 VPC 中以实现私有且安全的网络;并通过 AWS IAM 角色与策略实现细粒度权限控制。其合规资质同样有力背书,已通过 HIPAA、PCI DSS、ISO 等认证,适用于受监管行业。

与 AWS 的集成

不出意外,Amazon Neptune 能与多种 AWS 服务及整体生态系统良好集成。例如,您可以借助 Amazon S3 轻松高效地导入与导出海量数据集;在 Amazon CloudWatch 上监控性能、设置告警并分析日志;在 AWS Lambda 上基于数据库事件触发无服务器函数;以及在与 Neptune 连接的 EC2 实例 上运行应用程序。

此外,Neptune 也是开展机器学习任务的利器,因为它可与 Amazon SageMaker 高度配合以集成机器学习实现高级分析。事实上,还有专门的 Neptune ML,用于内置机器学习任务,如链接预测与节点分类。

Amazon Neptune 的应用场景

Amazon Neptune 拥有大量可用于各类任务的功能。本节将介绍 Neptune 的一些真实世界应用。

身份图与客户数据

Neptune 存储与查询图数据的能力,使其适合将来自多源的客户数据聚合为统一画像。它利用关系数据实现推荐与沟通的个性化。此外,它也非常适用于欺诈检测,如识别信用卡欺诈——通过分析用户、账户与交易之间的关联来发现可疑模式。同时,借助图结构的数据,它还能用于定向广告,通过分析用户画像投放相关广告。

推荐引擎

推荐引擎通常高度依赖图数据,因此选择合适的引擎是上线前的关键一步。Neptune 为推荐系统提供了完备工具箱。典型应用包括电商(基于用户行为与商品关系推荐产品)、媒体平台(根据用户偏好与社交关系推荐电影、音乐或文章),以及社交平台(通过分析用户交互来推荐好友、群组或内容)。

知识图谱与欺诈检测

当下企业在解决方案中高度依赖 AI 集成,其中一例是采用具代理能力的工作流或 AI 驱动洞察。此类方案通常以知识图谱构建稳健能力:通过组织与关联信息,实现语义搜索与 AI 驱动洞察(如 GraphRAG 等常用技术)以增强 AI 解决方案。Neptune 同样适用于语义搜索,以理解实体关系来提升搜索相关性;在金融服务中,它可通过追踪复杂交易网络与关系来检测洗钱与欺诈。其他用例还包括药物发现、网络安全与供应链管理等。

快速上手 Amazon Neptune

Amazon Neptune 与 AWS 生态集成良好。下面我将带您了解在 Neptune 上的主要配置与使用步骤。

设置 Neptune

要开始使用 Neptune,请按以下步骤进行:

1. 打开平台中的 Neptune 部分

然后点击 Launch Amazon Neptune 进入创建页面。

Amazon Neptune Front Page

此图展示了 Amazon Neptune 的首页。

2. 配置数据库引擎选项

如果您希望固定容量并手动扩展,请选择预置(provisioned)引擎类型;若偏好根据工作负载自动扩缩,请选择无服务器(serverless)。版本可根据具体用例选择。

Engine Options

此图展示了创建数据库时“引擎选项”面板中的可选参数。

3. 为集群标识符命名

您可选择如“mydbcluster”之类的名称。请遵循面板中提到的命名规范。

DB cluster identifier settings

4. 设置容量参数

设置 Neptune 在处理过程中可访问的容量单元边界。容量单元越多,成本越高。因此务必结合应用规模合理设置。

Capacity settings tab

5. 选择模板

如需高可用性、持久性与性能的预配置实例,可选择生产模板;若处于开发阶段,建议使用开发模板,以实现成本优化并用最少资源快速测试,因为此时对高可用与持久性的需求并不迫切。

Template settings tab

此图展示了 Neptune 数据库创建中的模板设置。

选择模板后,可用性与持久性设置会自动选定。例如,选择生产模板会自动开启跨可用区创建副本,而开发模板则不会。

6. 连接性设置

选择要部署 Neptune 集群的虚拟私有云(VPC)。您也可以点击其他连接性配置来设置子网与安全组。

Connectivity Settings Panel

此部分对于管理集群的所有安全策略至关重要。

您可以通过点击屏幕左侧面板中的“Notebooks”进入 Notebooks 区域,快速建立连接:

Notebooks Panel

默认会有一个演示 notebook,其中包含用于测试数据库连接等任务的基本查询。您也可以点击屏幕右侧的“actions”切换到 Graph Explorer。还可以使用提供的端点从应用或开发工具进行连接。

在 Amazon Neptune 中编写查询

本节将分别用三种 Neptune 支持的语言给出“Hello World”式的示例查询:

Gremlin

Gremlin 查询由一连串从左到右求值的操作/函数组成。以下示例演示添加两个顶点和一条边:

g.addV('Person').property('id','1').property('name','Alice')
.as('a').
addV('Person').property('id','2').property('name','Bob')
.as('b').
addE('knows').from('a').to('b');

其中,.addV('Person')…property(…) 指示引擎创建一个标签为 "Person" 的顶点,并为其附加 "id" 与 "name" 等属性;.as('a') / .as('b') 为每个新顶点赋予引用(“a”与“b”)以便后续关联;.addE('knows').from('a’).to('b') 则创建从 Alice 到 Bob 的、标签为 knows 的边。

以下是检索示例:

g.V().hasLabel('Person').valueMap('id','name');

其中 g.V().hasLabel('Person').valueMap('id','name') 会查找标签为 Person 的所有顶点,并返回其 id 与 name 属性。

openCypher

Cypher 查询使用类似 ASCII 艺术风格的模式来创建与匹配图元素。以下示例演示创建两个节点与一条关系:

CREATE (a:Person {id: '1', name: 'Alice'}),
(b:Person {id: '2', name: 'Bob'})
CREATE (a)-[:KNOWS]->(b);

其中,(a:Person {…}) 定义了一个带有 id 与 name 属性、标签为 Person 的节点;第二条 CREATE 使用 (a)-[:KNOWS]->(b) 添加从 a 指向 b 的有向 KNOWS 关系。

以下是检索方式:

MATCH (p:Person)
RETURN p.id, p.name;

其中,MATCH (p:Person) 查找所有带有 Person 标签的节点,RETURN p.id, p.name 则返回每个节点的 id 与 name。

SPARQL

SPARQL 在 RDF 三元组之上工作,使用 PREFIX 声明与图模式。以下示例演示插入两个资源及其关系:

PREFIX ex: <http://example.com/>
INSERT DATA {
ex:Alice a ex:Person ;
ex:name "Alice" .
ex:Bob a ex:Person ;
ex:name "Bob" .
ex:Alice ex:knows ex:Bob .
}

其中 PREFIX ex:… 定义了命名空间速记。在 INSERT DATA 中,每个三元组块以 . 结束:ex:Alice a ex:Person 指定 RDF 类型,ex:name "Alice" 添加名称字面量,ex:Alice ex:knows ex:Bob 创建链接。

以下是选择查询:

SELECT ?person ?name WHERE {
?person a ex:Person ;
ex:name ?name .
}

其中 ?person a ex:Person 匹配所有类型为 ex:Person 的主语,?person ex:name ?name 则将其 ex:name 取至变量 ?name。

监控与优化

正确使用 CloudWatch 能高效跟踪 Neptune 的性能:开启增强监控(最短至 1 秒间隔)以获取 CPU、内存、磁盘与网络指标。您还可关注如 Engine CPU Utilization 与 Freeable Memory(识别 CPU/内存压力)、Buffer Cache Hit Ratio(了解缓存效率,越高越好)、Query Latency 与 Query Throughput(查询耗时与每秒服务数量)等指标。借助 CloudWatch 仪表板与告警,分别可一目了然地把握趋势,并触发通知或自动扩缩。此外,可集成日志,启用 Neptune 慢查询日志并将其发送至 CloudWatch Logs。

当然,还有许多最佳实践可进一步优化您在 Neptune 上的工作流,我将其分为两类。若您尚不清楚 AWS CloudTrail 与 AWS CloudWatch 的区别,建议阅读我们的博文 AWS CloudTrail vs AWS CloudWatch: A Beginner's Guide。

查询优化

优化良好的工作流离不开查询优化,以下是一些关键提示:

  • 使用索引与标签:在 Gremlin/openCypher 中为常用查询的属性建立索引。例如 Gremlin 中的 g.createIndex('name','vertex'),以及 openCypher 中的 CREATE INDEX FOR (n:Person) ON (n.name)。在 SPARQL 中使用定义良好的 RDF 类与谓词以加速模式匹配。

  • 剖析与调优查询:在 openCypher 中使用 EXPLAIN,在 Gremlin 中使用 PROFILE 查看遍历与过滤位置。应尽可能将过滤前移,减少扫描数据量,例如 g.V().has('Person','age',gt(30)).out('knows')…

  • 避免笛卡尔积:在 Cypher 中应始终连接模式而非匹配无关子图,否则处理时间会急剧上升。对于 SPARQL,要严格限定图模式范围以避免对大集合进行交叉连接。

  • 使用批量写入与批量导入:将顶点/边创建合并为更少的请求,或使用 Neptune 的批量装载(如 S3 上的 CSV/JSON)高效摄取海量数据。

管理大型数据集

管理大型数据集不同于处理小而有限的数据,因为某些查询需要的微观控制会随数据规模呈指数增长。以下是 Amazon Neptune 中的一些助力功能:

  • 只读副本:将重读型负载卸载到最多 15 个只读副本,将分析查询路由至副本以保持主写节点的响应性。
  • 归档旧数据:应用 TTL,或定期导出并移除陈旧的节点/边,保持工作图规模小巧。
  • 按域划分:将超大图拆分为多个集群,如“社交”与“交易”,并在应用中路由查询。
  • 监控存储增长:时刻关注自动扩展的存储并设置告警,避免容量突发问题。
  • 定期审查慢查询:每周检查慢查询日志,调优或处理有问题的查询模式。

Amazon Neptune 的优缺点

Neptune 优势多、技巧多,但在选型时也有一些限制需要注意。

优点

缺点

完全托管:无需管理服务器或备份

对于小规模或低使用量工作负载可能成本较高

可扩展:可处理大型图与高查询量

仅支持 Gremlin、openCypher 和 SPARQL

支持行业标准查询语言

供应商锁定:与 AWS 基础设施绑定

与 AWS 服务的强安全性、合规与集成

在极其复杂的查询下可能触及性能上限

高可用与自动故障转移

对底层基础设施的可控性较少

内置 Neptune ML 机器学习能力

从其他图数据库迁移可能需要适配

Amazon Neptune 与 Neo4j 及其他的比较

图数据库如今竞争激烈,尤其是在 LLM、RAG 与具代理能力工作流兴起的背景下。虽然 Neptune 优势明显,但也有许多潜在演进方向,如更深入的 AI/ML 集成、更完善的分析与可视化,以及更多查询语言或互操作性。

不过,市面上也有不少竞争者,例如知名的 Neo4j,它提供属性图并有强大的社区,但与 AWS 的集成略逊;TigerGraph 则专注高性能,但管理更复杂;ArangoDB 也是强劲对手,提供图、文档、键值等多模型数据,但与 AWS 的紧密集成不如 Neptune。

若您需要托管服务、AWS 集成与强合规,建议选择 Neptune;若需要更强的灵活性或多云支持,也可考虑替代方案。Amazon Neptune 与 Neo4j 的取舍尤其不易,建议在做出选择前做好功课。

结语

Neptune 非常适合需要管理与分析高度关联数据的应用。它完全托管、可扩展、安全,并与 AWS 服务及其生态深度集成。

欢迎继续与我们一起学习。若对文中提到的内容不熟悉,可学习我们的 AWS Concepts 课程,祝您在使用 Amazon Neptune 的旅程中一切顺利!

Iheb Gafsi

作者

Iheb Gafsi

我从事加速型 AI 系统的研发,面向去中心化数据与分布式工作负载,构建支持边缘智能的联邦式机器学习流水线。我的工作重点包括大模型、语音处理、计算机视觉、强化学习以及先进的机器学习拓扑结构。

您可能会关心的 Amazon Neptune 问题

为何无法从我的应用或 notebook 连接到 Neptune 集群?

这通常是由于安全组配置错误或缺少 8182 端口的入站规则所致。请确保在 Neptune 的安全组中,已允许您的应用子网或 IP 通过 TCP 端口 8182 访问。对于 SageMaker notebook,请确认入站规则包含该子网的 CIDR 段。

主实例与只读副本之间会有多少延迟?

副本与主实例共享相同存储,因此复制延迟通常只有几十毫秒。

Neptune 的复制是否会增加我的存储成本?

不会,复制已包含在价格中。您只需为数据库使用的逻辑存储付费,而非底层复制存储。

Neptune 故障转移期间会发生什么,耗时多久?

如果存在只读副本,Neptune 会将某个副本提升为主实例并更新端点,通常在 30 秒内完成。若不存在副本,则会创建新实例,可能需要长达 15 分钟。应用应在故障转移后重试连接。

能否为已存在的未加密 Neptune 数据库开启加密?

不能。您必须创建一个新的加密实例并迁移数据。对于新建数据库,支持静态与传输中加密。

主题