GQL 图形类型

注释

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

图形类型通过定义哪些节点和边缘可以存在来描述图形的结构。 将其视为蓝图或架构,它根据图形的标签和属性指定节点和边缘的形状。 对于边缘(节点之间的连接),它还指定了哪些类型的边缘可以连接哪些类型的节点。 如果熟悉关系数据库,图形类型的工作方式与 ER 关系图描述表和外键关系的方式类似。

重要

本文仅使用 社交网络示例图数据集

图形类型提供几个关键优势:

  • 数据验证:确保图形仅包含有效的节点和边缘组合。
  • 查询优化:帮助查询引擎了解数据结构以提高性能。
  • 文档:为开发人员和分析师提供图形结构的明确规范。

注释

本文从概念上介绍图形类型,并使用 GQL 标准中定义的语法来说明其定义。 但是,Microsoft Fabric 中的图形目前不支持此语法。

在结构上,图形类型定义图形类型的允许节点类型和边缘类型的图形,以及进一步限制这些图形的其他约束。

注释

图形类型通过提供一组节点类型、边缘类型和约束定义来定义。 更改这些定义的顺序不会更改正在定义的图形类型。

定义节点类型

节点类型指定节点可以具有哪些标签和属性类型。 下面介绍如何指定基本节点类型:

(:Organization => { 
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
})

此示例创建一个节点类型,该节点类型定义具有以下项的节点:

  • 标签 Organization
  • id包含无符号整数值且不能为 null 的属性。
  • 保存 name 字符串值(可以为 null)的属性。
  • 保存 url 字符串值(可以为 null)的属性。

运算符 :: 指定每个属性的数据类型,同时 NOT NULL 指示该属性必须始终具有值。

注释

NOT NULL 被视为 GQL 中类型的一部分,它不同于 SQL。

节点类型可能更为复杂,具有更多属性和数据类型:

(:Person => {
    id :: UINT64 NOT NULL,
    creationDate :: ZONED DATETIME,
    firstName :: STRING,
    lastName :: STRING,
    gender :: STRING,
    birthday :: UINT64,
    browserUsed :: STRING,
    locationIP :: STRING
})

具有多个标签的节点类型

节点可以有多个标签来支持继承和分类。 可以为节点类型指定多个标签,但一个标签(“键标签”) 必须 唯一标识节点类型(如果只指定了一个标签,则将其设置为节点类型的键标签)。

例如,请考虑:

(:University => :Organization),

(:Company => :Organization)

University Company此处是定义的两个节点类型的键标签,同时Organization是两种类型共享的辅助标签。 请注意键标签和辅助标签在每个节点类型中如何分隔 => 。 此方法创建一个类型层次结构,其中大学和公司都是组织类型。

由于键标签标识节点类型,因此使用此语法时,由辅助标签标识的节点类型的属性会自动继承。 因此,可以理解以前的语法来有效地定义以下节点类型:

(:University => :Organization {
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
}),

(:Company => :Organization {
  id :: UINT64 NOT NULL, 
  name :: STRING, 
  url :: STRING 
})

注释

定义节点类型层次结构时,键标签至关重要。 它们可帮助系统了解当多个类型共享同一标签时所引用的节点类型。

使用继承快捷方式节省时间

从父节点类型重复标签和属性会变得繁琐且容易出错。 Microsoft Fabric 中的 Graph 提供了运算符, += 因此只能指定额外的(非herited)标签和属性类型:

(:Post => :Message += {
    language :: STRING,
    imageFile :: STRING
})

如果未指定其他属性,图形将从父类型继承所有必需属性:

(:Comment => :Message)  -- Same as: (:Comment => :Message += {})

使用抽象节点类型

即使图形不包含该类型的具体节点,也可以完全定义用于生成层次结构的节点类型。 抽象节点类型可用于创建概念分组和共享属性集。 为此,可以在 Microsoft Fabric 中将节点类型定义为 ABSTRACT 图形:

ABSTRACT (:Message => {
    id :: UINT64 NOT NULL,
    creationDate :: ZONED DATETIME,
    browserUsed :: STRING,
    locationIP :: STRING,
    content :: STRING,
    length :: UINT64
})

抽象节点类型不适用于直接图形加载,它们仅可用于构建层次结构并定义共享属性。 可以使用数据加载从抽象类型继承的具体节点类型。

定义边缘类型和系列

边缘类型定义边缘的键标签、属性类型和边缘的终结点节点类型。 在图形数据库中,边缘表示节点之间的连接。 边缘定义告知系统图形中允许哪些关系:

(:Person)-[:knows { creationDate :: ZONED DATETIME }]->(:Person)

此边缘类型定义以下各项的所有边缘:

  • (键)标签 knows
  • 一个 creationDate 属性,用于保存 ZONED DATETIME 值(时间戳与时区偏移量)。
  • 源终结点和目标终结点必须是 Person 节点。

箭头 -> 指示边缘的方向,从源到目标。 此方向信息对于理解图形的语义至关重要。

下面是边缘类型的更多示例:

(:Person)-[:studyAt { classYear :: UINT64 }]->(:University)
(:Person)-[:workAt { workFrom :: UINT64 }]->(:Company)

只需为终结点节点类型指定密钥标签(PersonUniversityCompany),无需重复完整的节点类型定义。 系统将这些引用解析为完整的节点类型定义。

图形边缘类型系列

图形边缘键标签的工作方式与节点键标签不同。 在图形类型中,可以有多个具有相同键标签的边缘类型,只要它们具有相同的标签和属性类型。 但是,具有相同键标签的两种边缘类型在至少一个终结点节点类型中必须有所不同。 我们将一组边缘类型称为具有相同键标签的 边缘类型系列

通过此概念,可以在不同类型的实体之间为同一类型的关系建模。

Example:

(:City)-[:isPartOf]->(:Country),
(:Country)-[:isPartOf]->(:Continent)

这两种边缘类型都使用 isPartOf 标签,但它们连接不同类型的节点,形成表示分层包含关系的边缘类型系列。

在边类型定义中使用节点子类型

必须详细说明每种可能的边缘类型会有点繁琐。 为了简化,也可以定义与端点所隐含的节点类型层级对齐的边类型族。

示例:

-- Node types
ABSTRACT (:Message { ... }),
(:Post => :Message { ... }),
(:Comment => :Message { ... }),

-- All edge types (x)-[:hasTag]->(:Tag) where x is at least a (:Message)
(<:Message)-[:hasTag]->(:Tag) 

这隐含定义了以下边类型:

(:Post)-[:hasTag]->(:Tag) 
(:Comment)-[:hasTag]->(:Tag) 

支持的属性类型

定义属性类型时,属性值类型必须是 Microsoft Fabric 支持的图形类型。 选择正确的数据类型对于存储效率和查询性能非常重要。

下面是可用于属性值的数据类型:

  • INT(另: INT64
  • UINT(另: UINT64
  • STRING
  • BOOL(另: BOOLEAN
  • DOUBLE (另: FLOAT64FLOAT
  • T NOT NULL,其中 T 任一上述数据类型。
  • LIST<T>LIST<T> NOT NULL,其中 T 任一数据类型为上述任何数据类型。

有关值类型的完整信息,请参阅 GQL 值和值类型

重要

具有与给定图形类型的节点类型或边缘类型相同的所有属性类型必须指定相同的属性值类型。 唯一的例外是:它们是否包含 null 值可能有所不同。 例如,根据此规则,具有 (:A { id :: STRING }), (:B { id :: STRING NOT NULL}) 的图形类型有效,而具有 (:A { id :: STRING }), (:B { id :: INT}) 的图形类型将无效。

设置节点密钥约束

节点键约束定义图形中的每个节点如何由一个或多个其属性值唯一标识。 关键约束的工作方式类似于关系数据库中的主键约束,并确保数据完整性。 节点键约束可以针对多个节点类型的目标节点,这样就可以为整个概念层次结构定义节点键。

了解关键约束至关重要,因为它们:

  • 确保唯一性:根据业务逻辑防止重复节点。
  • 启用高效的查找:允许系统优化搜索特定节点的查询。
  • 支持数据集成:提供一种稳定的方式来引用不同数据源中的节点。

重要

对于 Microsoft Fabric 中的图形,只有一个关键约束必须约束每个节点。

节点密钥约束的工作原理

可以在图形类型中指定节点键约束。 每个节点键约束都有特定的特征,可使其有效工作:

节点键约束的组件:

  • 在图形类型中具有唯一的名称,便于参考。
  • 使用简单的 约束模式 定义目标节点,该模式指定约束适用的节点。
  • 定义构成唯一键值的属性。

Example:

CONSTRAINT person_pk
  FOR (n:Person) REQUIRE n.id IS KEY

此语法创建一个person_pk的所有节点调用Person节点键约束。 该约束可确保图形中的每个节点通过其 id 属性唯一标识。 标签不能有两个节点 Person 具有相同 id 的值。

还可以定义结合使用多个属性的复合键,以确保使用 CONSTRAINT ... FOR ... REQUIRE (n.prop1, n.prop2) IS KEY 语法的唯一性。

重要

键约束中使用的属性:

  • 不能为 null
  • 必须在键约束所针对的节点类型和边缘类型中声明为NOT NULL