Spanner Graph 是 Spanner 和 Spanner Omni 的一项功能,可让您直接在 Spanner 中使用图数据库构建和查询属性图。 Spanner Graph 将 Spanner 的可伸缩性和可靠性与图建模和查询的强大功能相结合。
属性图将数据建模为节点(实体)和边(实体之间的关系),两者都可以具有属性(标签和元数据)。这对于社交网络、欺诈检测和推荐引擎等复杂且高度关联的数据尤其有用。
本文档中的主题适用于 Spanner Omni,就像它们适用于 Spanner 一样。
设置和查询 Spanner Graph
如需开始使用 Spanner Graph,您必须先创建 Spanner Omni 部署和数据库。创建数据库后,您可以定义属性图架构,该架构将现有的 Spanner Omni 表映射到图节点和边。
设置架构并将数据插入底层表后,您可以使用 Graph Query Language (GQL)(GoogleSQL 的扩展,实现了 ISO GQL 标准)运行图查询。如需了解详情, 请参阅 Spanner 文档中的设置和查询 Spanner Graph 。
Spanner Graph 架构概览
Spanner Graph 架构将您的关系型数据解读为图。该架构指定了构成图的节点表和边表。每个表都会将 Spanner 表中的行映射到图元素。元素可以具有标签来对其进行分类,还可以具有属性来存储属性。如需了解详情,请参阅 Spanner 文档中的 架构概览。
创建和管理 Spanner Graph 架构
您可以使用数据定义语言 (DDL) 语句来创建、更新或删除属性图定义。CREATE PROPERTY GRAPH 语句用于定义图,并指定底层表、键和标签。如需了解详情,请参阅 Spanner 文档中的
创建和管理 Spanner Graph 架构
。
设计架构的最佳实践
高效的架构设计对于性能至关重要。最佳实践包括:
使用交错将边与其源节点并置。
使用引用限制条件(外键)来帮助确保图的完整性。
对经常过滤的属性创建二级索引。
根据查询模式在架构化设计和无架构设计之间进行选择。
如需了解详情,请参阅 Spanner 文档中的设计架构的最佳实践 。
使用 SQL 视图创建属性图
您可以使用 SQL 视图来定义图的节点和边。如需了解 使用 SQL 视图和表创建图之间的区别,请参阅 Spanner 文档中的使用视图而非表创建图的优势 。
从 SQL 视图创建的图概览
使用视图作为抽象层可提供行级访问权限控制、灵活的数据转换,并实现从无架构数据模型到正式数据模型的平稳过渡。如需了解详情,请参阅从 SQL 视图创建的图概览。
从 SQL 视图创建图
如需从视图创建图,请使用标准 SQL 定义视图。然后,在 CREATE PROPERTY GRAPH 语句的 NODE TABLES 或 EDGE TABLES 子句中引用它们。您必须为每个基于视图的元素显式定义 KEY。KEY 子句用于指定源视图中的列,这些列可唯一标识每个图元素。如需了解详情,请参阅
Spanner 文档中的从 SQL 视图创建图。
管理 Spanner Graph 数据
您可以通过修改定义图的底层表来管理 Spanner Graph 中的数据。如需了解详情,请参阅 Spanner 文档中的 管理 Spanner Graph 数据。
| 操作 | 说明 |
|---|---|
| 插入 | 使用 INSERT 语句或突变 API 向节点表和边表添加新行。 |
| 更新 | 通过更新底层表中的相应列来修改现有属性。 |
| 删除 | 通过删除相应的行来移除节点或边。当您删除节点时,使用 ON DELETE CASCADE 自动移除关联的边。 |
Spanner Graph 查询
Spanner Graph 支持 Graph Query Language (GQL),用于查询以遍历 和分析图数据。
查询概览
图查询使用 GRAPH 子句指定目标图,并使用 MATCH 子句定义要查找的模式。您可以返回节点和边属性,也可以对结果执行聚合。如需了解详情,请参阅
Spanner 文档中的
查询概览。
使用路径
路径表示图中的节点和边序列。您可以使用 PATH_LENGTH()、NODES() 和 EDGES() 等函数查找两个节点之间的所有路径、查找最短路径,或根据路径的属性或长度过滤路径。如需了解详情,请参阅
Spanner文档中的使用路径。
调优查询的最佳实践
如需优化图查询,请执行以下操作:
从基数较低的节点开始遍历。
为所有节点和边模式显式指定标签。
使用
IS_FIRST()函数限制从高基数 超级节点遍历的边的数量。
如需了解详情,请参阅 Spanner 文档中的调优查询的最佳实践 。
将全文搜索与 Spanner Graph 搭配使用
Spanner Graph 与 Spanner 全文搜索功能集成,可让您使用 SEARCH() 函数根据非结构化文本属性搜索节点或边。如需了解详情,请参阅 Spanner 文档中的
将全文搜索与 Spanner Graph 搭配使用
。
将向量搜索与 Spanner Graph 搭配使用
您可以对图数据执行向量相似度搜索,以查找 K 最近邻 (KNN) 或近邻 (ANN)。这对于基于相似度的推荐和 AI 驱动的应用非常有用。如需了解详情,请参阅 Spanner 文档中的 将向量搜索与 Spanner Graph 搭配使用 。
使用 Spanner Graph 管理无架构数据
对于数据模型不断演变的应用,Spanner Graph 支持无架构数据管理。您可以将所有节点和边存储在具有 JSON 列的单个通用表中,以存储属性,这样您无需更改 DDL 即可添加新类型和属性。如需了解详情,请参阅
Spanner 文档中的使用 Spanner Graph 管理无架构数据
。
迁移到 Spanner Graph
您可以将现有图数据从其他数据库迁移到 Spanner Graph。此过程通常涉及将数据导出为 CSV 或 JSON 文件,然后将其导入到支持新属性图的 Spanner 表中。如需了解详情,请参阅 Spanner 文档中的 将数据迁移到 Spanner Graph。
适用于 openCypher 用户的 Spanner Graph 参考文档
如果您有 openCypher 背景,则 Spanner Graph 中的 GQL 实现对您来说很熟悉,但存在一些语法差异。
此参考文档可帮助您将 openCypher 概念和查询映射到 Spanner Graph MATCH 和 RETURN 语义。如需了解详情,请参阅
适用于 openCypher 用户的 Spanner Graph 参考文档
在 Spanner 文档中。
排查 Spanner Graph 问题
Spanner Graph 中的常见问题包括引用完整性违规(悬空边)和查询运行缓慢。问题排查涉及检查架构定义、检查缺失的节点或边,以及使用查询计划来识别性能瓶颈。如需了解详情,请参阅 排查 Spanner Graph 问题(位于 Spanner 文档)中。