属性、结构和构造值
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 中,所有关系都有方向。但是,您可以在查询时拥有无向关系的概念。 |
构造类型
构造类型类别中包含以下数据类型:LIST
和 MAP
。
-
构造类型可以从 Cypher 查询中返回。
-
构造类型可以用作参数。
-
构造类型不能存储为属性(同构列表除外)。
-
构造类型可以使用Cypher 字面量进行构造。
LIST
数据类型可以是简单值的同构集合,也可以是异构的有序值集合,每个值都可以具有任何属性、结构或构造类型。
MAP
数据类型是 (键, 值) 对的异构、无序集合,其中键是字面量,值可以具有任何属性、结构或构造类型。
构造类型值也可以包含 null
。有关更多详细信息,请参阅使用 null。
类型及其同义词
下表显示了类型及其语法同义词。
这些类型(及其同义词)可以在类型谓词表达式和属性类型约束中使用。当使用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()函数输出的一致性。
类型的排序
类型的排序如下
-
预定义类型
-
空
-
空值
-
BOOLEAN
-
字符串
-
INTEGER
-
FLOAT
-
DATE
-
LOCAL TIME
-
带时区时间
-
LOCAL DATETIME
-
带时区日期时间
-
DURATION
-
点
-
节点
-
关系
-
-
构造类型
-
映射
-
LIST<INNER_TYPE>
(按内部类型排序) -
路径
-
-
动态联合类型
-
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
的最小正值,即最接近零的值。也可能存在负浮点数。