注释
此功能目前处于公开预览状态。 此预览版在没有服务级别协议的情况下提供,不建议用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 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 排序时被视为最小值,从而提供可预测的排序行为。
非重复性与相等性
某些语句不会测试相等性,而是为了区分。 了解差异对于类似 DISTINCT 和 GROUP BY这样的作非常重要。
非重复测试遵循与一个关键例外相同的规则: NULL 与 NULL一个关键例外不同。 区别与涉及 NULL的相等性测试不同,这总是导致 UNKNOWN。
非重复性测试由以下方法使用:
-
RETURN DISTINCT:确定两行是否相互重复。 -
GROUP BY:确定两行在聚合过程中是否属于同一分组键。
如果至少有一列来自这两行的值是不同的,则表中的两行被视为非重复。
布尔值类型
布尔值是三值逻辑值 TRUE, FALSE以及 UNKNOWN。
注释
UNKNOWN 和 null 值相同。
UNKNOWN 只是类型的 BOOLnull 值。
相等的工作原理:
| 左值 | 右值 | 结果 |
|---|---|---|
| 正确 | 假 | 假 |
| 正确 | 正确 | 正确 |
| 正确 | 未知 | 未知 |
| 假 | 假 | 正确 |
| 假 | 正确 | 假 |
| 假 | 未知 | 未知 |
| 未知 | 假 | 未知 |
| 未知 | 正确 | 未知 |
| 未知 | 未知 | 未知 |
比较的工作原理:
FALSE 小于 TRUE。 涉及 UNKNOWN 结果 UNKNOWN的任何比较。
如何编写布尔文本:
TRUEFALSE-
UNKNOWN或NULL
类型语法:
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 ]
INT 并 INT64 指定相同的数值类型。
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 ]
DOUBLE、 FLOAT和 FLOAT64 所有指定相同的类型。
时态值类型
区域日期/时间值
区域日期时间值表示具有时区偏移量的 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
(NOTHING 并 NULL 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”(不区分大小写)可以转换为布尔值。
- 无效强制转换:尝试强制转换不兼容的值会导致运行时错误。