属性、结构和构造值
Cypher® 提供对多种数据值类型的一流支持。这些类型分为以下三类:属性、结构和构造。本节将首先简要概述每种类型,然后详细介绍属性数据类型。
属性类型
属性类型值是可以存储为节点或关系属性的值。
属性类型是 Cypher 中最原始的类型,包括:BOOLEAN、DATE、DURATION、FLOAT、INTEGER、LIST、LOCAL DATETIME、LOCAL TIME、POINT、STRING、ZONED DATETIME 和 ZONED TIME。
-
属性类型可以从 Cypher 查询中返回。
-
属性类型可以用作参数。
-
属性类型可以存储为属性。
-
属性类型可以使用 Cypher 字面量构造。
简单类型的同构列表可以存储为属性,尽管一般列表(参见构造类型)不能存储为属性。存储为属性的列表不能包含 null 值。
Cypher 还提供对字节数组的直通支持,字节数组可以存储为属性值。支持字节数组是出于性能原因,因为使用 Cypher 的通用数据类型 LIST<INTEGER>(其中每个 INTEGER 都有 64 位表示)会过于昂贵。然而,字节数组并不被 Cypher 视为一流数据类型,因此它们没有字面表示。
结构类型
以下数据类型属于结构类型类别:NODE、RELATIONSHIP 和 PATH。
-
结构类型可以从 Cypher 查询中返回。
-
结构类型不能用作参数。
-
结构类型不能存储为属性。
-
结构类型不能使用 Cypher 字面量构造。
NODE 数据类型包括:id、标签以及属性映射。请注意,标签不是值,而是一种模式语法形式。
RELATIONSHIP 数据类型包括:id、关系类型、属性映射、起始节点 id 和结束节点 id。
PATH 数据类型是节点和关系的交替序列。
|
节点、关系和路径是模式匹配的结果。在 Neo4j 中,所有关系都有方向。但是,您可以在查询时拥有无向关系的概念。 |
类型及其同义词
下表显示了类型及其语法同义词。
这些类型(及其同义词)可以在类型谓词表达式和属性类型约束中使用。当使用valueType() 函数时,它们也以 STRING 值返回。
然而,并非所有类型都能在所有地方使用。
| 类型 | 同义词 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
所有 Cypher 类型都包含 null 值。为了使其不可为空,可以在类型末尾附加 NOT NULL(例如 BOOLEAN NOT NULL,LIST<FLOAT NOT NULL>)。Neo4j 5.14 中引入的 `NOT NULL` 的简写语法等价物是使用感叹号 !(例如 INTEGER!,LIST<STRING!>)。请注意,封闭的动态类型(INNER_TYPE_1 | INNER_TYPE_2…)不能附加 NOT NULL:所有内部类型都必须可为空,或者都附加 NOT NULL。
类型规范化
Cypher 对所有输入类型运行规范化算法,将给定类型简化为等效类型的确定性表示。类型被简化为其默认名称(例如,BOOL 被简化为 BOOLEAN)。包容性类型被吸收(例如,LIST<BOOLEAN> | LIST<BOOLEAN | INTEGER> 被规范化为 LIST<BOOLEAN | INTEGER>)。类型也有序。
类型 PROPERTY VALUE 被扩展为所有有效属性类型的封闭动态联合,如果所有类型都已表示,则规范化将简化为 ANY。
例如,给定封闭动态类型 BOOL | LIST<INT> | BOOLEAN | LIST<FLOAT | INT>,规范化后的类型将是:BOOLEAN | LIST<INTEGER | FLOAT>。
此规范化运行在类型谓词表达式和属性类型约束中使用的类型上。类型规范化还用于确保 valueType() 函数输出的一致性。
类型的排序
类型的排序如下
-
预定义类型
-
NOTHING -
null -
BOOLEAN -
STRING -
INTEGER -
FLOAT -
DATE -
LOCAL TIME -
ZONED TIME -
LOCAL DATETIME -
ZONED DATETIME -
DURATION -
POINT -
NODE -
RELATIONSHIP
-
-
构造类型
-
MAP -
LIST<INNER_TYPE>(按内部类型排序) -
PATH
-
-
动态联合类型
-
INNER_TYPE_1 \| INNER_TYPE_2…(按封闭动态联合类型的特定规则排序) -
ANY
-
子类型始终在任何包含类型之前排序(例如,LIST<INTEGER> 在 LIST<INTEGER | FLOAT> 之前排序)。这也意味着每种类型的 NOT NULL 变体位于可为空变体之前。
两个封闭动态联合 A 和 B 之间的顺序确定如下
-
如果
A的内部类型少于B,则A排在前面。 -
如果
A和B具有相同数量的内部类型,则它们根据第一个不同内部类型的顺序(词典顺序)进行排序。
结果顺序是确定性的。
属性类型详情
下表提供了 Cypher 支持的各种属性类型的更详细信息。请注意,Cypher 类型是使用 Java 实现的,下表引用了 Java 值常量。
| 类型 | 最小值 | 最大值 | 精度 |
|---|---|---|---|
|
|
|
- |
|
|
|
天 |
|
|
|
纳秒 |
|
|
|
64 位 |
|
|
|
64 位 |
|
|
|
纳秒 |
|
|
|
纳秒 |
|
笛卡尔: ( 笛卡尔_3D: ( WGS_84: ( WGS_84_3D: ( |
笛卡尔: ( 笛卡尔_3D: ( WGS_84: ( WGS_84_3D: ( |
|
|
- |
- |
- |
|
|
|
纳秒 |
|
|
|
纳秒 |
FLOAT 的最小正值,即最接近零的值。也可以存在负浮点数。