Neo4j提供了应用程序接口,方便其他语言(Python、Java、JavaScript、C#)调用访问
本篇以Python为例,首先要下载一个neo4j-driver
pip install neo4j-driver
访问过程有几个重要的部分,连接认证、会话事务
访问Neo4j首先需要建立驱动对象实例
通过URI访问,提供了两种协议
其中bolt,bolt://localhost:7687,主要用于单机版的Neo4j访问,或者集群中特定的机器
bolt+routing,bolt+routing://graph.example.com:7687,路由访问集群中的节点? 同时在Neo3.2以上版本,可以在URI中加入路由信息,bolt+routing://graph.example.com:7687/?region=europe&country=sw
访问需要提供用户名和密码等认证信息,Neo4j提供了三种认证方式,基本的认证(直接明文填入用户名和密码),MIT开发的Kerberos认证方式,以及定制的认证方式.
def __init__(self, uri, user, password):
self._driver = GraphDatabase.driver(uri, auth=(user, password)
def __init__(self, uri, ticket):
self._driver = GraphDatabase.driver(uri,auth=kerberos_auth(ticket))
def __init__(self, uri, principal, credentials, realm, scheme, **parameters):
self._driver = GraphDatabase.driver(uri, auth=custom_auth(principal, credentials, realm, scheme, **parameters))
以及还有一些其他的连接配置选项,如连接超时时间、最大重连时间等.
会话是管理事务序列的容器.,Neo4j中保证了线程安全,通过上下文管理自动建立会话和销毁会话
def add_person(self, name):
with self._driver.session() as session:
session.run("CREATE (a:Person {name: $name})", name=name)
Neo4j也提供了三种模式事务.
限制于只有一句Cypher语句,不能在执行失败的时候自动再执行,不推荐在生产环境中使用,同时由于结果会立马返回,所以不能多个事务共享数据,因此比其他类型的事务效率低. 并且不支持因果链(见下文),但是PERIODIC COMMIT语句只能用在这种形式下.
def add_person(self, name):
with self._driver.session() as session:
session.run("CREATE (a:Person {name: $name})", name=name)
能够将数据库查询语句与应用逻辑分离,同时事务函数的形式通过利用重试机制来解决连接问题和一些偶发的错误,这个需要在Driver里面进行配置.
运行Cypher时,可能会遇到以下错误
因果链的意义在于,当运行在因果集群(causal cluster)中时,保证对于任意两个事务,后面一个事务只有当前面一个事务成功提交之后才会开始.(主要是通过记录事务运行历史,阻塞其余事务运行)
同时建议在运行多个独立的事务时,最好在各自的会话中运行,可以避免因果链带来的小延迟.
主要应用在因果集群模式中,通过自动将读写数据库的操作分配到合适的服务器中,有效利用集群资源,主要是在执行事务的时候添加标签.
def add_person(self, name):
with self._driver.session() as session:
session.write_transaction(self.create_person_node, name)
return session.read_transaction(self.match_person_node, name)
@staticmethod
def create_person_node(tx, name):
tx.run("CREATE (a:Person {name: $name})", name=name)
return None
@staticmethod
def match_person_node(tx, name):
result = tx.run("MATCH (a:Person {name: $name}) RETURN count(a)", name=name)
return result.single()[0]
Cypher里面的数据类型有两种,基本类型和结构类型
基本类型
结构类型
这就是Cypher与Python的数据类型映射关系
具体相关的api参数可以查看
https://neo4j.com/docs/api/python-driver/1.5/session.html
资料来源
neo4j.com
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。