类型谓词表达式
类型谓词表达式可用于验证变量、字面量、属性或其他 Cypher® 表达式的类型。
语法
<expr> IS :: <TYPE>
其中 <expr> 是任何 Cypher 表达式,<TYPE> 是 Cypher 类型。关于所有可用的 Cypher 类型,请参阅类型及其同义词一节。
验证 Cypher 表达式的类型
UNWIND [42, true, 'abc', null] AS val
RETURN val, val IS :: INTEGER AS isInteger
| val | isInteger |
|---|---|
|
|
|
|
|
|
|
|
行:4 |
|
向量值与超类型仅限 Cypher 25Neo4j 2025.10 引入
以下示例使用具有 3 个维度且坐标类型为 INTEGER8 的 VECTOR 值(使用 vector() 函数构建)。
VECTOR 验证 VECTOR<TYPE>(DIMENSION) 值WITH vector([1, 2, 3], 3, INTEGER8) AS vector
RETURN vector IS :: VECTOR<INTEGER8>(3) AS isVector
| isVector |
|---|
|
行:1 |
虽然无法在不指定坐标类型和维度的情况下存储 VECTOR 值,但在类型谓词表达式中使用 VECTOR 超类型(涵盖 VECTOR<TYPE>(DIMENSION) 的所有组合)是可行的。
VECTOR 超类型验证 VECTOR<TYPE>(DIMENSION) 值WITH vector([1, 2, 3], 3, INTEGER8) AS vector
RETURN vector IS :: VECTOR AS isVector
| isVector |
|---|
|
行:1 |
同样适用于 VECTOR<TYPE> 超类型(涵盖所有具有相同坐标类型的 VECTOR 值,无论其维度如何)和 VECTOR(DIMENSION) 超类型(涵盖所有具有相同维度的 VECTOR 值,无论其坐标类型如何)。
VECTOR<TYPE> 超类型验证 VECTOR<TYPE>(DIMENSION) 值WITH vector([1, 2, 3], 3, INTEGER8) AS vector
RETURN vector IS :: VECTOR<INTEGER8> AS isInteger8Vector
| isInteger8Vector |
|---|
|
行:1 |
VECTOR(DIMENSION) 超类型验证 VECTOR<TYPE>(DIMENSION) 值WITH vector([1, 2, 3], 3, INTEGER8) AS vector
RETURN vector IS :: VECTOR(3) AS isDimension3Vector
| isDimension3Vector |
|---|
|
行:1 |
如果 VECTOR 中的坐标类型或维度与类型谓词表达式中指定的不匹配,结果将为 false。
VECTOR 验证 VECTOR<TYPE>(DIMENSION) 值WITH vector([1, 2, 3], 3, INTEGER8) AS vector
RETURN vector IS :: VECTOR(5) AS isDimension5Vector
| isDimension5Vector |
|---|
|
行:1 |
VECTOR 验证 VECTOR<TYPE>(DIMENSION) 值WITH vector([1, 2, 3], 3, INTEGER8) AS vector
RETURN vector IS :: VECTOR<INTEGER16> AS isInteger16Vector
| isInteger16Vector |
|---|
|
行:1 |
带有 NOT 的类型谓词表达式
还可以使用取反的类型谓词表达式 IS NOT :: 来验证某个 Cypher 表达式不属于特定类型。
UNWIND [42, true, 'abc', null] AS val
RETURN val, val IS NOT :: STRING AS notString
| val | notString |
|---|---|
|
|
|
|
|
|
|
|
行:4 |
|
针对 null 的类型谓词表达式
所有 Cypher 类型都包含 null 值。类型谓词表达式可以追加 NOT NULL。这意味着对于所有求值为 null 的表达式,IS :: 返回 true,除非追加了 NOT NULL。
RETURN
NULL IS :: BOOLEAN AS isBoolean,
NULL IS :: BOOLEAN NOT NULL AS isNotNullBoolean
| isBoolean | isNotNullBoolean |
|---|---|
|
|
行:1 |
|
同样,IS NOT :: 对于所有求值为 null 的表达式返回 false,除非该类型追加了 NOT NULL。
RETURN
(null + 1) IS NOT :: DATE AS isNotDate,
(null + 1) IS NOT :: DATE NOT NULL AS isNotNotNullDate
| isNotDate | isNotNotNullDate |
|---|---|
|
|
行:1 |
|
还可以使用 null 类型来检查一个值是否为唯一的 null 值。
RETURN NULL IS :: NULL AS isNull
| isNull |
|---|
|
行:1 |
封闭动态联合类型 (INNER_TYPE_1 | INNER_TYPE_2…) 不能声明为 NOT NULL。相反,应将所有内部类型单独声明为非空,以实现此行为。
请注意,封闭动态联合中的所有内部类型必须要么都是可空的,要么都是不可空的。这是因为 null 值无法归因于特定类型。如果内部类型的可空性不一致,将引发语法错误。
RETURN 1 IS :: INTEGER NOT NULL | FLOAT
42N63: 错误: 语法错误或访问规则冲突 - 内部类型具有不同的可空性。封闭动态联合中的所有内部类型必须是可空的,或者全部追加 'NOT NULL'。 42001:错误:语法错误或访问规则冲突 - 无效语法 |
属性的类型谓词表达式
类型谓词表达式还可以用于过滤掉具有特定类型属性的节点或关系。
以下示例使用包含以下节点的图
以下查询查找所有 age 属性为 INTEGER 且值大于 18 的 Person 节点。
MATCH (n:Person)
WHERE n.age IS :: INTEGER AND n.age > 18
RETURN n.name AS name, n.age AS age
| 名称 (name) | age |
|---|---|
|
|
行:1 |
|
PROPERTY VALUE 类型也可用于检查某个类型是否可以作为属性存储。无法存储在属性中的类型(如 MAP)在通过 IS :: PROPERTY VALUE 检查时将返回 false。
类型谓词表达式的语法变体
类型谓词表达式允许一些替代语法
<expr> IS TYPED <TYPE>
<expr> :: <TYPE>
为了验证表达式不属于特定类型,支持以下替代语法
<expr> IS NOT TYPED <TYPE>
ANY 和 NOTHING 类型的使用
ANY 是一个匹配所有类型值的超类型。NOTHING 是一个包含空值集合的类型。这意味着它对于所有值都返回 false。
RETURN 42 IS :: ANY AS isOfTypeAny, 42 IS :: NOTHING AS isOfTypeNothing
| isOfTypeAny | isOfTypeNothing |
|---|---|
|
|
行:1 |
|
封闭动态联合
封闭动态联合类型允许在同一个谓词中测试多种类型。
UNWIND [42, 42.0, "42"] as val
RETURN val, val IS :: INTEGER | FLOAT AS isNumber
| val | isNumber |
|---|---|
|
|
|
|
|
|
行:3 |
|
列表类型
类型谓词表达式可用于 LIST 类型,其中必须指定列表中元素的内部类型。如果内部类型无关紧要,则可以使用 ANY 类型。
要使 LIST 类型检查返回 true,列表中的所有值都必须与内部类型匹配。
UNWIND [[42], [42, null], [42, 42.0]] as val
RETURN val, val IS :: LIST<INTEGER> AS isIntList
| val | isIntList |
|---|---|
|
|
|
|
|
|
行:3 |
|
空列表将匹配所有内部类型,甚至是 NOTHING 类型。
RETURN
[] IS :: LIST<NOTHING> AS isNothingList,
[] IS :: LIST<INTEGER> AS isIntList,
[] IS :: LIST<FLOAT NOT NULL> AS isFloatNotNullList
| isNothingList | isIntList | isFloatNotNullList |
|---|---|---|
|
|
|
行:1 |
||
列表可以与封闭动态联合类型结合使用,以创建针对异构列表的测试。
WITH [1, 0, true, false] AS booleanList
RETURN booleanList IS :: LIST<BOOLEAN | INTEGER> as isMixedList
| isMixedList |
|---|
|
行:1 |