类型谓词表达式
类型谓词表达式可用于验证变量、字面量、属性或其他 Cypher® 表达式的类型。
语法
<expr> IS :: <TYPE>
其中 <expr> 是任意 Cypher 表达式,而 <TYPE> 是一个 Cypher 类型。有关所有可用的 Cypher 类型,请参阅类型及其同义词部分。
验证 Cypher 表达式的类型
UNWIND [42, true, 'abc', null] AS val
RETURN val, val IS :: INTEGER AS isInteger
| 值 | 是整数 |
|---|---|
|
|
|
|
|
|
|
|
行数: 4 |
|
带有 NOT 的类型谓词表达式
也可以使用否定类型谓词表达式 IS NOT :: 来验证 Cypher 表达式不是某种特定类型。
UNWIND [42, true, 'abc', null] AS val
RETURN val, val IS NOT :: STRING AS notString
| 值 | 不是字符串 |
|---|---|
|
|
|
|
|
|
|
|
行数: 4 |
|
null 的类型谓词表达式
所有 Cypher 类型都包含 null 值。从 Neo4j 5.10 开始,类型谓词表达式可以附加 NOT NULL。这意味着对于所有求值为 null 的表达式,IS :: 返回 true,除非附加了 NOT NULL。
RETURN
NULL IS :: BOOLEAN AS isBoolean,
NULL IS :: BOOLEAN NOT NULL AS isNotNullBoolean
| 是布尔值 | 是非空布尔值 |
|---|---|
|
|
行数: 1 |
|
同样,对于所有求值为 null 的表达式,IS NOT :: 返回 false,除非类型附加了 NOT NULL。
RETURN
(null + 1) IS NOT :: DATE AS isNotDate,
(null + 1) IS NOT :: DATE NOT NULL AS isNotNotNullDate
| 不是日期 | 不是非空日期 |
|---|---|
|
|
行数: 1 |
|
还可以使用 null 类型检查值是否仅为 null 值。
RETURN NULL IS :: NULL AS isNull
| 是 null |
|---|
|
行数: 1 |
封闭动态联合类型 (INNER_TYPE_1 | INNER_TYPE_2…) 不能声明为 NOT NULL。相反,所有内部类型都应单独声明为不可为空,以实现此行为。
请注意,封闭动态联合中的所有内部类型必须要么可为空,要么不可为空。这是因为 null 值不能归因于特定类型。如果内部类型不具有相同的可空性,则会引发语法错误。
RETURN 1 IS :: INTEGER NOT NULL | FLOAT
All types in a Closed Dynamic Union must be nullable, or be appended with `NOT NULL`.
属性的类型谓词表达式
类型谓词表达式还可以用于筛选出具有特定类型属性的节点或关系。
以下示例使用包含以下节点的图
以下查询查找所有 Person 节点,这些节点的 age 属性是 INTEGER 类型且值大于 18。
MATCH (n:Person)
WHERE n.age IS :: INTEGER AND n.age > 18
RETURN n.name AS name, n.age AS 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
| 是任意类型 | 是什么都不是的类型 |
|---|---|
|
|
行数: 1 |
|
封闭动态联合
封闭动态联合类型允许在同一个谓词中测试多种类型。
UNWIND [42, 42.0, "42"] as val
RETURN val, val IS :: INTEGER | FLOAT AS isNumber
| 值 | 是数字 |
|---|---|
|
|
|
|
|
|
行数: 3 |
|
列表类型
类型谓词表达式可用于 LIST 类型,其中必须指定列表中元素的内部类型。如果内部类型不相关,则可以使用 ANY 类型。
要使 LIST 类型检查返回 true,列表中的所有值都必须匹配内部类型。
UNWIND [[42], [42, null], [42, 42.0]] as val
RETURN val, val IS :: LIST<INTEGER> AS isIntList
| 值 | 是整数列表 |
|---|---|
|
|
|
|
|
|
行数: 3 |
|
空列表将匹配所有内部类型,甚至是 NOTHING 类型。
RETURN
[] IS :: LIST<NOTHING> AS isNothingList,
[] IS :: LIST<INTEGER> AS isIntList,
[] IS :: LIST<FLOAT NOT NULL> AS isFloatNotNullList
| 是什么都没有的列表 | 是整数列表 | 是非空浮点数列表 |
|---|---|---|
|
|
|
行数: 1 |
||
列表可以与封闭动态联合类型结合使用,以创建异构列表的测试。
WITH [1, 0, true, false] AS booleanList
RETURN booleanList IS :: LIST<BOOLEAN | INTEGER> as isMixedList
| 是混合列表 |
|---|
|
行数: 1 |