GQL 值和值类型

注释

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

GQL 语言支持各种值,例如数字、字符串和图形元素。 这些值组织成称为值类型的集,这些值定义可以执行的作以及值在不同上下文中的行为方式。 了解类型系统对于编写正确的查询和避免运行时错误至关重要。

重要

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

关键概念:

  • 值类型可以为 null 或材料(不可为 null),具体取决于它们是否包括或排除 null 值。
  • 不可为 null 的值类型 按语法指定为 NOT NULL
  • 同一值 可以属于多个值类型(多态性)。
  • null 值 是每个可为 null 值类型的成员。

注释

默认情况下,所有值类型都是可以为 null 的,除非显式声明为 NOT NULL。 例如, INT 指定可为 null 的整数类型,同时 INT NOT NULL 指定材料整数类型。

如何组织值类型

所有值类型都属于两个主要类别,这些类别在查询中具有不同的用途:

  • 预定义值类型 - 内置于语言中(如数字、字符串和布尔值)。
  • 构造的值类型 - 由其他类型的(列表、路径)组成。

预定义值类型进一步组织为专用类别:

  • 布尔值类型 - 逻辑作的 True、false 和未知值。
  • 字符串值类型 - 支持 Unicode 的文本数据。
  • 数值类型 - 整数和浮点数。
  • 时态值类型 - 支持时区的日期和时间值。
  • 引用值类型 - 对图形中的节点和边缘的引用。
  • 非材料值类型 - 特殊值,如 null 和 nothing。

相等性和比较的工作原理

了解 GQL 如何比较值对于编写有效查询至关重要,尤其是在处理筛选、排序和联接时。

基本比较规则

  • 通常可以比较相同类型的值。
  • 所有数字可以相互比较(例如,具有浮点的整数)。
  • 只能比较引用相同类型的对象的引用值(节点引用与节点引用、边缘引用的边缘引用)。

比较中的 Null 处理

将任何值与 null 进行比较时,结果始终 UNKNOWN为 。 Null 处理遵循三值逻辑原则。 但是,该 ORDER BY 语句在 NULL 排序时被视为最小值,从而提供可预测的排序行为。

非重复性与相等性

某些语句不会测试相等性,而是为了区分。 了解差异对于类似 DISTINCTGROUP BY这样的作非常重要。

非重复测试遵循与一个关键例外相同的规则: NULLNULL一个关键例外不同。 区别与涉及 NULL的相等性测试不同,这总是导致 UNKNOWN

非重复性测试由以下方法使用:

  • RETURN DISTINCT:确定两行是否相互重复。
  • GROUP BY:确定两行在聚合过程中是否属于同一分组键。

如果至少有一列来自这两行的值是不同的,则表中的两行被视为非重复。

布尔值类型

布尔值是三值逻辑值 TRUEFALSE以及 UNKNOWN

注释

UNKNOWN 和 null 值相同。 UNKNOWN 只是类型的 BOOLnull 值。

相等的工作原理:

左值 右值 结果
正确
正确 正确 正确
正确 未知 未知
正确
正确
未知 未知
未知 未知
未知 正确 未知
未知 未知 未知

比较的工作原理:

FALSE 小于 TRUE。 涉及 UNKNOWN 结果 UNKNOWN的任何比较。

如何编写布尔文本:

  • TRUE
  • FALSE
  • UNKNOWNNULL

类型语法:

BOOL [ NOT NULL ]

字符串值类型

字符串是 Unicode 代码点的序列(可以是零长度)。 空字符串与 null 值不同。

比较的工作原理:

字符串通过比较其代码点的 Unicode 标量值进行比较(比较方法有时称为 UCS_BASIC 排序规则)。

如何编写字符串文本:

将字符括在双引号(")或单引号('):

"Hello, World!"
'Guten Tag!'

不能直接在字符串文本中指定某些 Unicode 控制字符。 具体而言,不允许 Unicode 常规类别类“Cc”和“Cn”中的所有字符。 请改用 C 样式 \-escapes:

Input 未转义字符
\\ \
\" "
\' '
\` `
\t U+0009
\b U+0008
\n U+000A
\r U+000D
\f U+000C
\uabcd U+ABCD
\UABCDEF01 U+ABCDEF01

GQL 还支持通过加倍周围 " 字符和 ' 字符来转义 SQL 样式:

实际字符串 C 样式 SQL 样式
多么具有讽刺意意的! "How \"ironic!\"" "How ""ironic!"""
如何“讽刺! 'How \'ironic!\'' 'How ''ironic!'''

小窍门

通过将字符串文本\作为前缀来禁用 C 样式 @-escapes。

类型语法:

STRING [ NOT NULL ]

数字类型

精确数字类型

Microsoft Fabric 中的 Graph 支持负整数或正整数的精确数字。

比较的工作原理:

系统将所有数字与其数值进行比较。

如何编写整数文本:

Description Example 价值
整数 123456 123456
整数 w. 分组 123_456 123456
显式正整数 +123456 123456
0 0
负整数 -123456 -123456

类型语法:

INT [ NOT NULL ]
INT64 [ NOT NULL ]
UINT [ NOT NULL ]
UINT64 [ NOT NULL ]

INTINT64 指定相同的数值类型。 UINT这样做和UINT64

近似数值类型

Microsoft Fabric 中的图形支持 IEEE(电气和电子工程师研究所)754 兼容的浮点数的近似数字。

比较的工作原理:

系统将所有数字与其数值进行比较。

如何编写浮点文本:

Description Example 价值
常见表示法 123.456 123.456
通用表示法 w. 分组 123_456.789 123456.789
科学表示法 1.23456e2 123.456
科学表示法(大写) 1.23456E2 123.456
带后缀的浮点 123.456f 123.456
带后缀的双精度 123.456d 123.456

其他数值注意事项:

  • 溢出和下溢:超出支持范围的整数作可能会导致运行时错误或包装行为,具体取决于实现。
  • 精度:浮点运算可能因 IEEE 754 表示限制而失去精度。
  • 特殊浮点值NaN (不是数字)、正无穷大(+∞)和负无穷大(-∞)可能在浮点上下文中受支持。

类型语法:

FLOAT [ NOT NULL ]
DOUBLE [ NOT NULL ]
FLOAT64 [ NOT NULL ]

DOUBLEFLOATFLOAT64 所有指定相同的类型。

时态值类型

区域日期/时间值

区域日期时间值表示具有时区偏移量的 ISO 8601 兼容日期时间。

比较的工作原理:

系统按时间顺序比较分区日期时间值及其绝对时间点。

如何编写日期/时间文本:

将 ISO 8601 格式与时区信息配合使用:

ZONED_DATETIME('2024-08-15T14:30:00+02:00')
ZONED_DATETIME('2024-08-15T12:30:00Z')
ZONED_DATETIME('2024-12-31T23:59:59.999-08:00')

类型语法:

ZONED DATETIME [ NOT NULL ]

引用值类型

引用值包含对匹配节点或边缘的引用。

节点引用值

节点引用值表示对图形中特定节点的引用。 通常在图形模式中匹配节点时获取这些值,并且可以使用它们来访问节点属性和执行比较。

比较的工作原理:

应仅比较节点引用值是否相等。 两个节点引用值在引用同一节点时才相等。

Microsoft Fabric 中的图形定义对引用值的确定性顺序。 但是,此顺序可能会从查询更改为查询,不应依赖于在生产查询中。

如何访问属性:

使用点表示法访问节点属性:

node_var.property_name

图形架构中的抽象节点类型:

使用图形类型时,可以定义用作继承基类型的抽象节点类型,但不能直接实例化。 抽象类型启用多态查询模式:

-- Abstract base type (cannot be instantiated)
ABSTRACT
(:Person => {
  id :: INT64,
  name :: STRING,
  birth_date :: ZONED DATETIME
}),

-- Concrete types that inherit from abstract base
(:Employee => Person {
  employee_id :: STRING,
  department :: STRING,
  hire_date :: ZONED DATETIME
})

(:Customer => :Person {
  customer_id :: STRING,
  membership_level :: STRING,
  registration_date :: ZONED DATETIME
})

具有抽象类型的多态查询:

抽象类型支持强大的查询模式,可在其中与基类型匹配以查找派生类型的所有实例:

-- Find all Person instances (both Employee and Customer)
MATCH (p:Person)
RETURN p.name, p.birthday, labels(p) AS label_names

-- Mixed type patterns
MATCH (e:Employee)-[:knows]-(c:Customer)
WHERE e.department = 'Sales' AND c.membership_level = 'Premium'
RETURN e.name AS sales_person, c.name AS customer

注释

前述查询采用上述图类型,未使用社交网络示例数据集。

此方法提供类型安全性,同时在图形架构中实现灵活的基于继承的数据建模。

类型语法:

NODE [ NOT NULL ]

图形边缘引用值

图形边缘引用值表示对图形中特定边缘的引用。 通常在图形模式中匹配边缘时获取这些值,并且可以使用它们来访问边缘属性和执行比较。

比较的工作原理:

只能比较边缘引用值是否相等。 两个边缘引用值在引用同一边缘时才相等。

如何访问属性:

使用点表示法访问边缘属性:

edge_var.property_name

类型语法:

EDGE [ NOT NULL ]

非材料值类型

非材料值类型不包含“普通”材料值。

Null 值

null 值表示缺少已知的材料值。 它是每个可以为 null 的值类型的成员,与任何材料值不同。 它是 null 类型的唯一值。

比较的工作原理:

将任何值与 null 进行比较时,结果为 UNKNOWN.

如何编写 null 文本:

NULL        -- type NULL
UNKNOWN     -- type BOOL

类型语法:

NULL

无类型

无类型是不包含任何值的值类型。

尽管它似乎是一种技术性,但任何类型都允许向空列表值等值分配精确类型。 任何类型都允许在需要列表值类型的任何位置传递空列表(无论所需的列表元素类型如何)。

类型语法:

NOTHING
NULL NOT NULL

NOTHINGNULL NOT NULL 指定同一类型)

构造的值类型

列出值

列表值是元素序列。 列表可以包含相同类型的元素,并且可以包含 null 值。

重要

目前,Microsoft Fabric 中的图形中的列表不能包含混合类型的元素。

比较的工作原理:

首先按大小比较列表,然后按元素的顺序按元素进行比较。 如果列表的大小相同,并且所有相应的元素都相等,则两个列表相等。

小窍门

涉及 null 元素值的比较始终会导致 UNKNOWN。 比较列表值时,Null 比较可能会导致令人惊讶的结果!

组列表:

组列表是由匹配的可变长度边缘模式绑定的列表。 Microsoft Fabric 中的图形将跟踪其状态为组列表。

组列表可用于水平聚合。 有关详细信息,请参阅 GQL 表达式和函数

如何编写列表文本:

使用方括号表示法创建列表:

[1, 2, 3, 4]
['hello', 'world']
[1, 'mixed', TRUE, NULL]
[]  -- empty list

如何访问元素:

使用带从零开始的索引的方括号来访问列表元素:

list_var[0]  -- first element
list_var[1]  -- second element

常见列表作:

-- Check if list contains a value
WHERE 'Engineering' IN employee.departments

-- List concatenation
RETURN [1, 2] || [3, 4]  -- [1, 2, 3, 4]

-- List size
size(list_var)

类型语法:

LIST<element_type> [ NOT NULL ]
LIST<element_type NOT NULL> [ NOT NULL ]

其中 element_type 可以是任何受支持的类型,例如 STRING、INT64、DOUBLE、BOOL 等。

路径值

路径值表示图形中匹配的路径。 路径值包含交替节点和边缘引用值的无空序列,这些值始终以节点引用值开头和结尾。 这些引用值标识图形中最初匹配路径的节点和边缘。

如何构建路径:

路径包括:

  • 节点和边缘序列: node₁ - edge₁ - node₂ - edge₂ - ... - nodeₙ
  • 始终以节点开头和结尾。
  • 包含至少一个节点(最小路径长度为零边缘)。

注释

目前不支持路径的文本语法。 相反,可以使用路径进行绑定 MATCH pathVar=...path pattern...

比较的工作原理:

通过比较参考值列表与其所有组成节点和边的比较,路径沿路径的顺序进行比较。

详情请参见 列表值参考值 的比较规则。

类型语法:

PATH [ NOT NULL ]

类型转换和强制转换

GQL 支持隐式和显式类型转换,以实现灵活的作,同时保持类型安全性。

隐式转换

当转换安全且不会丢失信息时,可以隐式转换某些值类型:

  • 数值加宽:在混合算术运算中使用时,整数值可以隐式转换为浮点类型。
  • 字符串上下文:值可以隐式转换为某些上下文中的字符串,例如串联作。

显式强制转换

使用 CAST 函数在兼容类型之间显式转换值:

CAST(value AS target_type)

示例:

CAST(123 AS STRING)           -- "123"
CAST('456' AS INT64)          -- 456
CAST(3.14 AS STRING)          -- "3.14"
CAST('true' AS BOOL)          -- TRUE

强制转换规则:

  • 到 STRING:大多数值类型都可以使用其文本表示形式强制转换为 STRING。
  • 对数值类型:包含有效数值文本的字符串可以强制转换为适当的数值类型。
  • 对于 BOOL:字符串“true”/“false”(不区分大小写)可以转换为布尔值。
  • 无效强制转换:尝试强制转换不兼容的值会导致运行时错误。