Neo4j圖數據庫高級應用系列 / 服務器擴展指南 APOC(4.5) - 動態Cypher執行

有時候,我們需要更加靈活的Cypher查詢執行,例如在創建節點時根據變量的值決定節點的標籤,這時可以使用APOC中cypher執行相關的過程。

接口

功能

CALL apoc.cypher.run(
  fragment,
  params
)
YIELD value

使用給定的參數執行數據庫讀取查詢。

函數

apoc.cypher.runFirstColumnSingle

(statement, params)

使用給定的參數執行數據庫讀取查詢並僅返回第一列,將返回第一行/單行或返回null。

函數

apoc.cypher.runFirstColumnMany
(statement, params)

使用給定的參數執行數據庫讀取查詢並僅返回第一列,將返回包含所有行的列表。

CALL apoc.cypher.runFile(
  file or url,
  {config}
)
YIELD row, result

運行文件中的每個語句,語句以分號隔開。目前不支持數據庫模式操作。

CALL apoc.cypher.runFiles(
  [files or urls],
  {config}
)
YIELD row, result

運行多個文件中的查詢語句。

CALL apoc.cypher.runSchemaFile(
  file or url,
  {config}
)
 

運行文件中的每個數據庫模式操作語句,所有語句以分號分開。

CALL apoc.cypher.runMany(
 'statements1;...',
 {params},
 {config}
)

運行每個分號分隔的語句並返回摘要。該過程不支持數據庫模式操作。

CALL apoc.cypher.mapParallel(
  fragment,
  params,
  list-to-parallelize
) YIELD value

以並行批處理方式執行查詢。

CALL apoc.cypher.doIt(
  fragment,
  params
) YIELD value

使用給定的參數執行數據庫更新查詢。

CALL apoc.cypher.runTimeboxed(
  'cypherStatement',
  {params},
  timeout
)

以預定義時間窗口運行Cypher查詢,如果超時仍沒有完成則中止語句。

下面的例子中,首先得到數據庫中所有標籤,然後統計擁有每個標籤的節點的數量:

// 讀取數據庫中所有標籤的名稱,統計該類標籤下節點總數,
//          返回所有節點數 >0的標籤及統計結果。
//  參數:- fragment: 動態Cypher查詢
//        - params: {limit:0} 
//    返回:節點計數
CALL db.labels() YIELD label
CALL apoc.cypher.run(
  "MATCH (:`" + label + "`) WITH count(*) AS count WHERE count > $limit RETURN count", 
  {limit:0}) YIELD value
RETURN label, value.count AS count

如果要控制查詢的執行時間,可以用runTimeboxed()過程:

// 限定超時執行查詢。
//          計算1億次加法,超時3秒則終止執行。如果在3秒中執行完成,
//          結果在value變量中返回。
//  參數:- fragment: Cypher查詢
//        - params: {}
//        - timeout: 3000ms 
//   返回:節點計數
CALL apoc.cypher.runTimeboxed(
  'UNWIND range(1,10000) AS a1 UNWIND range(1,10000) AS a2 WITH a1+a2 AS a RETURN sum(a) AS sum',
  {}, 3000, true
) YIELD value
RETURN value

如果要執行動態數據庫更新,使用doIt()過程:

// 複製數據庫中所有節點,僅包含name屬性。
//          使用apoc.periodic.iterate過程控制執行批次。
//          在iterate的操作查詢中使用apoc.cypher.doIt來創建節點。
//          新節點的標籤來自於已存在的節點的第一個標籤。
//      返回:創建的節點
CALL apoc.periodic.iterate(
  'MATCH (n) RETURN n',
  "CALL apoc.cypher.doIt(\"CREATE (m:\"+ labels(n)[0] + \") SET m.name='\" + n.name + \"'\ RETURN m",{}) YIELD value RETURN value.m",
  {batchSize:10}
)

 

 

 

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