neo4j 条件表达式 (CASE)

通用条件表达式可以在 Cypher ®中使用构造来表达CASE。Cypher 中存在两种变体CASE简单形式(用于将单个表达式与多个值进行比较)和通用形式(用于表达多个条件语句)。

CASE仅当您想在后续子句中使用结果时才可以用作RETURNWITH的一部分。

示例图

下图用于以下示例:

要重新创建图表,请针对空的 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

参数:

姓名描述

test

一种表达。

value

将与其结果进行比较的表达式test

result

value如果匹配,则返回表达式作为输出test

default

如果没有值与测试表达式匹配则返回此表达式。

例子

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

在 5.18 中引入

扩展的简单CASE形式允许明确指定比较运算符。简单形式CASE使用隐含的 equals( =) 比较器。

支持的比较器有:

句法

CASE test
  WHEN [comparisonOperator] value [, [comparisonOperator] value ]* THEN result
  [WHEN ...]
  [ELSE default]
END

参数:

姓名描述

test

一种表达。

comparisonOperator

受支持的比较运算符之一。

value

test使用给定的比较运算符与其结果进行比较的表达式。

result

value如果匹配则返回表达式作为输出test

default

如果没有值与测试表达式匹配则返回此表达式。

例子

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

"Alice"

"Adult"

"Bob"

"Young Adult"

"Charlie"

"Adult"

"Daniel"

"Unknown"

"Eskil"

"Adult"

通用的CASE

通用CASE表达式支持多个条件语句,类似于if-elseif-else编程语言的构造。按顺序评估每一行,直到true找到一个值。如果未找到匹配项,则返回运算符中的表达式ELSE。如果没有ELSE案例且未找到匹配项,null则将返回。

句法

CASE
  WHEN predicate THEN result
  [WHEN ...]
  [ELSE default]
END

参数:

姓名描述

predicate

谓词是求值的表达式BOOLEAN。在这种情况下,将测试谓词以找到有效的替代方案。

result

predicate如果计算结果为 ,则表达式作为输出返回true

default

如果未找到匹配项,default则返回。

例子

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

2

"brown"

38

1

"blue"

25

3

"green"

53

3

"brown"

null

1

"blue"

41

CASE针对null处理

处理null值时,您可能被迫使用通用CASE形式。下面的两个示例使用节点age的属性Danielnull该属性具有值)来阐明差异。

简单的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

"Alice"

28

"Bob"

15

"Charlie"

43

"Daniel"

null

"Eskil"

31

通用的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

"Alice"

28

"Bob"

15

"Charlie"

43

"Daniel"

-1

"Eskil"

31

有关更多信息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

"Alice"

2

"Bob"

1

"Charlie"

3

"Daniel"

2

"Eskil"

1

设置所有人的眼睛都是蓝色

MATCH (n:Person)
with n
set n.eyes = 'blue'

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京橙溪科技有限公司enwing.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值