Neo4j 第四篇:使用.NET驱动访问Neo4j
转载: https://www.cnblogs.com/ljhdo/p/5531467.html
本文使用的 IDE 是 Visual Studio 2015 ,驱动程序是 Neo4j 官方的最新版本: Neo4j.Driver ,创建的类库工程(Project)要求安装 .NET Framework 4.5.2及以上版本,Neo4j官方提供的驱动程序使用起来非常简单,非常依赖于Cypher语言,这使得该驱动程序能够处理很多任务,但是,官方驱动程序仅支持标量类型的参数(Parameters),由于 Neo4j 的批量更新,例如,Cypher 语言的 foreach,unwind 命令等用于批量操作,非常依赖于参数,这也成了官方驱动最大的缺点。
一 安装 Neo4j Driver
官方的 .NET 驱动程序使用的是 Blot 协议,目前更新到 1.72 版本,依赖 .NET Framework 4.5.2 及以上版本
1 依赖 .NET Framework 4.6 版本
创建 Neo4jApp 工程,配置工程的熟悉,设置目标架构(Target Framework)为 .NET Framework 4.6
2 安装驱动程序
点击工具(Tools)菜单,通过 NuGet Package Manager 的控制台命令安装 Neo4j 的 .NET 驱动程序,选用 1.3.0 版本的原因是项目较赶,暂时没有时间去学习最新的版本。
在 C# 中引用驱动程序的命名空间:
1 | using Neo4j.Driver.V1; |
二 驱动程序主要方法和对象
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 对象来连接图形数据库,在创建 Driver 对象时,需要服务器的连接地址(即 bolt 监听地址,地址格式是 “bolt://host:7687”) 和身份验证信息:user 和 password。
1 | private readonly IDriver Driver; |
验证信息通过 auth token 来提供,基础验证是 AuthTokens.Basic(user,password)。
2 创建会话(Session)
在连接图形数据库之后,创建会话,会话是一系列事务(Transaction)的容器,用于创建事务执行的上下文,也就是说,事务必须在session的上下文中执行。Neo4j驱动程序提供三种格式的事务,最简单的是自动提交事务模式,自动提交事务模式使用 Session对象的run()方法来实现。
示例代码如下,在创建Session之后,以自动提交模式执行事务,在数据库中创建一个节点,该节点具有标签和属性。
1 | public void AddPerson(string name) |
在Neo4j的驱动程序中,发送到Neo4j数据库引擎的Cypher查询语句包含两部分:Query和Parameters,其中,Query是在数据库中执行的Cypher语句,Parameters是传递引擎的参数,在Query中以paraname格式来引用参数,在Parameters中,参数的名词和para_name中的para_name保持一致。
自动提交事务只包含一个Cypher语句,这意味着多个事务不能共享网络数据包,从而表现出比其他形式的事务更低的网络效率。自动提交事务旨在用于简单的用例,例如学习Cypher或编写一次性脚本时。 建议不要在生产环境中使用自动提交事务,或者在性能或弹性是主要问题时使用。
3 创建事务函数
事务函数是推荐的创建事务的方式,这种形式能够以最小的查询代码实现多个多个查询的输入,能够分离数据库查询和应用程序逻辑。
在 Neo4j 的事务中,读写操作都必须处于事务的上下文中。在Session对象中,当事务以自动提交模式执行(通过session.Run()函数调用)时,事务只包含一个Cypher语句,但是,这种模式有一个缺点,当Cypher语句执行失败时,事务不能重新执行(Replay)。Neo4j推荐使用事务函数模式,通过Session对象调用WriteTransaction()或 ReadTransaction()函数,并在事务函数包含事务单元,在事务执行失败时,能够在异常处理代码中重新执行Cypher语句。
1 | public void AddPerson(string name) |
三 参数化查询
Cypher 支持参数化查询,在 Cypher 语句中,使用参数替代表达式,实体的 ID,参数不能用于关系类型和标签。在 Neo4j 数据库中,参数能够优化查询,使得 Cypher 的执行计划更容易被缓存,查询更快速。在 Cypher中,通过 $param 引用参数。
1 使用参数创建节点
在执行事务之后,Session 返回数据库执行的结果,通过 result.Summary 查看 Cypher 语句执行的结果。
1 | public bool CreateSingleNode(string lable,string name) |
2 使用参数创建关系
通过 new 创建匿名类型,参数名是匿名类型的字段,字段名必须和 Cypher 语句中的参数 ($para) 保持一致。
1 | public bool CreateRelationship(string RelationshipType,string SourceNodeName,string TargetNodeName) |
四 查询数据库
向 Neo4j 数据库发送请求,返回的是数据结构是一个表格,Title 是 return 子句的投影的字段。
如示例图所示,查询返回的结构是表格(行-列)式的,列值主要分为两种,要么是节点的属性列表,以 JSON 结构显示,要么是标量值。
驱动程序的 Session 返回查询的结果,Keys 字段是 Cypher 语句中 return 子句投影的字段列表;Values 字段返回是查询结果。
1 | public void MatchNodes(string lable, string name) |
五 Cypher 和 .NET 的类型映射
驱动程序把编程语言翻译成Cypher的类型系统,为了处理数据,需要了解编程语言的类型和Cypher的类型系统的映射。图的特有类型是:Node、Relationship和Path,基础类型:Boolean、Integer、Float、String、List、Map,对.NET的类型映射是:
语句执行的结果是由记录流(record stream) 构成,结果通常由接收应用程序在到达时处理。一个记录是一个由Key/Value对构成的有序字典(Map),记录可以通过位置索引(0-based 整数)和键(key,字符串)来访问。
例如,通过位置索引来选择记录:
1 | public List<string> GetPeople() |