Neo4j图数据库高级应用系列 / 服务器扩展指南 APOC(4.7) - Cypher语句的条件分支

1、概述

APOC提供以下过程来运行有条件分支的Cypher语句。

接口

过程

CALL apoc.when(
  condition,
  ifQuery,
  elseQuery:'',
  params:{}
) YIELD value

基于条件,执行给定参数的ifQuery或elseQuery只读查询。

CALL apoc.do.when(
  condition,
  ifQuery,
  elseQuery:'',
  params:{}
) YIELD value

基于条件,执行给定参数的ifQuery或elseQuery更新查询。

CALL apoc.case(
  [condition,query,
   condition,query, ...],
  elseQuery:'',
  params:{}
) YIELD value

给定条件-只读查询对的列表,在条件匹配后执行对应的查询;如果没有匹配的条件则执行elseQuery对应的查询。支持对查询传递参数。

CALL apoc.do.case(
  [condition,query,
   condition,query,...],
  elseQuery:'',
  params:{}
) YIELD value

给定条件-更新查询对的列表,在条件匹配后执行对应的查询;如果没有匹配的条件则执行elseQuery对应的查询。支持对查询传递参数。

2、应用


这类apoc过程使得我们可以定义查询执行的条件分支。Cypher的CASE…WHEN只能在赋值表达式中使用。

2.1 过程调用接口 – apoc.*.when

 

 

 

过程接口

 

// 简单条件分支:IF..THEN..ELSE,只读查询。

//

CALL apoc.when(

  condition,
  ifQuery,
  elseQuery
'',
  params
{}
) YIELD value

 

 

// 简单条件分支:IF..THEN..ELSE,更新操作。

//

CALL apoc.do.when(

  condition,
  ifQuery,
  elseQuery
'',
  params
{}
) YIELD value
 

参数名

类型

缺省值

可为空?

说明

condition

布尔值

判断条件的结果。可以是表达式。

ifQuery

字符串

''

condition为true时执行的Cypher语句。

elseQuery

字符串

''

condition为false时执行的Cypher语句。

params

MAP

{}

查询的参数

 

 

 

 

 

 

 

2.2 例子

//  例子: 搜索“人物”节点,并读取其genre属性。
//          如果属性存在,返回其值;
//          如果不存在,则创建该属性,并赋值“男”。

MATCH (n:人物)
WITH exists(n.genre) AS flag, n.genre AS genre, id(n) AS pid
CALL apoc.do.when(flag,
  'RETURN $genre AS genre',
  'SET n.genre = "男" RETURN "男" AS genre',
  {genre:genre, pid:pid})
YIELD value
RETURN value

3、apoc.case过程

// 复杂条件分支:CASE..WHEN,CASE..WHEN..,ELSE,只读查询。

CALL apoc.case(
  [condition,query,
   condition,query, ...],
  elseQuery:'',
  params:{}
) YIELD value

//复杂条件分支:CASE..WHEN,CASE..WHEN..,ELSE,更新操作。
CALL
apoc.do.case(
  [condition,query,
   condition,query, ...],
  elseQuery:'',
params:{}
) YIELD value
 

// 搜索“人物”节点,并读取其genre属性。
//          如果属性为“男”,初始化属性class为1;
//          为“女”,初始化属性class为2;
//          其他,初始化class属性为-1。
//          这里,genre属性必须存在,否则会报空指针错误。
MATCH MATCH (n:人物) 
WITH n.genre AS genre,n
CALL apoc.do.case(
  [ genre='男', 
    'WITH $node AS n SET n.class=1 RETURN n', 
    genre='女', 
    'WITH $node AS n SET n.class=2 RETURN n'
  ],
  'WITH $node AS n SET n.class="-1" RETURN n', 
  {node:n}
)
YIELD value
RETURN value

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章