图数据库——Neo4j(三)Driver

Neo4j提供了应用程序接口,方便其他语言(Python、Java、JavaScript、C#)调用访问

图数据库——Neo4j(三)Driver_第1张图片

本篇以Python为例,首先要下载一个neo4j-driver

pip install neo4j-driver

访问过程有几个重要的部分,连接认证会话事务

连接认证

访问Neo4j首先需要建立驱动对象实例

URI

通过URI访问,提供了两种协议

这里写图片描述

其中boltbolt://localhost:7687,主要用于单机版的Neo4j访问,或者集群中特定的机器
bolt+routingbolt+routing://graph.example.com:7687,路由访问集群中的节点? 同时在Neo3.2以上版本,可以在URI中加入路由信息,bolt+routing://graph.example.com:7687/?region=europe&country=sw

注意
图数据库——Neo4j(三)Driver_第2张图片

认证

访问需要提供用户名和密码等认证信息,Neo4j提供了三种认证方式,基本的认证(直接明文填入用户名和密码),MIT开发的Kerberos认证方式,以及定制的认证方式.

  • 简单认证:
def __init__(self, uri, user, password):
    self._driver = GraphDatabase.driver(uri, auth=(user, password)
  • Kerberos认证
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))

以及还有一些其他的连接配置选项,如连接超时时间、最大重连时间等.

会话事务

会话(sessions)

会话是管理事务序列的容器.,Neo4j中保证了线程安全,通过上下文管理自动建立会话和销毁会话

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

事务

Neo4j也提供了三种模式事务.

  • Auto-commit Transactions

限制于只有一句Cypher语句,不能在执行失败的时候自动再执行,不推荐在生产环境中使用,同时由于结果会立马返回,所以不能多个事务共享数据,因此比其他类型的事务效率低. 并且不支持因果链(见下文),但是PERIODIC COMMIT语句只能用在这种形式下.

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

能够将数据库查询语句与应用逻辑分离,同时事务函数的形式通过利用重试机制来解决连接问题和一些偶发的错误,这个需要在Driver里面进行配置.

  • Explicit transactions

运行Cypher时,可能会遇到以下错误

图数据库——Neo4j(三)Driver_第3张图片

因果链

因果链的意义在于,当运行在因果集群(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 values

Cypher里面的数据类型有两种,基本类型和结构类型

基本类型

  • Boolean
  • Integer
  • Float
  • String
  • List
  • Map

结构类型

  • Node
  • Relationship
  • Path

这就是Cypher与Python的数据类型映射关系

图数据库——Neo4j(三)Driver_第4张图片

具体相关的api参数可以查看

https://neo4j.com/docs/api/python-driver/1.5/session.html

资料来源

neo4j.com

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。

你可能感兴趣的:(非关系数据库)