示例图
下图用于以下示例:
要重新创建图表,请针对空的 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 具有null age 值。 | |
跳过此分支,因为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'