neo4j官方驱动支持Python语言,驱动程序主要包含Driver类型和Session类型。Driver对象包含Neo4j数据库的详细信息,包括主机url、安全验证等配置,还管理着连接池(Connection Pool);Session对象是执行事务单元的逻辑上下文,事务是在Session的上下文中执行的。由于Session不是线程安全的,并能够从Driver对象管理的连接池中回收利用(Recycle)连接,因此,Session对象是轻量级的(lightweight),用完之后应立即销毁(disposable)。

Driver对象和Session对象的关系是:Driver对象负责管理连接池,从连接池中分配连接创建Session对象;Session对象在单个线程中接收Cypher和启动事务,在事务执行完成之后,立即销毁Session对象;Driver对象负责回收连接,等待为下一个Session对象分配连接。

一,安装Python版本的Neo4j驱动

如果不关注驱动的版本,可以安装最新版本的Python驱动

pip install neo4j-driver

也可以在pip命令中指定python驱动的版本:

pip install neo4j-driver==$PYTHON_DRIVER_VERSION
pip install neo4j-driver==1.4.

二,Driver对象

在安装neo4j驱动之后,在python代码中导入GraphDatabase模块,用于查询和更新图数据库:

from neo4j.v1 import GraphDatabase

1,创建Driver对象实例

输入neo4j数据库的uri,用户的安全验证,实例化Driver对象,并创建连接池:

from neo4j.v1 import GraphDatabase
uri = "bolt://localhost:7687"
_driver = GraphDatabase.driver(uri, auth=("neo4j", "password"))

使用close()函数关闭Driver对象分配的任何连接:

_driver.close()

2,使用Driver对象来创建Session对象

Driver对象从连接池中分配连接,创建Session对象:

_session = _driver.session()

三,Session对象

Session的创建是一个轻量级的操作,由于Session不是线程安全的,因此,Session通常应该在单个线程中短暂存续,用完之后立即销毁。在Python中,推荐在with上下文中创建和销毁Session对象:

def add_person(name):
with _driver.session() as session:
session.run("CREATE (a:Person {name: $name})", name=name)

Session对象是执行事务的逻辑上下文,Cypher支持两种方式来提交事务。

1,以自动提交方式提交事务

以自动提交事务的方式执行Cypher查询,在Session对象执行Cypher语句之后,事务立即提交,因此,一次事务只能执行一个Cyper查询,返回的结果是StatementResult对象:

_session.run(statement, parameters=None)

2,以事务函数方式来提交事务

事务函数包含事务的工作单元,以事务函数方式提交事务是neo4j推荐的提交事务的方式,在事务函数方式中,一个事务可以执行多个Cypher查询。

首先,定义事务函数,传递相应的参数(Cypher语句和参数):

def create_person_node(tx, name):
tx.run("CREATE (a:Person {name: $name}) RETURN id(a)", name=name)

然后,在Session对象中启动写事务(write_transaction)来调用事务函数,返回的结果是StatementResult对象:

def add_person(driver, name):
with _driver.session() as session:
# Caller for transactional unit of work
return session.write_transaction(create_person_node, name)

三,StatementResult和Record

Session对象执行Cypher查询的结果是StatementResult类型,该类型实际上是由Record对象构成的集合,该类型的常用函数如下:

  • keys():是由Record集合的Key构成的元组
  • records():是由Record对象构成的集合
  • single():从result变量中获取下一个记录,返回值是下一个Record或None
  • peek():从结果中获取下一个Record对象,而该对象仍然保留在结果缓存中,以便后续进行处理。

Record类型是一个有序的Key/Value对的序列,这意味着,Record对象类似于由Key:Value构成的列表,Key字段的值可以通过字段名称或索引来访问:

  • items() :是由元组(key,value)构成的列表
  • keys():是由一个Record对象的key构成的元组
  • values():是由一个Record对象的value构成的元组
  • index(key):返回指定Key在Record对象内的索引

附,示例代码

class BookmarksExample(object):

    def __init__(self, uri, user, password):
self._driver = GraphDatabase.driver(uri, auth=(user, password)) def close(self):
self._driver.close() # Create a person node.
@classmethod
def create_person(cls, tx, name):
tx.run("CREATE (:Person {name: $name})", name=name) # Create an employment relationship to a pre-existing company node.
# This relies on the person first having been created.
@classmethod
def employ(cls, tx, person_name, company_name):
tx.run("MATCH (person:Person {name: $person_name}) "
"MATCH (company:Company {name: $company_name}) "
"CREATE (person)-[:WORKS_FOR]->(company)",
person_name=person_name, company_name=company_name) # Create a friendship between two people.
@classmethod
def create_friendship(cls, tx, name_a, name_b):
tx.run("MATCH (a:Person {name: $name_a}) "
"MATCH (b:Person {name: $name_b}) "
"MERGE (a)-[:KNOWS]->(b)",
name_a=name_a, name_b=name_b) # Match and display all friendships.
@classmethod
def print_friendships(cls, tx):
result = tx.run("MATCH (a)-[:KNOWS]->(b) RETURN a.name, b.name")
for record in result:
print("{} knows {}".format(record["a.name"] ,record["b.name"])) def main(self):
saved_bookmarks = [] # To collect the session bookmarks # Create the first person and employment relationship.
with self._driver.session() as session_a:
session_a.write_transaction(self.create_person, "Alice")
session_a.write_transaction(self.employ, "Alice", "Wayne Enterprises")
saved_bookmarks.append(session_a.last_bookmark()) # Create the second person and employment relationship.
with self._driver.session() as session_b:
session_b.write_transaction(self.create_person, "Bob")
session_b.write_transaction(self.employ, "Bob", "LexCorp")
saved_bookmarks.append(session_b.last_bookmark()) # Create a friendship between the two people created above.
with self._driver.session(bookmarks=saved_bookmarks) as session_c:
session_c.write_transaction(self.create_friendship, "Alice", "Bob")
session_c.read_transaction(self.print_friendships) class Neo4jProvider: def __init__(self, uri, user, password):
self._driver = GraphDatabase.driver(uri, auth=(user, password)) def close(self):
self._driver.close() def add_greeting_node(self, message):
with self._driver.session() as session:
session.write_transaction(self._create_greeting, message) @staticmethod
def _create_greeting(tx, message):
tx.run("CREATE (a:Greeting) SET a.message = $message ", message=message)

参考文档:

Neo4j Bolt Driver for Python

Sessions and transactions

Neo4j 第十二篇:使用Python驱动访问Neo4j的更多相关文章

  1. Python之路【第十二篇】:Python面向对象高级

    一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...

  2. Python之路,第十二篇:Python入门与基础12

    python3 函数3 装饰器 decorator   *** 概念:装饰器是一个函数,主要作用是用来包装另一个函数或类: 包装的目的:是在不改变原函数名的情况下,改变被包装函数(对象)的行为. 装饰 ...

  3. Python开发【第十二篇】python作用域和global nonlocal

    python的作用域 作用域也叫名字空间,是访问变量时查找变量名的范围空间 python中的四个作用域 LEGB 作用域 英文解释 英文缩写 局部作用域 Local(function) L 外部嵌套函 ...

  4. Python之路【第十二篇】:JavaScrpt -暂无内容-待更新

    Python之路[第十二篇]:JavaScrpt -暂无内容-待更新

  5. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  6. 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)

    解剖SQLSERVER 第十二篇   OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...

  7. 第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  8. 第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  9. 【译】第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

随机推荐

  1. log4net的配置及使用

    网上查了有很多种写法和配置,结果百度出来都是几种方法混合写法,拷在一起结果还不能正常运行.因此把自己做成功的代码写上来做个备份. 运行环境:log4net 2.03版本,.net 4.5 大体步骤为: ...

  2. JavaScript 日期

    JavaScript 日期 JavaScript 日期输出 默认情况下,JavaScript将使用浏览器的时区并将日期格式显示为全文本字符串: Tue Apr 02 2019 09:01:19 GMT ...

  3. Dynamics 365 登录报错:MSIS7042

    微软动态CRM专家罗勇 ,回复329或者20190504可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 今天访问我的CRM环境报错,AD FS登录页面输入用户名和密码登 ...

  4. Nginx的负载均衡算法、lvs的负载均衡算法

    NGINX: 官方默认的算法: RR:轮询 weight:权重 ip_hash:配置此项后weight项失效 第三方模块: fair:根据后端服务器的繁忙程度 url_hash:如果客户端访问的url ...

  5. 8. Go语言—指针类型

    一.指针类型介绍 普通类型,变量存的就是值,也叫值类型. 获取变量的地址,用&,比如:var a int ,获取a的地址:&a 指针类型,变量存的是一个地址,这个地址存的才是值(指针存 ...

  6. 深入理解JavaScript中的作用域和上下文

    介绍 JavaScript中有一个被称为作用域(Scope)的特性.虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,我会尽我所能用最简单的方式来解释作用域.理解作用域将使你的代码脱颖而出,减 ...

  7. luoguP1972 [SDOI2009]HH的项链

    经典颜色问题推荐博文 https://www.cnblogs.com/tyner/p/11519506.html https://www.cnblogs.com/tyner/p/11616770.ht ...

  8. Html学习之十七(表格与表单学习--排行版制作)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 2019面向对象程序设计(java)课程学习进度条

    2019面向对象程序设计(java)课程学习进度条 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 20/10 1/0 5 九九 ...

  10. QQ第三方登录-python_web开发_django框架

    准备工作 1. 成为QQ互联的开发者 参考链接: <http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E5%8F%91%E8%80%8 ...