在 Microsoft Fabric 中设计图形架构

注释

此功能目前处于公开预览状态。 此预览版在没有服务级别协议的情况下提供,不建议用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版的使用条款

图形架构是用于定义图形结构的节点类型、边缘类型及其属性的集合。 设计良好的图形架构使数据更易于查询、维护和扩展。 本文提供了将湖仓中的表格数据转换为在 Microsoft Fabric 中标记有效的属性图的最佳做法。

在图形模型编辑器中开始建模之前,请使用这些准则。 有关创建节点和边缘的分步说明,请参阅 图形教程。 本文中的示例使用 Adventure Works 示例数据集

重要

Graph 当前不支持架构演变。 对数据建模后,节点、边和属性的结构将被固定。 结构更改(如添加属性、修改标签或更改关系类型)需要创建新的图形模型并重新加载所有数据。 此过程需要一段时间并消耗容量,因此在开始建模之前,请彻底规划架构。

先决条件

了解节点类型和边缘类型

在设计架构之前,请了解以下核心概念:

节点类型定义图形中的实体,例如客户、产品或订单。 它由以下部分组成:

  • 一个标签,它是标识此类别节点的名称。 例如,Customer。 在查询中使用标签来引用此类型的节点。
  • 映射表,它是为节点类型提供源数据的 lakehouse 表。 例如, adventureworks_customers 表。
  • 在图形模型编辑器中标记为ID关键列,用于唯一标识每个节点。 例如,CustomerID_K
  • 属性,即表中的列,用作每个节点上的属性。 例如 、 FirstNameLastNameEmailAddress

节点是节点类型的单个实例 - 映射表中的一行。 例如, adventureworks_customers 中的每个行都会成为节点 Customer

边缘类型定义两种节点类型之间的关系。 它由以下部分组成:

  • 标签,它是标识此关系类别的名称。 例如,purchases
  • 一个 映射表 ,其中包含源节点和目标节点之间的关系数据。 例如, adventureworks_orders 表。
  • 源节点类型和边连接的目标节点类型。 例如, Customer 作为源和 Order 目标。

边缘是边缘类型的单个实例 - 映射表中连接两个特定节点的一行。

注释

在图形模型编辑器中, “添加节点 ”和 “添加边缘 ”按钮创建节点类型和边缘类型,而不是单个节点或边缘。

标识实体和关系

首先在数据中标识 实体 (事物)和 关系 (连接)。 实体变化为节点类型。 实体之间的连接将成为边缘类型。

请问以下有关源表的问题:

  • 什么是主要实体? 表示不同实际事物的行是节点类型的候选项。 例如,客户、产品、订单和员工。
  • 这些实体如何相互关联? 引用另一张表(外键)中行的列可以指示边类型。 例如,CustomerID_FK表中的一个orders指向customers表,这表明建议建模为purchases边缘。
  • 是否有嵌入实体? 表中的列可能表示值得提取到其自己的节点类型的不同实体。 有关示例,请参阅 “选择节点类型”。 有关分步演练,请参阅 从一个映射表中添加多个节点和边缘类型

选择节点类型

为需要独立查询或遍历的每个实体创建节点类型。 使用以下准则:

将实体设为 节点类型 时... 保持它作为一个属性当...
需要遍历到它或穿过它。 它是仅供读取的描述性元数据,而非供遍历。
多个实体与其共享关系。 它对于所属实体是独一无二的。
需要在查询中直接按其进行匹配或分组。 仅将其作为另一个实体的属性进行筛选。

例子: 在 Adventure Works 数据集中, Country 以表上的 employees 列开头。 如果需要查询“哪些员工在同一国家/地区生活?”或“哪些国家/地区拥有最多员工?”,请提取 Country 到其自己的节点类型。 如果只需要将员工的国家/地区显示为标签,请将其保留为属性。

选择关键列

每个节点类型都需要唯一标识每个节点的键列(或复合键)。 仔细选择密钥:

  • 使用源表中的现有唯一标识符。 例如,CustomerID_KProductID_K
  • 除非没有自然键,否则应避免使用缺乏业务意义的代理键。 例如,首选 CustomerID 而不是自动递增行号。
  • 当单个列不能保证唯一性时,请使用复合键。 例如,ProductVersion节点可能需要ProductIDVersionNumber同时作为其密钥。
  • 匹配 键列与边缘映射中使用的外键列之间的数据类型。 不匹配的类型会导致边缘创建失败。

小窍门

定义 节点键约束 ,使查询引擎能够对键属性执行直接查找。 此优化可加快通过键检索特定节点的数据库查询。

选择边缘类型

边缘类型定义节点类型之间的关系。 每个边缘类型通过映射表将源节点类型连接到目标节点类型。

遵循以下准则:

  • 请使用描述性标签,这些标签应当为动词或动词短语。 例如:purchasessellslivesInbelongsTo。 命名良好的边缘使查询更易于阅读。
  • 仔细考虑方向。 图中的边缘是定向的。 选择最能代表真实关系的方向。 例如,Customer --比>OrderOrder --更>Customer自然地读取。
  • 为连接不同节点类型对的边缘类型提供不同的名称。 如果“员工销售订单”和“客户购买订单”都连接 Order,请命名它们 sellspurchases 而不是同时提供相同的标签。 有关详细信息,请参阅 边缘创建限制

向边缘类型添加属性

与节点类型不同,边缘类型从无属性开始。 可以选择在数据描述关系本身而不是任一终结点时添加属性。 编写需要筛选、聚合或返回有关关系本身的数据的 GQL 查询时,边缘属性最有用。

若要添加属性,请在图形模型编辑器中双击边缘类型以打开 “编辑边缘架构 ”对话框,选择 “添加属性”,然后从映射表中选择列。

何时添加边缘属性: 如果列回答了“多少?”、“when?”或“以什么方式?”表示两个节点之间的连接,则它属于边缘,而不是位于任一节点上。

例子:在 Adventure Works 数据集中,contains边通过Order表将Product连接到。 列,例如 OrderQtyUnitPriceLineTotal,描述了关系——在特定订单中某种产品的数量及其价格。 列(例如 OrderDateShipDate)用于描述顺序本身,应该属于 Order 节点类型,而不是位于边缘。

重要

边的映射表必须包含与源节点和目标节点类型的键列在值和数据类型上匹配的列。 用于创建节点类型的表也可以用作边缘映射表(如果它们满足此要求)。

删除不必要的属性

从映射表创建节点类型时,表中的每个列默认变为属性。 过多的属性会增加存储、查询速度缓慢,并使图形更难维护。 出于这些原因,请删除不需要查询或分析的属性。

注释

边缘类型的工作方式不同 - 它们从无属性开始。 只需使用“编辑边缘架构”对话框中的“添加属性”按钮手动添加所需的属性。

对于每个节点类型,只保留以下属性:

  • 为了确保节点的唯一性,必须使用键列。
  • WHERE 查询中的筛选器或 RETURN 投影中使用
  • 下游分析或可视化所需的内容

有关属性计数如何影响查询性能的详细信息,请参阅 仅返回所需的属性

选择数据类型

为每个属性选择最具体的数据类型。 正确的类型可提高存储效率和查询性能:

  • 使用 INTUINT64 用于数字标识符和计数。 数值比较比字符串比较更快。
  • 使用 ZONED DATETIME 作为时间戳,而非字符串格式的日期。
  • 请使用 BOOLEAN 作为 true/false 标志,而不是使用诸如 "yes""no" 之类的字符串值。

有关支持类型的完整列表,请参阅 当前限制 - 数据类型

常见的表格到图模式

下表总结了一些常见的表格数据结构如何转换为图形元素:

表格结构 图形结果 示例
一对多: 带外键的父表 + 子表 由边缘类型连接的两个节点类型。 Customer -- 购买 -->Order
多对多: 中间表链接两个表 两个节点类型之间的边缘类型。 Vendor -- produces-->Product
嵌入实体: 表示共享实体的列 带边缘的提取节点类型。 Employee -- livesIn-->Country
层次结构: 父子表关系链 每个级别节点类型通过边缘链接。 Product -- 类型为-->Subcategory --属于-->Category

有关嵌入实体模式的分步演练,请参阅 从一个映射表添加多个节点和边缘类型

更改图形架构

Graph 不支持架构演变。 保存图形模型后,节点类型、边缘类型及其属性的结构是固定的。 若要进行结构更改(例如将属性添加到节点类型、删除边缘类型或更改键列),必须创建新的图形模型并重新加载数据。

更改图形架构:

  1. 在工作区中,创建连接到同一 lakehouse 的新图形项目。
  2. 在图形模型编辑器中,添加所需的节点类型和边缘类型,包括任何新的或修改的属性。
  3. 配置键列和边缘映射。 确保数据类型在键列和外键列之间匹配。
  4. 选择 “保存 ”以引入数据并生成新图形。
  5. 更新任何查询集以指向新图形。
  6. 验证新图形是否按预期工作后,如果不需要原始图形项,请将其删除。