1.借用docker搭建noe4j环境

docker pull neo4j
docker run -d --restart=always -p7474: -p7687: -v /root/docker/neo4j/data:/data -v /root/docker/neo4j/logs:/logs --env=NEO4J_AUTH=neo4j/password --name neo4j neo4j

驱动程序主要方法和对象

Neo4j驱动程序最核心的对象是:Driver对象,Session对象和Transaction对象。Driver对象用于连接数据库,Session对象用于创建事务,事务对象用于执行Cypher查询。事务只能在Read或Write模式下执行,由于Driver对象不会解析Cypher查询,它也不会检测到事务执行的是写,还是读操作,因此,当一个写模式事务执行的是读操作,Neo4j数据库会抛出错误,执行失败。

1,连接数据库

Neo4j通过Driver对象来连接图形数据库,在创建Driver对象时,需要服务器的连接地址(即bolt监听地址,地址格式是"bolt://host:7687")和身份验证信息:user和password。

 private readonly IDriver Driver;
public Neo4jProviders(string uri, string user, string password)
{
Driver = GraphDatabase.Driver(uri, AuthTokens.Basic(user, password));
}

验证信息通过auth token来提供,基础验证是AuthTokens.Basic(user,password)。

2,创建会话(Session)

在连接图形数据库之后,创建会话,会话是一系列事务(Transaction)的容器,用于创建事务执行的上下文,也就是说,事务必须在session的上下文中执行。Neo4j驱动程序提供三种格式的事务,最简单的是自动提交事务模式,自动提交事务模式使用 Session对象的run()方法来实现。

示例代码如下,在创建Session之后,以自动提交模式执行事务,在数据库中创建一个节点,该节点具有标签和属性。

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

在Neo4j的驱动程序中,发送到Neo4j数据库引擎的Cypher查询语句包含两部分:Query和Parameters,其中,Query是在数据库中执行的Cypher语句,Parameters是传递引擎的参数,在Query中以$para_name格式来引用参数,在Parameters中,参数的名词和$para_name中的para_name保持一致。

自动提交事务只包含一个Cypher语句,这意味着多个事务不能共享网络数据包,从而表现出比其他形式的事务更低的网络效率。自动提交事务旨在用于简单的用例,例如学习Cypher或编写一次性脚本时。 建议不要在生产环境中使用自动提交事务,或者在性能或弹性是主要问题时使用。

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 == ;
}
}

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 == ;
}
}

四,查询数据库

向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());
}
}
}
}
}
public List<string> GetPeople()
{
using (var session = Driver.Session())
{
//return session.ReadTransaction(tx => tx.Run("MATCH (a:Person) RETURN a.name AS name").ToList());
return session.ReadTransaction(tx =>
{
var result = tx.Run("MATCH (a:Person) RETURN a.name ORDER BY a.name");
return result.Select(record => record[].As<string>()).ToList();
});
}
}

参考:

Neo4j 第四篇:使用.NET驱动访问Neo4j

Neo4j使用简单例子(转)

.netcore docker noe4j的更多相关文章

  1. .NETCore Docker实现容器化与私有镜像仓库管理

    一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖.相较于虚拟机而 ...

  2. windows下部署.netcore+docker系列四 (部署程序,重点就要来了)

    前面的都是为这章做准备,加油把骚年们 PS:C# 项目可以按照流程一步步来,java 偶然其他的可以找下其他的网上资源 1.在 VS2019中 添加docker 支持 (其实也就是追加一个Docker ...

  3. vsts + XX云服务器构建netcore+docker持续集成交付部署

    持续集成交付部署是什么意思,它给我们带来什么好处? 先贴一张图 持续集成(Continuous Integration) 持续集成强调开发人员提交了新代码之后,立刻进行构建.(单元)测试(这个要看情况 ...

  4. windows下部署.netcore+docker系列二 (unbuntu 18.4 下 安装 docker)亲测!!!

    1.卸载sudo apt-get remove docker docker-engine docker.io containerd runc2.更新sudo apt-get update3.安装依赖包 ...

  5. .NetCore Docker一次记录

    1:项目添加docker支持 2:定位到项目主目录 按住shift,鼠标右键,打开powershell,输入命令 dotnet publish 此时会在目录 bin\Debug\netcoreapp2 ...

  6. windows下部署.netcore+docker系列三 (unbuntu 18.4 下安装ftp)

    // 先更新下系统sudo apt-get update//安装ftpsudo apt-get install vsftpd// 启动 服务sudo service vsftpd start//ftp ...

  7. windows下部署.netcore+docker系列一(安装linux (ubuntu18.4))

    1 下载 虚拟机和 linux 系统 版本是 ubuntu 链接:https://pan.baidu.com/s/1jTxdysoyOhSWD-Ea-7JIbg 提取码:iiad 2  首先要安装 虚 ...

  8. .NET遇上Docker - Docker集成Cron定时运行.NETCore(ConsoleApp)程序.md

    配置项目的Docker支持 对于VS中Docker的配置,依旧重复一些废话. 给项目添加Docker支持,VS2015可以直接使用Docker for VS插件,VS2017在安装时选择容器支持.VS ...

  9. Docker在Linux/Windows上运行NetCore文章系列

    Windows系列 因为Window很简单,VS提供界面化配置,所以只写了一篇文章 Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用 Linux( ...

随机推荐

  1. tomcat server.xml 中 host 元素

    测试偶然发现: <Host name="127.0.0.1" appBase="webapps" unpackWARs="true" ...

  2. 详解数据库引擎与SQL语句增删改查(非常详细,带例)

    数据库系统(DBMS): 专门负责数据管理的工具.增加数据.创建索引.建立索引之间的关联关系.更新索引...... 连接器:PHP要访问MySQL,可以通过API访问,也可以通过PHP的驱动,而那个驱 ...

  3. 子网掩码的作用与IP网段的划分

    公有IP地址分类 A类:1.0.0.0 到 127.255.255.255主要分配 给大量主机而局域网网络数量较少的大型网络 B类:128.0.0.0 到191.255.255.255 一般用于国际性 ...

  4. 京东js加密 nloginpwd 破解

    京东登录,有一个参数nloginpwd,是加密字段. 第一步:浏览器抓包 第二部:搜索加密字段 js 代码 第三部: 下断点 2. js代码: var navigator = {}; var wind ...

  5. 查看mysql连接数和状态

    查看MySQL连接数 登录到MySQL命令行,使用如下命令可以查看当前处于连接未关闭状态的进程列表: show full processlist; 若不加上full选项,则最多显示100条记录. 若以 ...

  6. linux修改服务器时区并使用所选时区的时间

    linux 修改服务器时区并使用所选时区的时间(以 ubuntu18.04 修改为美国芝加哥时区为例) 一.修改时区    /usr/bin/tzselect        1.选择地区, 美洲地区: ...

  7. woocommerce直接调取产品描述内容

    最近一位客户想让woocommerce产品页直接调取描述内容,不想太多的tab切换,太复杂,这个蛮简单的,woocommerce是在wordpress基础开发的,产品也是post的一种类型,直接调用c ...

  8. django基本过程

    1.Django请求生命周期 URL对应关系(匹配)--试图函数--返回用户字符串 URL对应关系(匹配)--试图函数--打开一个HTML文件 读取内容显示 return HttpResponse(' ...

  9. localStorage二次封装-----设置过期时间

    export default{ set(key,data,time){ let obj={ data=data, ctime:(new Date()).getTime(),//时间戳,同Date.no ...

  10. 2090. 「ZJOI2016」旅行者 分治,最短路

    2090. 「ZJOI2016」旅行者 链接 loj 思路 \((l,mid)(mid+1,r)\).考虑跨过mid的贡献. 假设选的中间那条线的点为gzy,贡献为\(dis(x,gzy)+dis(g ...