當前位置:
首頁 > 知識 > Neo4j 第四篇:使用C更新和查詢Neo4j

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

本文使用的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

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

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 writetransaction tagged forreadwill 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子句的投影的欄位。

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

如示例圖所示,查詢返回的結構是表格(行-列)式的,列值主要分為兩種,要麼是節點的屬性列表,以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 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);
}
}
}
}
}

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

收集的常用簡單的演算法
springcloud(七):配置中心svn示例和refresh

TAG:達人科技 |

您可能感興趣

iOS 11.3 正式推出 查詢電池壽命 新Animoji
DeepMind 最新Science論文:生成查詢網路GQN
用 GHTorrent 和 Libraries.io 查詢 10 年的 GitHub 數據
測評Hive、SparkSQL、Presto 等七個大數據查詢引擎,最快的是?
iOS 12 beta5支持查詢第二SIM卡狀態,雙卡iPhone真的要來了
Linux DNS 查詢剖析(第四部分)
自動「腦補」3D環境!DeepMind最新Science論文生成查詢網路GQN
EntityFramework Core 2.0執行原始查詢如何防止SQL注入?
SQL Server基礎教學 sql分頁查詢每頁10條數據
使用SQL查詢ElasticSearch
gitbase:用 SQL 查詢 Git 倉庫
Linux DNS 查詢剖析 Linux 中國
「Science重磅」DeepMind生成查詢網路GQN,無監督學習展現3D場景
mybatis 查詢的時候提示 JDBC requiresJdbcType 錯誤
Python 中查詢 sqlite3 的一些小技巧
iOS12.2更新 支持AirPods 2 新增保修查詢功能
DeepMind發布新演算法:生成查詢網路GQN,可將2D照片渲染成3D模型
網友1300元買iPhone6sPlus,查詢發現該機是妖機!
聚合查詢慢——詳解Global Ordinals與High Cardinality
七麥數據:行業首家全面支持iOS12 App Store全站數據查詢