属性、结构化与构造值

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

属性类型

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

属性类型是 Cypher 中最原始的类型,包括:BOOLEANDATEDURATIONFLOATINTEGERLISTLOCAL DATETIMELOCAL TIMEPOINTSTRINGVECTORZONED DATETIMEZONED TIME

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

  • 属性类型可用作 参数

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

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

简单类型的同构列表可以存储为属性(VECTOR 类型除外,它不能存储在列表中,详见 VECTOR 类型),但通常列表(参见 构造类型)不能存储为属性。存储为属性的列表不能包含 null 值。

仅在 Neo4j 企业版中使用 块格式 或在 Aura 实例上时,才支持将 VECTOR 类型值存储为属性。此功能在 Neo4j 社区版中不可用。

Cypher 还提供对字节数组的传递支持,字节数组可以存储为属性值。支持字节数组是出于性能考虑,因为使用 Cypher 的通用数据类型 LIST<INTEGER>(其中每个 INTEGER 都有 64 位表示)成本过高。然而,字节数组被 Cypher 视为一等数据类型,因此它们没有字面量表示形式。

结构类型

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

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

  • 结构类型不能用作 参数

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

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

NODE 数据类型包括:id、标签(label(s))以及属性映射。请注意,标签不是值,而是一种模式语法。

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

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

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

构造类型

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

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

  • 构造类型可用作 参数

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

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

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

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

构造类型值也可以包含 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

VECTOR<TYPE>(DIMENSION)

VECTOR, VECTOR<TYPE>, VECTOR(DIMENSION), VECTOR(DIMENSION, TYPE)

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 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 类型无法标准化。

VECTOR 类型标准化
比较类型 标准化结果 原因

VECTOR | VECTOR<FLOAT32>(12345)

VECTOR

VECTOR 是超类型,包含所有其他类型。

VECTOR<FLOAT32> | VECTOR(12345)

VECTOR<FLOAT32> | VECTOR(12345)

无法标准化 — 一个向量缺乏维度,另一个缺乏坐标类型。

VECTOR<FLOAT32> | VECTOR<FLOAT32>(12345)

VECTOR<FLOAT32>

相同类型,没有定义维度的向量包含另一个。

VECTOR(12345) | VECTOR<FLOAT32>(12345)

VECTOR(12345)

相同维度,没有定义坐标类型的向量包含另一个。

VECTOR<FLOAT32> | VECTOR<INTEGER64>

VECTOR<FLOAT32> | VECTOR<INTEGER64>

无法标准化 — 坐标类型不同。

VECTOR(1234) | VECTOR(12345)

VECTOR(1234) | VECTOR(12345)

无法标准化 — 维度不同。

VECTOR<FLOAT32>(1234) | VECTOR<FLOAT64>(1234)

VECTOR<FLOAT32>(1234) | VECTOR<FLOAT64>(1234)

无法标准化 — 坐标类型不同,即使维度匹配。

类型排序

类型排序如下

  • 预定义类型

    • 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 变体排在可空变体之前。

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

  • 如果 A 的内部类型比 B 少,则 A 排在前面。

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

最终顺序是确定的。

属性类型详细信息

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

类型 最小值 最大值 精度

布尔值 (BOOLEAN)

False

True

-

DATE

-999_999_999-01-01

+999_999_999-12-31

DURATION(持续时间)

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

P292471208677Y6M15DT15H36M32.999999999S

纳秒

FLOAT32*

Float.MIN_VALUE [1]

Float.MAX_VALUE

32 位

FLOAT (FLOAT64)

Double.MIN_VALUE

Double.MAX_VALUE

64 位

INTEGER8*

Byte.MIN_VALUE

Byte.MAX_VALUE

8 位

INTEGER16*

Short.MIN_VALUE

Short.MAX_VALUE

16 位

INTEGER32*

Integer.MIN_VALUE

Integer.MAX_VALUE

32 位

INTEGER (INTEGER64)

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

Cartesian: (-Double.MAX_VALUE, -Double.MAX_VALUE)

Cartesian_3D: (-Double.MAX_VALUE, -Double.MAX_VALUE, -Double.MAX_VALUE)

WGS_84: (-180, -90)

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

Cartesian: (Double.MAX_VALUE, Double.MAX_VALUE)

Cartesian_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

-

-

-

VECTOR<TYPE>(DIMENSION)

给定维度下坐标类型的最小值。

给定维度下坐标类型的最大值。

坐标类型的精度。

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

纳秒

1. 对于 FLOAT32FLOAT64,最小值表示最小的正值,即最接近零的值。负值也是可能的。

* 仅限向量的坐标类型。

Java 值详细信息

名称

Byte.MAX_VALUE

127

Byte.MIX_VALUE

-128

Double.MAX_VALUE

1.7976931348623157e+308

Double.MIN_VALUE

4.9e-324

Float.MAX_VALUE

3.4028235E38

Float.MIN_VALUE

1.4E-45

Integer.MAX_VALUE

2147483647

Integer.MIN_VALUE

-2147483648

Long.MAX_VALUE

2^63-1

Long.MIN_VALUE

-2^63

SHORT.MAX_VALUE

32767

SHORT.MIN_VALUE

-32768

© . This site is unofficial and not affiliated with Neo4j, Inc.