Skip to Content
Cypher 手册表达式类型转换函数

CAST 函数

CAST 函数用于在 NeuG 中不同数据类型之间转换值。它支持字面值、动态参数、变量和节点/关系属性的类型转换。

语法

CAST(expression, 'TARGET_TYPE')

参数:

  • expression:要转换的值或表达式。可以是字面值、变量、属性或任何有效的 Cypher 表达式。
  • 'TARGET_TYPE':指定目标数据类型的字符串字面值(如 'INT32''DOUBLE''STRING''DATE')。

返回值: 转换为指定目标类型的值。

使用示例

基本类型转换

以下示例演示使用字面值进行基本类型转换:

# 将整数转换为双精度浮点数(向上转型) RETURN CAST(123, 'DOUBLE'); # 将双精度浮点数转换为整数(向下转型,截断小数部分) RETURN CAST(123.7, 'INT32'); # 将字符串转换为整数(解析) RETURN CAST('123', 'INT32'); # 将整数转换为字符串 RETURN CAST(123, 'STRING'); # 将字符串转换为时间类型 RETURN CAST('2012-01-02', 'DATE');

列表与数组值

LIST (T[]) 和固定大小的 ARRAY (T[N]) 是不同的复合类型。 CAST 并非通用的 LIST/ARRAY 兼容层。写入节点和关系属性的值必须与编译器选定的模式类型相匹配。请使用模式声明或其他类型化上下文来生成固定大小的数组值。

转换属性值

CAST 函数也可应用于节点和关系属性:

# 将节点属性从 INT32 转换为 DOUBLE MATCH (n:person) RETURN CAST(n.age, 'DOUBLE'); # 将关系属性从 DOUBLE 转换为 INT32 MATCH (n:person)-[k:knows]->(m:person) RETURN CAST(k.weight, 'INT32');

转换变量和表达式

您可以转换任何有效的表达式,包括变量和计算值:

# 转换变量 MATCH (n:person) WITH n.age AS age RETURN CAST(age, 'DOUBLE') AS age_double; # 转换计算表达式 MATCH (n:person) RETURN CAST(n.age * 2.5, 'INT32') AS rounded_age;

支持的类型类别

NeuG 的类型系统包含四大类别:

类别描述CAST 支持
数值INT32INT64UINT32UINT64FLOATDOUBLE✅(包含溢出规则)
字符串STRING
时间DATEDATETIME✅(受限,详见下方转换表)
复合LISTARRAY✅ 仅限同一种复合类型内部;不支持 LISTARRAY 转换

类型转换规则

数值到数值转换

在数值类型之间转换时,可能发生精度丢失或溢出(如 INT64INT32)。转换行为取决于源类型和目标类型,以及构建模式。

换矩阵

下表显示数值类型转换的安全性和溢出行为:

从 \ 到INT32UINT32INT64UINT64FLOATDOUBLE
INT32✅ 安全⚠️ 可能溢出(如果值 < 0)✅ 安全⚠️ 可能溢出(如果值 < 0)✅ 安全✅ 安全
UINT32⚠️ 可能溢出(如果值 > INT32_MAX)✅ 安全✅ 安全✅ 安全✅ 安全✅ 安全
INT64⚠️ 可能溢出(如果值 < INT32_MIN 或 > INT32_MAX)⚠️ 可能溢出(如果值 < 0 或 > UINT32_MAX)✅ 安全⚠️ 可能溢出(如果值 < 0)✅ 安全✅ 安全
UINT64⚠️ 可能溢出(如果值 > INT32_MAX)⚠️ 可能溢出(如果值 > UINT32_MAX)⚠️ 可能溢出(如果值 > INT64_MAX)✅ 安全✅ 安全✅ 安全
FLOAT⚠️ 可能溢出(如果值 < INT32_MIN 或 > INT32_MAX)⚠️ 可能溢出(如果值 < 0 或 > UINT32_MAX)⚠️ 可能溢出(如果值 < INT64_MIN 或 > INT64_MAX)⚠️ 可能溢出(如果值 < 0 或 > UINT64_MAX)✅ 安全✅ 安全
DOUBLE⚠️ 可能溢出(如果值 < INT32_MIN 或 > INT32_MAX)⚠️ 可能溢出(如果值 < 0 或 > UINT32_MAX)⚠️ 可能溢出(如果值 < INT64_MIN 或 > INT64_MAX)⚠️ 可能溢出(如果值 < 0 或 > UINT64_MAX)⚠️ 可能溢出(如果值 < -FLT_MAX 或 > FLT_MAX)✅ 安全

图例说明:

  • 安全:转换始终安全并保留值
  • ⚠️ 可能溢出:如果值超出目标类型范围,转换可能失败或产生意外结果

溢出处理

溢出时的行为取决于构建模式:

模式行为
发布版静默返回未定义/溢出值(如回绕或最大可表示值)。出于性能原因,不抛出异常
调试版抛出明确的 OverflowError,消息指示源类型、目标类型和导致溢出的值。

示例:

# 在发布模式下,这可能静默回绕或返回最大值 # 在调试模式下,这会抛出 OverflowError RETURN CAST(999999999999, 'INT32');

跨类别转换

下表总结不同类型类别之间允许的转换:

从 \ 到数值字符串时间
数值✅(见上文数值转换表)✅(如 123"123")❌(目前不支持)
字符串✅(如果可解析,如 "42"42)✅(身份转换)✅(如果符合 ISO 格式,如 "2025-01-01"DATE)
时间❌(目前不支持)✅(转换为 ISO 字符串格式)✅(在兼容的时间类型之间,如 DATEDATETIME)

字符串到数值转换

STRING 转换为数值类型时,字符串必须可解析为目标数值类型:

# 有效转换 RETURN CAST('42', 'INT32'); # 返回 42 RETURN CAST('3.14', 'DOUBLE'); # 返回 3.14 RETURN CAST('-100', 'INT64'); # 返回 -100 # 无效转换会导致错误 # RETURN CAST('abc', 'INT32'); # 错误:无法将 'abc' 解析为 INT32

字符串到时间转换

STRING 转换为时间类型时,字符串必须符合 ISO 格式:

# 有效 DATE 转换 RETURN CAST('2012-01-02', 'DATE'); # 有效 DATETIME 转换 RETURN CAST('2012-01-02 10:30:00', 'TIMESTAMP');

时间到字符串转换

时间类型转换为 ISO 字符串格式:

# DATE 到 STRING RETURN CAST(DATE('2012-01-02'), 'STRING'); # 返回 '2012-01-02' # DATETIME 到 STRING RETURN CAST(DATETIME('2012-01-02 10:30:00'), 'STRING'); # 返回 '2012-01-02 10:30:00'

LIST 和 ARRAY 类型

T[] 声明一个可变长度的 LIST,而 T[N] 则声明一个包含恰好 N 个元素的固定大小 ARRAY。编译器会在执行前根据模式对属性值进行验证,因此运行时不会将 LIST 值规范化为 ARRAY 值,反之亦然。

错误处理

CAST 函数可能在以下情况下失败:

  1. 无效的类型转换:尝试在不兼容的类型之间进行转换(例如,将 LIST 转换为 ARRAY 或将 ARRAY 转换为 INT32
  2. 解析错误:转换无法解析为目标类型的字符串(例如,CAST('abc', 'INT32')
  3. 溢出错误(仅限调试模式):转换的值超出目标类型的范围
Last updated on