1、概述
APOC提供以下过程来运行有条件分支的Cypher语句。
接口 |
过程 |
CALL apoc.when( |
基于条件,执行给定参数的ifQuery或elseQuery只读查询。 |
CALL apoc.do.when( |
基于条件,执行给定参数的ifQuery或elseQuery更新查询。 |
CALL apoc.case( |
给定条件-只读查询对的列表,在条件匹配后执行对应的查询;如果没有匹配的条件则执行elseQuery对应的查询。支持对查询传递参数。 |
CALL apoc.do.case( |
给定条件-更新查询对的列表,在条件匹配后执行对应的查询;如果没有匹配的条件则执行elseQuery对应的查询。支持对查询传递参数。 |
这类apoc过程使得我们可以定义查询执行的条件分支。Cypher的CASE…WHEN只能在赋值表达式中使用。
过程接口 |
// 简单条件分支:IF..THEN..ELSE,只读查询。 // CALL apoc.when( condition,
// 简单条件分支:IF..THEN..ELSE,更新操作。 // CALL apoc.do.when( condition, |
参数名 |
类型 |
缺省值 |
可为空? |
说明 |
condition |
布尔值 |
无 |
否 |
判断条件的结果。可以是表达式。 |
ifQuery |
字符串 |
'' |
是 |
condition为true时执行的Cypher语句。 |
elseQuery |
字符串 |
'' |
是 |
condition为false时执行的Cypher语句。 |
params |
MAP |
{} |
是 |
查询的参数 |
// 例子: 搜索“人物”节点,并读取其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