neo4j 条件表达式 (CASE)
示例图
下图用于以下示例:

要重新创建图表,请针对空的 Neo4j 数据库运行以下查询:
CREATE
(alice:Person {name:'Alice', age: 38, eyes: 'brown'}),
(bob:Person {name: 'Bob', age: 25, eyes: 'blue'}),
(charlie:Person {name: 'Charlie', age: 53, eyes: 'green'}),
(daniel:Person {name: 'Daniel', eyes: 'brown'}),
(eskil:Person {name: 'Eskil', age: 41, eyes: 'blue'}),
(alice)-[:KNOWS]->(bob),
(alice)-[:KNOWS]->(charlie),
(bob)-[:KNOWS]->(daniel),
(charlie)-[:KNOWS]->(daniel),
(bob)-[:MARRIED]->(eskil)
简单的CASE
简单CASE形式用于将单个表达式与多个值进行比较,类似于switch编程语言的构造。表达式由WHEN运算符求值,直到找到匹配项。如果未找到匹配项,则ELSE返回运算符中的表达式。如果没有ELSE案例且未找到匹配项,null则将返回。
句法
CASE test
WHEN value [, value]* THEN result
[WHEN ...]
[ELSE default]
END
参数:
| 姓名 | 描述 |
|---|---|
|
| 一种表达。 |
|
| 将与其结果进行比较的表达式 |
|
|
|
|
| 如果没有值与测试表达式匹配则返回此表达式。 |
例子
MATCH (n:Person)
RETURN
CASE n.eyes
WHEN 'blue' THEN 1
WHEN 'brown', 'hazel' THEN 2
ELSE 3
END AS result, n.eyes,n.name

扩展的简单CASE形式允许明确指定比较运算符。简单形式CASE使用隐含的 equals( =) 比较器。
支持的比较器有:
-
常规比较运算符:
=,<>,<,>,<=,>= -
IS NULL操作员:
IS [NOT] NULL -
类型谓词表达式:(
IS [NOT] TYPED <TYPE>注意,该形式IS [NOT] :: <TYPE>不被接受) -
规范化谓词表达式:
IS [NOT] NORMALIZED -
字符串比较运算符:
STARTS WITH,,ENDS WITH(=~正则表达式匹配)
句法
CASE test
WHEN [comparisonOperator] value [, [comparisonOperator] value ]* THEN result
[WHEN ...]
[ELSE default]
END
参数:
| 姓名 | 描述 |
|---|---|
|
| 一种表达。 |
|
| 受支持的比较运算符之一。 |
|
|
|
|
|
|
|
| 如果没有值与测试表达式匹配则返回此表达式。 |
例子
MATCH (n:Person)
RETURN n.name,
CASE n.age
WHEN IS NULL, IS NOT TYPED INTEGER | FLOAT THEN "Unknown"
WHEN = 0, = 1, = 2 THEN "Baby"
WHEN <= 13 THEN "Child"
WHEN < 20 THEN "Teenager"
WHEN < 30 THEN "Young Adult"
WHEN > 1000 THEN "Immortal"
ELSE "Adult"
END AS result
| 名词 | 结果 |
|---|---|
| 行:5 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
通用的CASE
通用CASE表达式支持多个条件语句,类似于if-elseif-else编程语言的构造。按顺序评估每一行,直到true找到一个值。如果未找到匹配项,则返回运算符中的表达式ELSE。如果没有ELSE案例且未找到匹配项,null则将返回。
句法
CASE
WHEN predicate THEN result
[WHEN ...]
[ELSE default]
END
参数:
| 姓名 | 描述 |
|---|---|
|
| 谓词是求值的表达式 |
|
|
|
|
| 如果未找到匹配项, |
例子
MATCH (n:Person)
RETURN
CASE
WHEN n.eyes = 'blue' THEN 1
WHEN n.age < 40 THEN 2
ELSE 3
END AS result, n.eyes, n.age
| 结果 | n.眼睛 | n.年龄 |
|---|---|---|
| 行:5 | ||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CASE针对null处理
处理null值时,您可能被迫使用通用CASE形式。下面的两个示例使用节点age的属性Daniel(null该属性具有值)来阐明差异。
CASE
MATCH (n:Person)
RETURN n.name,
CASE n.age
WHEN null THEN -1
ELSE n.age - 10
END AS age_10_years_ago
n.age是要评估的表达式。请注意,该节点Daniel具有nullage 值。 | |
跳过此分支,因为null它不等于任何其他值,包括null其自身。 | |
执行采用ELSE分支,输出null因为n.age - 10等于null。 |
| 名词 | 年龄_10_年前 |
|---|---|
| 行:5 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CASE
MATCH (n:Person)
RETURN n.name,
CASE n.age
WHEN null THEN -1
ELSE n.age - 10
END AS age_10_years_ago
如果 之后没有提供表达式CASE,它将以其通用形式运行,支持每个分支中的谓词表达式。 | |
此谓词表达式true对节点的计算结果为Daniel,因此返回此分支的结果。 |
| 名词 | 年龄_10_年前 |
|---|---|
| 行:5 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
有关更多信息null,请参阅使用null。
CASE表达式和后续子句
表达式的结果CASE可用于设置节点或关系的属性。
MATCH (n:Person)
WITH n,
CASE n.eyes
WHEN 'blue' THEN 1
WHEN 'brown' THEN 2
ELSE 3
END AS colorCode
SET n.colorCode = colorCode
RETURN n.name, n.colorCode
| 名词 | n.颜色代码 |
|---|---|
| 行:5 | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
设置所有人的眼睛都是蓝色
MATCH (n:Person)
with n
set n.eyes = 'blue'
更多推荐

所有评论(0)