Neo4j 第五篇:批量更新數據

来源:http://www.cnblogs.com/ljhdo/archive/2017/06/01/5554560.html
-Advertisement-
Play Games

相比圖形數據的查詢,Neo4j更新圖形數據的速度較慢,通常情況下,Neo4j更新數據的工作流程是:每次數據更新都會執行一次資料庫連接,打開一個事務,在事務中更新數據。當數據量非常大時,這種做法非常耗時,大多數時間耗費在連接資料庫和打開事務上,高效的做法是利用Neo4j提供的參數(Parameter) ...


相比圖形數據的查詢,Neo4j更新圖形數據的速度較慢,通常情況下,Neo4j更新數據的工作流程是:每次數據更新都會執行一次資料庫連接,打開一個事務,在事務中更新數據。當數據量非常大時,這種做法非常耗時,大多數時間耗費在連接資料庫和打開事務上,高效的做法是利用Neo4j提供的參數(Parameter)機制和UNWIND子句:在一次數據更新中,進行一次連接,打開一次事務,批量更新數據;參數用於提供列表格式的數據,UNWIND子句是把列表數據展開成一行一行的數據,每行數據都會執行結構相同的Cypher語句。再批量更新圖形數據之前,用戶必須構造結構固定的、參數化的Cypher語句。當Cypher語句的結構相同時,Neo4j資料庫直接從緩存中復用已生成的執行計劃,而不需要重新生成,這也能夠提高查詢性能。

除了官方的Neo4j Driver之外,本文分享使用Neo4jClient對圖形數據批量更新,Neo4jClient提供的功能更強大,並支持參數和批量更新操作。

 

我的Neo4j系列的文章收錄在:Neo4j

 

一,參數和UNWIND子句

1,通過RESTful API傳遞參數

Neo4j提供HTTP API處理Cypher語句和參數,在示例代碼中,Neo4j的參數通過HTTP請求傳遞,statement定義的是查詢語句,parameters定義的是參數。

在批量更新數據時,沒有必要發送多個HTTP請求,通過參數,可以在一個HTTP請求(Request)中,開始一個事務,在事務中執行Cypher語句批量更新數據,最後提交該事務。

在發送HTTP請求傳遞參數批量更新數據時,設置HTTP Request的參數如下:

POST http://localhost:7474/db/data/transaction/commit
Accept: application/json; charset=UTF-8
Content-Type: application/json

註意:在HTTP API中,引用參數的格式是:{param}。

{
  "statements" : [ {
    "statement" : "CREATE (n {props}) RETURN n",
    "parameters" : {
      "props" : {
        "name" : "My Node"
      }
    }
  } ]
}

2,展開(UNWIND)子句

UNWIND子句把列表式的數據展開成一行一行的數據,每一個行都包含更新所需要的全部信息,列表式的數據,可以通過參數來傳遞。

例如,定義參數events,該參數是一個JSON字元串,鍵events是參數名,其值是一個數組,包含兩個數組元素。

{
  "events" : [ {  "year" : 2014, "id" : 1}, {"year" : 2014, "id" : 2 } ]
}   

通過$events引用參數,UNWIND子句把events數組中的兩個元素展開,每個元素執行一次Cypher語句,由於Cypher的語句結構固定,因此,執行計劃被緩存起來,在執行數據更新任務時,參數被UNWIND子句展開,復用執行計劃,提高數據更新的速度。

UNWIND $events AS event
MERGE (y:Year { year: event.year })
MERGE (y)<-[:IN]-(e:Event { id: event.id })
RETURN e.id AS x
ORDER BY x

二,在Neo4j Browser中使用參數

Neo4j Browser是Neo4j內置的瀏覽器,用於管理資料庫,更新資料庫和查詢數據,再命令窗體中,通過“:”能夠引用內置的命令,例如,通過 ":param"能夠定義參數,並能夠在下一個Cypher語句中引用參數。

1,通過:param命令定義參數

在Neo4j Browser中,輸入第一個命令,通過:param 命令定義參數,

2,通過$param引用參數

緊接著,輸入Cypher語句,通過$param引用參數

3,查看創建的圖形

參數是一個列表格式的數據,在參數events中,兩個event的year屬性都是2014,因此,MERGE子句只會創建一個Year節點;由於兩個event的id屬性不同,因此MERGE子句會創建兩個Event節點,並創建Year節點和Event節點之間的關係,圖形如下圖:

三,使用Neo4jClient批量更新數據

在工程(Projects)中輸入命令安裝Neo4jClient,

Package-Install Neo4jClient

1,連接Neo4j資料庫

創建客戶端,連接到資料庫,創建的Uri的格式是:http://host_name:7474/db/data,並輸入用戶名和密碼,然後創建圖形客戶端,並連接到Neo4j資料庫。

private GraphClient _client;
public Neo4jClientProvider()
{
    _client = new GraphClient(new Uri("http://localhost:7474/db/data"), "user_name", "password");
    _client.Connect();
}

2,批量創建節點

傳遞List<T>參數,通過Unwind函數引用List,併為參數命名為"ns",在Cypher語句中引用參數"ns"

public void CreateNodes(List<DataModel> nodes)
{
    _client.Cypher
        .Unwind(nodes, "ns")
        .Create("(n:NodeLable)")
        .Set("n.NodeID=ns.NodeID")
        .Set("n.Name=ns.Name")
        .ExecuteWithoutResults();
}

2,批量創建關係

在List<T>參數中,傳遞兩個節點的映射,在Neo4j資料庫中,關係必須具有類型,因此,在把參數傳遞到Neo4j數據中時,需要確定兩個節點和關係類型,以創建關係

public bool CreateRelationships(List<RelationshipModel> nodes)
{
    _client.Cypher
        .Unwind(nodes, "ns")
        .Match("(n:Lable1),(s:Lable2)")
        .Where("n.NodeID=ns.NodeID and s.NodeID=ns.RelatedID")
        .Merge("(n)-[r:RelationshipType]->(s)")
        .ExecuteWithoutResults();
}

 

 

 

參考文檔:

3.3.6. UNWIND

Getting Started with Neo4j in .NET with Neo4jClient Library

Batch insert nodes and relations neo4jclient

5 Tips & Tricks for Fast Batched Updates of Graph Structures with Neo4j and Cypher

關於Neo4j和Cypher批量更新和批量插入優化的5個建議


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天在虛擬機上掛載光碟時提示: [root@primary dev]# mount /dev/cdrom /mnt/cdrom mount: you must specify the filesystem type 處理方法: 虛擬機-〉setting->cd/dvd-〉device status- ...
  • 獲得資料庫和表的信息 一般正常的程式員或DBA都會在敲代碼的時候突然想到這樣的一系列問題:我是誰?我在哪?我在乾什麼? 我的資料庫呢?我的表呢?我表怎麼創建的?我該怎麼辦呢?你可能會想到SHOW DATABASES; 命令。But, 這個命令是列出由mysql管理的databases. 不是知道我再 ...
  • 溫習《高性能MySQL》的第一章 MySQL架構與歷史 1.1 MySQL邏輯架構 參考http://www.cnblogs.com/baochuan/archive/2012/03/15/2397536.html 圖1-1:MySQL伺服器邏輯架構圖 最上層的服務並不是MySQL所獨有的,大多數基 ...
  • 提取資料庫所有表的表名、欄位名 在SQLserver 2000中測試 在SQLserver 2005中測試 提取某個表的欄位名 ...
  • 在博客園看到一篇討論特別多的文章“探討SQL Server併發處理存在就更新七種解決方案”,這種業務需求很常見:如果記錄存在就更新,不存在就插入。 最常見的做法: 一個很明顯的問題,在高併發下可能存在操作同一條記錄的多個線程都進入到INSERT環節,導致插入失敗。 上面問題原因在於進入INSERT或 ...
  • 索引這塊從存儲結構來分,有2大類,聚集索引和非聚集索引,而非聚集索引在堆表或者在聚集索引表都會對其 鍵值有所影響,這塊可以詳細查看本系列第二篇文章:SQL SERVER大話存儲結構_(2)_非聚集索引如何查找到行記錄。 非聚集索引內又分為多類:單列索引、複合索引、包含索引、過濾索引等。之前文章有具體 ...
  • 死鎖的概念 什麼是死鎖呢? 其實我們生活中也有很多類似死鎖的例子。 我先舉一個生活中的例子:過年回家,父親買了一把水彈槍,兒子和侄子爭搶著要先玩,誰也不讓誰,拆開包裝後,一個搶了槍, 一個逮住了子彈和彈夾。兩個都爭著要先玩,但是都互不相讓。結果兩個人都玩不了。如果兒子要先玩,就必須讓侄子把子彈和彈夾... ...
  • sql查詢某欄位的相同值: SELECT * FROM table WHERE col in (SELECT col FROM table GROUP BY col HAVING COUNT (col) >1); 順帶說一下where和having: select * from tablewhere ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...