Neo4j 第四篇:使用C#更新和查詢Neo4j

来源:http://www.cnblogs.com/ljhdo/archive/2017/05/26/5531467.html
-Advertisement-
Play Games

本文使用的IDE是Visual Studio 2015 ,驅動程式是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,創建的類庫工程(Project)要求安裝 .NET Framework 4.6版本,Neo4j官方提供的驅動程式使用起來非常簡單,非常依賴於Cypher語言,但是,官 ...


本文使用的IDE是Visual Studio 2015 ,驅動程式是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,創建的類庫工程(Project)要求安裝 .NET Framework 4.6版本,Neo4j官方提供的驅動程式使用起來非常簡單,非常依賴於Cypher語言,但是,官方驅動程式僅支持標量類型的參數(Parameters),由於Neo4j的批量更新,例如,Cypher語言的foreach,unwind命令等用於批量操作,非常依賴於參數,這也成了官方驅動最大的缺點。

一,安裝Neo4j Driver 1.3.0

1,依賴.NET Framework 4.6版本

創建Neo4jProviders工程,設置工程的目標架構(Target Framework)為.NET Framework 4.6

2,安裝驅動Neo4j Driver 1.3.0

點擊工具(Tools)菜單,通過NuGet Package Manager的控制台命令安裝Neo4j的.Net驅動程式

PM> Install-Package Neo4j.Driver

二,驅動程式主要方法和對象

Neo4j驅動程式十分簡單,主要有Driver對象,Session對象和Transaction對象。Driver對象用於連接資料庫,Session對象用於創建事務,事務對象用於執行Cypher查詢。事務只能在Read或Write模式下執行,由於Driver對象不會解析Cypher查詢,它也不會檢測到事務執行的是寫,還是讀操作,因此,當一個寫模式事務執行的是讀操作,Neo4j資料庫會拋出錯誤,執行失敗。

Note that the driver does not parse Cypher and cannot determine whether a transaction is intended to carry out read or write operations. As a result of this, a write transaction tagged for read will be sent to a read server, but will fail on execution.

1,連接資料庫

Neo4j通過Driver來連接圖形資料庫,需要輸入身份驗證信息:Host(Bolt監聽地址,例如"bolt://host:7687"),用戶名和密碼。

private readonly IDriver Driver;

public HelloWorldExample(string uri, string user, string password)
{
    Driver = GraphDatabase.Driver(uri, AuthTokens.Basic(user, password));
}

2,創建會話(Session)

會話是一系列事務(Transaction)的容器,用於連接圖形資料庫,並創建事務執行的上下文。示例代碼創建Session之後,以自動提交模式執行事務,在資料庫中創建一個節點,該節點具有標簽和屬性。

在Neo4j的驅動中,發送到Neo4j引擎的Cypher查詢語句包含兩部分:Query和Parameters,其中,Query是在資料庫中執行的Cypher語句,Parameters是傳遞引擎的參數,在Query中以$param引用參數。

public void AddPerson(string name)
{
    using (var session = Driver.Session())
    {
        session.Run("CREATE (a:Person {name: $name})", new {name});
    }
}

3,創建事務

在Neo4j的事務中,讀寫操作都必須處於事務的上下文中。在Session對象中,當事務以自動提交模式執行(通過session.Run()函數調用)時,事務只包含一個Cypher語句,但是,這種模式有一個缺點,當Cypher語句執行失敗時,事務不能重新執行(Replay)。Neo4j推薦使用事務函數模式,在Session中調用WriteTransaction()或 ReadTransaction()函數,併在事務函數包含事務單元,在事務執行失敗時,能夠在異常處理代碼中重新執行Cypher語句。

public void AddPerson(string name)
{
    using (var session = Driver.Session())
    {
        session.WriteTransaction(tx => tx.Run("CREATE (a:Person {name: $name})", new {name}));
    }
}

三,參數化查詢

Cypher支持參數化查詢,在Cypher語句中,使用參數替代表達式,實體的ID,參數不能用於關係類型和標簽。在Neo4j資料庫中,參數能夠優化查詢,使得Cypher的執行計劃更容易被緩存,查詢更快速。在Cypher中,通過$param引用參數。

1,使用參數創建節點

在執行事務之後,Session返回資料庫執行的結果,通過result.Summary查看Cypher語句執行的結果。

public bool CreateSingleNode(string lable,string name)
{
    string query = string.Format("CREATE (n:{0} ", lable)+ @"{name: $name})";
    using (var session = Driver.Session(AccessMode.Write))
    {
        var result = session.WriteTransaction(tx=>tx.Run(query, new { name }));
        IResultSummary rs = result.Summary;
        return rs.Counters.NodesCreated == 1;
    }
}

2,使用參數創建關係

通過new創建匿名類型,參數名是匿名類型的欄位,欄位名必須和Cypher語句中的參數($para)保持一致。

public bool CreateRelationship(string RelationshipType,string SourceNodeName,string TargetNodeName)
{
    string query = string.Format(@"match (n),(m) where n.name=$source and m.name=$target create (n)-[:{0}]->(m);",RelationshipType);

    using (var session = Driver.Session())
    {
        var result = session.WriteTransaction(tx => tx.Run(query,new {source=SourceNodeName,target= TargetNodeName } ));
        IResultSummary rs = result.Summary;
        return rs.Counters.RelationshipsCreated == 1;
    }
}

四,查詢資料庫

向Neo4j資料庫發送請求,返回的是數據結構是一個表格,Title是return子句的投影的欄位。

 

如示例圖所示,查詢返回的結構是表格(行-列)式的,列值主要分為兩種,要麼是節點的屬性列表,以JSON結構顯示,要麼是標量值。

驅動程式的Session返回查詢的結果,Keys欄位是Cypher語句中return子句投影的欄位列表;Values欄位返回是查詢結果。

public void MatchNodes(string lable, string name)
{
    string query = string.Format(@"MATCH (n:{0} ", lable)+ @"{name: $name})-[r]->(m) RETURN n,id(n);";
    using (var session = Driver.Session(AccessMode.Read))
    {
        var result = session.ReadTransaction(rx => rx.Run(query, new { name }));
        //return 子句投影的欄位列表
        IReadOnlyList<string> keys = result.Keys;
        //查詢返回的數據行
        var rows = result.ToList();
        foreach(var row in rows)
        {
            //每個數據行都包含多個數據列
            var columns = row.Values;
            foreach (var column in columns)
            {
                //每個數據列,可能是一個節點,也可能是一個標量值
                if(column.Key=="n")
                {
                    var node = column.Value as INode;

                    long NodeID = node.Id;
                    string NodeLables = string.Join(",", node.Labels.ToArray());
                    foreach (var property in node.Properties)
                    {
                        string Property=string.Format("Property[Key:{0},Value:{1}", property.Key, property.Value);
                    }
                }
                        
                if(column.Key=="id(n)")
                {
                    long NodeID=long.Parse(column.Value.ToString());
                }
            }
        }       
    }
}

 

參考文檔:

3.2.4. Parameters

Nuget Neo4j Driver 1.3.0

Chapter 4. Drivers


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

-Advertisement-
Play Games
更多相關文章
  • 電子書 Kotlin in Action.pdf 中文版,想深入瞭解Kotlin的都可以看一下 限個人學習使用,不得用於商業用途,請在下載後24小時內刪除。備註:資源來自網路,如有不合理可私信我,秒刪。電子書 Kotlin in Action.pdf 中文版 免費下載https://page55.c ...
  • 本書被Android開發者譽為Android學習經典。全書系統全面、循序漸進地介紹了Android軟體開發的知識、經驗和技巧。 第2版基於Android7.0對第1版進行了全面更新,將所有知識點都在新的Android系統上進行重新適配,使用全新的Android Studio開發工具代替之前的Ecli ...
  • 由柯元旦編著的《Android內核剖析》詳細分析了Android內核的內部機制,包括視窗管理系統、Activity管理系統、輸入法框架、編譯系統等,為Android內核定製及高級應用程式開發提供技術參考。 《Android內核剖析》適合於所有Android相關的工程師及產品經理,還可作為相關培訓機構 ...
  • 前幾天看到新聞,Google將Kotlin語言作為Android應用開發的一級語言, 與Java並駕齊驅, 這則消息在開發界一下就炸開了鍋( 好像平息的很快。。。)! 連Google的親兒子go語言也沒有這種待遇。Kotlin是什麼鬼,感覺隱隱約約好像在哪裡見過啊,對IDEA新建工程時可以看到。 大 ...
  • 以前做前端開發的時候,使用最多的工具就是 Fiddler ,用來定位問題、模擬特定場景非常方便,極大提升了開發效率。而轉做 iOS 開發以後,一大頭疼的問題是 Fiddler 沒有 Mac 版,幸虧找到了 Charles Proxy 這個還不錯的替代工具,不過使用上與 Fiddler 還是有不少區別 ...
  • 如題,我在網上也找過相關解決方法,很多解答都是這麼一句SQL語句: select Id,AccountId,Mark,max(CreateTime) as Latest from AccountMark as b group by AccountId 使用Max函數。但是在我查出來的數據中似乎有些不 ...
  • 這是一個簡單的數據生產導入的故事,原本故事情節應該是這樣的:數據整理-->測試驗證-->生產發佈-->生產驗證,然後就是各回各家,所以這本來應該是一個平淡的故事,然而實際卻變成瞭如下情節:數據整理-->測試驗證-->生產發佈-->生產驗證-->校驗失敗(預期數據未導入)-->問題排查-->解決問題- ...
  • 目錄 1.獲取當前系統時間 2.Oracle中union與union all 1.獲取當前系統時間,並做些加減運算。 2.Oracle中union與union all 如果我們需要將兩個select語句的結果作為一個整體顯示出來,我們就需要用到union或者union all關鍵字。 union和u ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...