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

 

 

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