属性、结构和构造值

Cypher® 为多种数据值类型提供了第一类支持。这些类型分为以下三类:**属性**、**结构**和**构造**。本节将首先简要概述每种类型,然后详细介绍属性数据类型。

属性类型

属性类型值是可以作为节点或关系属性存储的值。

属性类型类别中包含以下数据类型:BOOLEANDATEDURATIONFLOATINTEGERLISTLOCAL DATETIMELOCAL TIMEPOINTSTRINGZONED DATETIMEZONED TIME

  • 属性类型可以从 Cypher 查询中返回。

  • 属性类型可以用作参数

  • 属性类型可以存储为属性。

  • 属性类型可以使用Cypher 字面量进行构造。

简单类型的同构列表可以存储为属性,尽管一般来说列表(请参阅构造类型)不能存储为属性。存储为属性的列表不能包含null值。

Cypher 还为字节数组提供直通支持,这些字节数组可以存储为属性值。出于性能原因,支持字节数组,因为使用 Cypher 的通用数据类型 LIST<INTEGER>(其中每个 INTEGER 都有 64 位表示)成本过高。但是,Cypher 将字节数组视为第一类数据类型,因此它们没有字面量表示。

结构类型

结构类型类别中包含以下数据类型:NODERELATIONSHIPPATH

  • 结构类型可以从 Cypher 查询中返回。

  • 结构类型不能用作参数

  • 结构类型不能存储为属性。

  • 结构类型不能使用Cypher 字面量进行构造。

NODE 数据类型包括:id、标签和属性映射。请注意,标签不是值,而是一种模式语法形式。

RELATIONSHIP 数据类型包括:id、关系类型、属性映射、起始节点 id 和结束节点 id。

PATH 数据类型是节点和关系的交替序列。

节点、关系和路径作为模式匹配的结果返回。在 Neo4j 中,所有关系都有方向。但是,您可以在查询时拥有无向关系的概念。

构造类型

构造类型类别中包含以下数据类型:LISTMAP

  • 构造类型可以从 Cypher 查询中返回。

  • 构造类型可以用作参数

  • 构造类型不能存储为属性(同构列表除外)。

  • 构造类型可以使用Cypher 字面量进行构造。

LIST 数据类型可以是简单值的同构集合,也可以是异构的有序值集合,每个值都可以具有任何属性、结构或构造类型。

MAP 数据类型是 (, ) 对的异构、无序集合,其中是字面量,可以具有任何属性、结构或构造类型。

构造类型值也可以包含 null。有关更多详细信息,请参阅使用 null

类型及其同义词

下表显示了类型及其语法同义词。

这些类型(及其同义词)可以在类型谓词表达式属性类型约束中使用。当使用valueType()函数时,它们也作为 STRING 值返回。

但是,并非所有类型都可以在所有地方使用。

类型 同义词

ANY

ANY VALUE

BOOLEAN

BOOL

DATE

DURATION

FLOAT

INTEGER

INTSIGNED INTEGER

LIST<INNER_TYPE>

ARRAY<INNER_TYPE>INNER_TYPE LISTINNER_TYPE ARRAY

LOCAL DATETIME

TIMESTAMP WITHOUT TIME ZONETIMESTAMP WITHOUT TIMEZONE

LOCAL TIME

无时区时间无时区时间

映射

节点

任意节点顶点任意顶点

空值

路径

属性值

任意属性值

关系

任意关系任意边

字符串

可变字符类型

带时区日期时间

带时区时间戳带时区时间戳

带时区时间

带时区时间带时区时间

INNER_TYPE_1 | INNER_TYPE_2…​

ANY<INNER_TYPE_1 | INNER_TYPE_2…​>

所有 Cypher 类型都包含null值。要使其不可为空,可以在类型的末尾追加NOT NULL(例如BOOLEAN NOT NULLLIST<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变体在可为空变体之前。

两个封闭动态联合AB之间的顺序按如下方式确定

  • 如果A的内部类型少于B,则A先排序。

  • 如果AB具有相同数量的内部类型,则根据第一个不同的内部类型的顺序(词典顺序)进行排序。

结果顺序是确定性的。

属性类型详细信息

下表提供了有关 Cypher 支持的各种属性类型的更多详细信息。请注意,Cypher 类型使用 Java 实现,下表引用 Java 值常量。

类型 最小值 最大值 精度

BOOLEAN

-

DATE

-999_999_999-01-01

+999_999_999-12-31

DURATION

P-292471208677Y-6M-15DT-15H-36M-32S

P292471208677Y6M15DT15H36M32.999999999S

纳秒

FLOAT

Double.MIN_VALUE [1]

Double.MAX_VALUE

64 位

INTEGER

Long.MIN_VALUE

Long.MAX_VALUE

64 位

LOCAL DATETIME

-999_999_999-01-01T00:00:00

+999_999_999-12-31T23:59:59.999999999

纳秒

LOCAL TIME

00:00:00

23:59:59.999999999

纳秒

**笛卡尔**:(-Double.MAX_VALUE, -Double.MAX_VALUE)

**笛卡尔_3D**:(-Double.MAX_VALUE, -Double.MAX_VALUE, -Double.MAX_VALUE)

**WGS_84**:(-180, -90)

**WGS_84_3D**:(-180, -90, -Double.MAX_VALUE)

**笛卡尔**:(Double.MAX_VALUE, Double.MAX_VALUE)

**笛卡尔_3D**:(Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE)

**WGS_84**:(180, 90)

**WGS_84_3D**:(180, 90, Double.MAX_VALUE)

POINT的每个坐标的精度为 64 位,因为它们是浮点数。

字符串

-

-

-

带时区日期时间

-999_999_999-01-01T00:00:00+18:00

+999_999_999-12-31T23:59:59.999999999-18:00

纳秒

带时区时间

00:00:00+18:00

23:59:59.999999999-18:00

纳秒

Java 值详细信息

名称

Double.MAX_VALUE

1.7976931348623157e+308

Double.MIN_VALUE

4.9e-324

Long.MAX_VALUE

2^63-1

Long.MIN_VALUE

-2^63


1. 最小值表示FLOAT的最小正值,即最接近零的值。也可能存在负浮点数。