属性、结构和构造值

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

属性类型

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

属性类型是 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

INT, SIGNED INTEGER

LIST<INNER_TYPE>

ARRAY<INNER_TYPE>, INNER_TYPE LIST, INNER_TYPE ARRAY

LOCAL DATETIME

TIMESTAMP WITHOUT TIME ZONE, TIMESTAMP WITHOUT TIMEZONE

LOCAL TIME

TIME WITHOUT TIME ZONE, TIME WITHOUT TIMEZONE

MAP

NODE

ANY NODE, VERTEX, ANY VERTEX

NOTHING

null

PATH

POINT

PROPERTY VALUE

ANY PROPERTY VALUE

RELATIONSHIP

ANY RELATIONSHIP, EDGE, ANY EDGE

STRING

VARCHAR

ZONED DATETIME

TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH TIMEZONE

ZONED TIME

TIME WITH TIME ZONE, TIME WITH TIMEZONE

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() 函数输出的一致性。

类型的排序

类型的排序如下

  • 预定义类型

    • 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 变体位于可为空变体之前。

两个封闭动态联合 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

纳秒

POINT

笛卡尔: (-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 位,因为它们是浮点数。

STRING

-

-

-

ZONED DATETIME

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

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

纳秒

ZONED TIME

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