属性、结构化与构造值
Cypher® 对多种数据值类型提供了一流的支持。这些类型分为以下三类:属性(property)、结构(structural)和 构造(constructed)。本节将首先简要概述每种类型,然后详细介绍属性数据类型。
属性类型
属性类型值是指可以存储为节点或关系属性的值。
属性类型是 Cypher 中最原始的类型,包括:BOOLEAN、DATE、DURATION、FLOAT、INTEGER、LIST、LOCAL DATETIME、LOCAL TIME、POINT、STRING、VECTOR、ZONED DATETIME 和 ZONED TIME。
-
属性类型可以从 Cypher 查询中返回。
-
属性类型可用作 参数。
-
属性类型可以存储为属性。
-
属性类型可以使用 Cypher 字面量来构造。
仅在 Neo4j 企业版中使用 块格式 或在 Aura 实例上时,才支持将 VECTOR 类型值存储为属性。此功能在 Neo4j 社区版中不可用。
Cypher 还提供对字节数组的传递支持,字节数组可以存储为属性值。支持字节数组是出于性能考虑,因为使用 Cypher 的通用数据类型 LIST<INTEGER>(其中每个 INTEGER 都有 64 位表示)成本过高。然而,字节数组不被 Cypher 视为一等数据类型,因此它们没有字面量表示形式。
结构类型
以下数据类型包含在结构类型类别中:NODE、RELATIONSHIP 和 PATH。
-
结构类型可以从 Cypher 查询中返回。
-
结构类型不能用作 参数。
-
结构类型不能存储为属性。
-
结构类型不能使用 Cypher 字面量来构造。
NODE 数据类型包括:id、标签(label(s))以及属性映射。请注意,标签不是值,而是一种模式语法。
RELATIONSHIP 数据类型包括:id、关系类型、属性映射、起始节点 id 和结束节点 id。
PATH 数据类型是节点和关系的交替序列。
|
节点、关系和路径是模式匹配的结果。在 Neo4j 中,所有关系都有方向。但是,您可以在查询时使用无向关系的概念。 |
类型及其同义词
下表显示了类型及其句法同义词。
这些类型(及其同义词)可用在 类型谓词表达式 和 属性类型约束 中。当使用 valueType() 函数时,它们也会作为 STRING 值返回。
但是,并非所有类型都能在所有地方使用。
| 类型 | 同义词 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
所有 Cypher 类型都包含 null 值。要使其不可为空,可以在类型末尾附加 NOT NULL(例如 BOOLEAN NOT NULL, LIST<FLOAT NOT NULL>)。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() 函数输出的一致性。
向量类型标准化
以下规则适用于 VECTOR 标准化
-
没有定义坐标类型或维度的
VECTOR类型包含所有其他类型。 -
定义了坐标类型但没有维度的
VECTOR类型包含具有相同坐标类型和任意维度的VECTOR类型。 -
定义了维度但没有坐标类型的
VECTOR包含具有相同维度和任意坐标类型的VECTOR类型。 -
具有不同坐标类型或维度的
VECTOR类型无法标准化。
| 比较类型 | 标准化结果 | 原因 |
|---|---|---|
|
|
|
|
|
无法标准化 — 一个向量缺乏维度,另一个缺乏坐标类型。 |
|
|
相同类型,没有定义维度的向量包含另一个。 |
|
|
相同维度,没有定义坐标类型的向量包含另一个。 |
|
|
无法标准化 — 坐标类型不同。 |
|
|
无法标准化 — 维度不同。 |
|
|
无法标准化 — 坐标类型不同,即使维度匹配。 |
类型排序
类型排序如下
-
预定义类型
-
NOTHING -
NULL -
布尔值 (BOOLEAN) -
STRING -
INTEGER8* -
INTEGER16* -
INTEGER32* -
INTEGER(INTEGER64) -
FLOAT32* -
FLOAT(FLOAT64) -
DATE -
LOCAL TIME -
ZONED TIME -
LOCAL DATETIME -
ZONED DATETIME -
DURATION(持续时间) -
POINT -
NODE -
RELATIONSHIP -
VECTOR(按坐标类型和维度排序)
-
* 仅限向量的坐标类型。
-
构造类型
-
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 值常量。
| 类型 | 最小值 | 最大值 | 精度 |
|---|---|---|---|
|
|
|
- |
|
|
|
天 |
|
|
|
纳秒 |
|
|
|
32 位 |
|
|
|
64 位 |
|
|
|
8 位 |
|
|
|
16 位 |
|
|
|
32 位 |
|
|
|
64 位 |
|
|
|
纳秒 |
|
|
|
纳秒 |
|
Cartesian: ( Cartesian_3D: ( WGS_84: ( WGS_84_3D: ( |
Cartesian: ( Cartesian_3D: ( WGS_84: ( WGS_84_3D: ( |
|
|
- |
- |
- |
|
给定维度下坐标类型的最小值。 |
给定维度下坐标类型的最大值。 |
坐标类型的精度。 |
|
|
|
纳秒 |
|
|
|
纳秒 |
* 仅限向量的坐标类型。
Java 值详细信息
| 名称 | 值 |
|---|---|
|
127 |
|
-128 |
|
1.7976931348623157e+308 |
|
4.9e-324 |
|
3.4028235E38 |
|
1.4E-45 |
|
2147483647 |
|
-2147483648 |
|
2^63-1 |
|
-2^63 |
|
32767 |
|
-32768 |