相比圖形數(shù)據(jù)的查詢,Neo4j更新圖形數(shù)據(jù)的速度較慢,通常情況下,Neo4j更新數(shù)據(jù)的工作流程是:每次數(shù)據(jù)更新都會(huì)執(zhí)行一次數(shù)據(jù)庫連接,打開一個(gè)事務(wù),在事務(wù)中更新數(shù)據(jù)。當(dāng)數(shù)據(jù)量非常大時(shí),這種做法非常耗時(shí),大多數(shù)時(shí)間耗費(fèi)在連接數(shù)據(jù)庫和打開事務(wù)上,高效的做法是利用Neo4j提供的參數(shù)(Parameter)機(jī)制和UNWIND子句:在一次數(shù)據(jù)更新中,進(jìn)行一次連接,打開一次事務(wù),批量更新數(shù)據(jù);參數(shù)用于提供列表格式的數(shù)據(jù),UNWIND子句是把列表數(shù)據(jù)展開成一行一行的數(shù)據(jù),每行數(shù)據(jù)都會(huì)執(zhí)行結(jié)構(gòu)相同的Cypher語句。再批量更新圖形數(shù)據(jù)之前,用戶必須構(gòu)造結(jié)構(gòu)固定的、參數(shù)化的Cypher語句。當(dāng)Cypher語句的結(jié)構(gòu)相同時(shí),Neo4j數(shù)據(jù)庫直接從緩存中復(fù)用已生成的執(zhí)行計(jì)劃,而不需要重新生成,這也能夠提高查詢性能。
除了官方的Neo4j Driver之外,本文分享使用Neo4jClient對圖形數(shù)據(jù)批量更新,Neo4jClient提供的功能更強(qiáng)大,并支持參數(shù)和批量更新操作。
我的Neo4j系列的文章收錄在:Neo4j
一,參數(shù)和UNWIND子句
1,通過RESTful API傳遞參數(shù)
Neo4j提供HTTP API處理Cypher語句和參數(shù),在示例代碼中,Neo4j的參數(shù)通過HTTP請求傳遞,statement定義的是查詢語句,parameters定義的是參數(shù)。
在批量更新數(shù)據(jù)時(shí),沒有必要發(fā)送多個(gè)HTTP請求,通過參數(shù),可以在一個(gè)HTTP請求(Request)中,開始一個(gè)事務(wù),在事務(wù)中執(zhí)行Cypher語句批量更新數(shù)據(jù),最后提交該事務(wù)。
在發(fā)送HTTP請求傳遞參數(shù)批量更新數(shù)據(jù)時(shí),設(shè)置HTTP Request的參數(shù)如下:
POST http://localhost:7474/db/data/transaction/commitAccept: application/json; charset=UTF-8Content-Type: application/json
注意:在HTTP API中,引用參數(shù)的格式是:{param}。
{ "statements" : [ { "statement" : "CREATE (n {props}) RETURN&n