python知识图谱-py2neo实现neo4j的dao类

python知识图谱-利用py2neo实现neo4j的dao类

py2neo的基本使用以及cypher的基本使用:https://blog.csdn.net/Akun_2217/article/details/135445147?spm=1001.2014.3001.5502

1. dao类需要实现的功能

neo4j实现dao类的基本单位就是子图,包括单个节点、单个子图,都属于子图。

  1. 数据库的创建

  2. 创建子图

  3. 查询子图

  4. 更改子图

  5. 删除子图

  6. 事务功能

    • 一次性插入多条数据时,要么都成功要么都失败

2. dao类具体设计

日志模块实现:https://blog.csdn.net/Akun_2217/article/details/135442731?spm=1001.2014.3001.5502

  1. 初始化对象进行连接:init
  2. 执行非查询cypher语句: execute
  3. 执行查询cypher语句: query
  4. 切换数据库: select_db
  5. 开启事务: begin_transaction
  6. 事务执行: transaction_execute
  7. 提交事务: commit_transaction
  8. 回滚事务: rollback_transaction
  9. 关闭连接 : close_connect
  10. 日志记录

3. 利用py2neo实现neo4j的dao类

  • 实际工作中使用时,将neo4j日志路径以及连接参数,卸载一个配置文件中。

  • cypher语言使用两种形式, 以match为例,其他类似:

    1. run("match (n:boss) where n.name='biden' set n.name=$newname", **{'newname':'aoguanhai'})
    2. run("match (n:boss) where n.name='biden' set n.name=$newname", newname='auguanhai')
python 复制代码
import py2neo
from utils import logger_utils

logger = logger_utils.get_logger('./')


class Neo4jDao:

    def __init__(self, url, auth):
        try:
            self.graph_server = py2neo.GraphService(url, auth=auth)
            logger.info(f'服务连接成功,主机地址:{url}....')
        except Exception as e:
            logger.info(f'服务连接失败,原因:{e}, 主机地址:{url}')
            # 使用默认数据库
            self.graph_server = None
        self.graph = None
        self.tx = None

    def select_db(self, db_name):
        if self.graph_server:
            if db_name in self.graph_server.keys():
                self.graph = self.graph_server[db_name]
                self.tx = None
                logger.info(f'已经切换数据库,数据库切换为:{db_name}, 当前事务清零')
            else:
                logger.error(f'切换数据库失败, 数据库{db_name}不存在')
        else:
            logger.error(f'数据库切换失败,原因:数据服务未连接...')

    def execute(self, cypher, **args):
        '''自动提交-执行非查询cypher,无返回结果'''
        try:
            self.graph.run(cypher, args)
            logger.info(f'自动提价执行-{cypher}执行完成。。。')
        except Exception as e:
            if not self.graph:
                logger.error(f'自动提交执行失败-{cypher}执行失败,原因:未选择数据库')
            else:
                logger.error(f'自动提交执行失败-{cypher}执行失败,原因: {e}')

    def query(self, cypher, **args):
        try:
            cursor = self.graph.run(cypher, args)
            logger.info(f'查询成功-{cypher}执行成功')
            return cursor

        except Exception as e:
            if not self.graph:
                logger.error(f'查询执行失败-{cypher}执行失败,原因:未选择数据库')
            else:
                logger.error(f'查询执行失败-{cypher}执行失败,原因: {e}')

    def transaction_execute(self, cypher, **args):
        '''非自动提交事务执行非查询语句'''
        try:
            self.tx.run(cypher, args)
            logger.info(f'事务执行成功, {cypher}执行成功')
        except Exception as e:
            if not self.tx:
                logger.error(f'事务执行失败,{cypher}执行失败,原因:未开启事务')
            else:
                logger.error(f'事务执行失败,{cypher}执行失败,原因: {e}')

    def begin_transaction(self):
        if self.tx:
            logger.warning('开启事务冲突,当前连接已经开启事务')
            logger.warning('关闭当前连接的事务')
            self.tx = None
        try:
            self.tx = self.graph.begin()
            logger.info('事务已经开启...')
        except Exception as e:
            if not self.graph:
                logger.error(f'事务开启失败,原因:未选择数据库')
            else:
                logger.error(f'事务开启失败,原因: {e}')

    def rollback_transaction(self):
        try:
            self.graph.rollback(self.tx)
            logger.info('事务已经回滚...')
        except Exception as e:
            logger.error(f'事务回滚失败, 原因{e}')

    def commit_transaction(self):
        try:
            self.graph.commit(self.tx)
            self.tx = None
            logger.info('事务提交已经完成...事务结束')
        except Exception as e:
            logger.error(f'事务提交失败, 原因{e}')

    def close_connect(self):
        self.graph_server = None
        logger.info('neo4j服务连接诶已经关闭...')


if __name__ == '__main__':
    neo4j = Neo4jDao("bolt://localhost:7687", auth=("neo4j", "a86xavwahgwwy@@@"))
    neo4j.select_db('neo4j')
    record = neo4j.query('match (n) return n')
    print(record.to_data_frame())
相关推荐
m0_748554815 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
smj2302_796826526 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
阿正呀6 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
2501_901200537 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
_.Switch7 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
Mr_sst7 小时前
Claude Code 部署与使用保姆级教程(2026 最新)
python·ai
瞎某某Blinder7 小时前
DFT学习记录[6]基于 HES06的能带计算+有效质量计算
python·学习·程序人生·数据挖掘·云计算·学习方法
m0_495496418 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume8 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
Aleeeeex9 小时前
RAG 那点事:从 8 份企业文档到能用的问答系统,全过程拆给你看
人工智能·python·ai编程