修改Credentials 密码
本文使用的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#中引用驱动程序的命名空间:
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 forread
will be sent to a read server, but will fail on execution.
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());
}
}
}
}
}
五,Cypher和.NET的类型映射
驱动程序把编程语言翻译成Cypher的类型系统,为了处理数据,需要了解编程语言的类型和Cypher的类型系统的映射。图的特有类型是:Node、Relationship和Path,基础类型:Boolean、Integer、Float、String、List、Map,对.NET的类型映射是:
语句执行的结果是由记录流(record stream)构成,结果通常由接收应用程序在到达时处理。一个记录是一个由Key/Value对构成的有序字典(Map),记录可以通过位置索引(0-based整数)和键(key,字符串)来访问。
例如,通过位置索引来选择记录:
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();
});
}
}
参考文档:
修改Credentials 密码的更多相关文章
- Tomcat修改用户名密码教程
Tomcat安装教程见http://www.cnblogs.com/lsdb/p/6497964.html 启动tomcat后访问http://127.0.0.1/:8080,出现界面如下其右上角有三 ...
- chpasswd-批量修改用户密码
批量修改用户密码 工作原理: 从系统的标准输入读入用户的名称和口令,并利用这些信息来更新系统上已存在的用户的口令 语法: :# echo 用户名:密码 | chpasswd :# chpasswd & ...
- Mysql修改root密码
一.启动命令行,输入: taskkill /f /im mysqld.exe //关闭mysql 二.转入mysql的bin目录下 三.输入:mysqld --skip-grant-tables // ...
- RedHat/Centos修改root密码
Linux主机忘记密码,只要你能接触物理主机都可以修改root密码的! Redhat6.x 5.x / Centos6.x 5.x 01.开机-空格/enter 02.e-编辑模式 CentO ...
- Oracle 11g中修改默认密码过期天数和锁定次数
Oracle 11g中修改默认密码过期天数和锁定次数 密码过期的原因一般有两种可能: 一.由于Oracle中默认在default概要文件中设置了"PASSWORD_LIFE_TIME=180 ...
- ansible非root用户批量修改root密码
前言: 由于线上服务器密码长久没有更新,现领导要求批量更换密码.线上的之前部署过salt,但由于各种因素没有正常使用. 使用自动化工具批量修改的计划搁浅了,后来领导给了个python多线程修改密码脚本 ...
- phpmyadmin修改root密码
很多人利用phpmyadmin或者命令行来修改了mysql的root密码,重启 后发现mysql登录错误,这是为什么呢?修改mysql的root的密码要在mysql软件中mysql数据库里修改root ...
- 修改sys密码与nbu备份脚本密码后,nbu备份报密码无效
公司要求口令强化,在修改sys密码后nbu的.sh脚本connect备份归档的sys/passwd也随之修改修改后每个业务备份均失败, 每次备份到归档那里就结束报密码无效,疑惑备份脚本密码也同步修改了 ...
- sharepoint 修改AD密码
sharepoint 修改AD密码 下面是添加添加“空元素”代码: 第一个<CustomAction>是添加修改密码项目 第二个<CustomAction>是添加js修改脚本 ...
随机推荐
- iOS 图片文件格式判断、圆角图片
1.圆角图片 // 设置圆形图片(放到分类中使用) - (UIImage *)cutCircleImage { UIGraphicsBeginImageContextWithOptions(self. ...
- unity3D项目中如何避免硬代码(C#)
平时做项目,代码中是不允许出现硬代码的,一般我们是怎么处理的呢? 那么硬代码又是什么呢? 我们俗称的硬代码:eg: label.text = "欢迎来到梦幻岛"; 这样我们俗 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- CompiledEffect Direct3D9 Sample fxc.exe
- Github初学者教程(一)
如果你是一名程序员,或者是相关专业的学生,那么Github你不应不知道.很多开源组织和大神,会选择在Github这个平台上,发布他们的开源项目,学会使用Github将能够给你的学习和工作带来巨大帮助! ...
- 图解修改mysql的默认数据库存放目录
按照下图三步完成:
- JQuery的一些简单功能
JQuery js的缺点总结 1.入口函数只能有一个,如果出现多个,后面的会覆盖掉前面的 2.代码容错性差,容易出错,出错会导致后面的代码不执行 3.存在浏览器兼容性,比如innerText在火狐浏览 ...
- AppDomain 详解(转)
AppDomain是CLR的运行单元,它可以加载Assembly.创建对象以及执行程序. AppDomain是CLR实现代码隔离的基本机制. 每一个AppDomain可以单独运行.停止:每个AppDo ...
- Android历史版本Logo
Android操作系统是一个由Google和开放手持设备联盟共同开发发展的移动设备操作系统,其最早的一个版本Android 1.0 beta发布于2007年11月5日,至今已经发布了多个更新. ...
- 基于webdriver的jmeter性能测试-Selenium IDE
前言: 由于某些项目使用了WebGL技术,需要高版本的Firefox和Chrome浏览器才能支持浏览,兼容性很弱,导致Loadrunner和jmeter(badboy)无法正常进行录制脚本.因此我们采 ...