属性、结构和构造值
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
的最小正值,即最接近零的值。也可以存在负浮点数。