有時候,我們需要更加靈活的Cypher查詢執行,例如在創建節點時根據變量的值決定節點的標籤,這時可以使用APOC中cypher執行相關的過程。
接口 |
功能 |
CALL apoc.cypher.run( |
使用給定的參數執行數據庫讀取查詢。 |
函數 apoc.cypher.runFirstColumnSingle (statement, params) |
使用給定的參數執行數據庫讀取查詢並僅返回第一列,將返回第一行/單行或返回null。 |
函數 apoc.cypher.runFirstColumnMany |
使用給定的參數執行數據庫讀取查詢並僅返回第一列,將返回包含所有行的列表。 |
CALL apoc.cypher.runFile( |
運行文件中的每個語句,語句以分號隔開。目前不支持數據庫模式操作。 |
CALL apoc.cypher.runFiles( |
運行多個文件中的查詢語句。 |
CALL apoc.cypher.runSchemaFile( |
運行文件中的每個數據庫模式操作語句,所有語句以分號分開。 |
CALL apoc.cypher.runMany( |
運行每個分號分隔的語句並返回摘要。該過程不支持數據庫模式操作。 |
CALL apoc.cypher.mapParallel( |
以並行批處理方式執行查詢。 |
CALL apoc.cypher.doIt( |
使用給定的參數執行數據庫更新查詢。 |
CALL apoc.cypher.runTimeboxed( |
以預定義時間窗口運行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}
)