Python 操作 Neo4J,Python 库 Py2Neo

Py2Neo 是一个与 Neo4j 图数据库交互的 Python 库,提供了丰富的 API,使得 Python 程序能够轻松地进行数据查询、插入、更新等操作。以下是对 Py2Neo 库的详细介绍,包括安装、基本操作以及常见的使用方法。


1. 安装 Py2Neo

首先安装 Py2Neo,可以使用 pip 命令:

pip install py2neo

2. 连接到 Neo4j 数据库

在使用 Py2Neo 之前,需要连接到 Neo4j 数据库。确保数据库已启动,并知道连接的地址、用户名和密码。

from py2neo import Graph# 创建一个与 Neo4j 数据库的连接
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))
  • bolt://localhost:7687 是 Neo4j 默认的 Bolt 协议地址。
  • auth=("neo4j", "password") 需要替换为您的用户名和密码。

3. 基本操作

Py2Neo 中,主要的操作包括节点(Node)、关系(Relationship)的创建、查询和更新等。以下介绍每种操作的用法。

3.1 创建节点

使用 Node 类来创建节点,并使用 create 方法将节点存入数据库:

from py2neo import Node# 创建一个标签为 "Person",名字为 "Alice" 的节点
alice = Node("Person", name="Alice", age=30)
graph.create(alice)

上面代码创建了一个 Person 标签的节点,并赋予了 nameage 属性。

3.2 创建关系

使用 Relationship 类可以在两个节点之间创建关系:

from py2neo import Relationship# 创建一个 Bob 节点
bob = Node("Person", name="Bob", age=25)
graph.create(bob)# 创建 Alice 和 Bob 的关系
knows_relationship = Relationship(alice, "KNOWS", bob)
graph.create(knows_relationship)

这段代码创建了 Alice 和 Bob 之间的 “KNOWS” 关系。

3.3 查询数据

可以使用 Cypher 查询语言通过 run 方法查询数据。以下是一些常见的查询方式。

  • 查找所有 Person 节点:
result = graph.run("MATCH (p:Person) RETURN p")
for record in result:print(record["p"])
  • 查找特定条件的节点或关系,例如查询名字为 “Alice” 的节点:
result = graph.run("MATCH (p:Person {name: 'Alice'}) RETURN p")
for record in result:print(record["p"])
3.4 更新节点属性

可以使用 run 方法直接执行 Cypher 更新语句,或使用 Node 对象修改属性后保存:

# 使用 Cypher 语句更新节点
graph.run("MATCH (p:Person {name: 'Alice'}) SET p.age = 31")# 或者通过更新节点对象属性
alice["age"] = 31
graph.push(alice)  # 将更改推送到数据库
3.5 删除节点和关系

可以使用 delete 方法删除单个节点或关系,也可以使用 Cypher 命令。

  • 删除特定节点:
graph.delete(alice)
  • 通过 Cypher 删除节点和关系(删除所有 Person 节点及其关系):
graph.run("MATCH (p:Person) DETACH DELETE p")

4. 批量创建和事务处理

在操作大量数据时,可以利用事务来批量创建节点和关系,以提高效率:

from py2neo import Transaction# 开始事务
with graph.begin() as tx:# 批量创建节点和关系alice = Node("Person", name="Alice")bob = Node("Person", name="Bob")tx.create(alice)tx.create(bob)tx.create(Relationship(alice, "KNOWS", bob))

这种方法可以减少单个事务的提交次数,提高性能。

5. 高级用法

5.1 使用参数化查询

参数化查询可以帮助避免 SQL 注入风险,并简化复杂查询。

name = "Alice"
result = graph.run("MATCH (p:Person {name: $name}) RETURN p", name=name)
for record in result:print(record["p"])
5.2 使用 Schema 索引和唯一约束

可以使用 Schema 索引来加速查询,并创建唯一约束以避免重复数据。

# 创建名字属性的索引
graph.schema.create_index("Person", "name")# 创建唯一约束
graph.schema.create_uniqueness_constraint("Person", "id")
5.3 使用 Graph Data Science (GDS) 算法

Py2Neo 支持调用 Neo4j Graph Data Science 算法库,例如进行社区检测、最短路径等操作:

# 查找 Alice 和 Bob 之间的最短路径
result = graph.run("""MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'}),path = shortestPath((a)-[*]-(b))RETURN path
""")
for record in result:print(record["path"])

6. 完整示例

以下代码示例演示了一个小型知识图谱的构建过程,包括节点和关系的创建、查询和更新:

from py2neo import Graph, Node, Relationship# 连接 Neo4j 数据库
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password"))# 创建节点
alice = Node("Person", name="Alice", age=30)
bob = Node("Person", name="Bob", age=25)
carol = Node("Person", name="Carol", age=27)
graph.create(alice)
graph.create(bob)
graph.create(carol)# 创建关系
graph.create(Relationship(alice, "KNOWS", bob))
graph.create(Relationship(bob, "KNOWS", carol))# 查询节点
result = graph.run("MATCH (p:Person) RETURN p")
for record in result:print(record["p"])# 更新节点
alice["age"] = 31
graph.push(alice)# 删除节点和关系
graph.delete(bob)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13544.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题

前言 qt、qml项目经常会涉及访问MySQL数据库、网络服务器,并且界面打开时的初始化过程就会涉及到链接Mysql、网络服务器获取数据,如果网络不通,卡个几十秒,会让用户觉得非常的不爽,本文从技术调研的角度讲解解决此类问…

【C语言】程序性能优化——除法运算符

【C语言】程序性能优化——除法运算符 文章目录 [TOC](文章目录) 前言一、牛顿迭代法1、数学基础2、C代码3、实验 二、二分法1、数学基础2、C代码3、实验 三、参考资料总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、牛顿迭代法 1、数学…

每日计划-1109

1. 完成 104. 二叉树的最大深度 class Solution { public:// 计算二叉树的最大深度的函数int maxDepth(TreeNode* root) {// 如果根节点为空,说明已经到达叶子节点的下一层,返回0(这里代码中 return false 应该是错误的,应该是 r…

基于YOLOv5的人群密度检测系统设计与实现

大家好,本文将介绍基于改进后的YOLOv5目标检测模型,设计并实现人群密度检测系统。 使用YOLOv5的源代码,在此基础上修改和训练模型, 数据集选用crowdhuman数据集。对yolov5源码中的文件进行修改,更换主干网络、改进损失…

鸿蒙入门——ArkUI 自定义组件间的父子双向同步状态装饰器@Link语法(四)

文章大纲 引言一、组件间状态装饰器Link 父子双向同步1、使用规则2、支持的观察变化的场景和ArkUI 刷新UI3、Link变量值初始化和更新机制3.1、初始渲染:执行父组件的build()函数后将创建子组件的新实例。3.2、Link的数据源的更新:即父组件中状态变量更新…

【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页

Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…

[SaaS] 数禾科技 AIGC生成营销素材

https://zhuanlan.zhihu.com/p/923637935https://zhuanlan.zhihu.com/p/923637935

前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)

文章目录 1. npm (Node Package Manager)2. Yarn (Yarn Package Manager)3. pnpm4. Bower5. Parcel总结 前端开发中常用的包管理器主要有以下几个: 1. npm (Node Package Manager) 简介: npm 是 Node.js 的默认包管理器,也是最广泛使用的包…

【go从零单排】Random Numbers、Number Parsing

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 这里是引用 💻代码 Random Numbers package mainimport ("fmt…

qt移植到arm报错动态库找不到

error while loading shared libraries: libAlterManager.so.1: cannot open shared object file: No such file or directory 通过设置环境变量 LD_LIBRARY_PATH就行了。 LD_LIBRARY_PATH是一个用于指定动态链接器在运行时搜索共享库的路径的环境变量。 例如: 前…

GoogleMIT:多智能体医疗决策框架MDAgents

|记昨日与国内某Top 1&2 医院科室老师及团队探讨技术、医学、信仰与责任而有感而发。 生成式基础大模型正在成为临床辅助甚至医学探索领域的宝贵工具。尽管我们在国内看到了很多企业或实验室联合医疗机构在如医疗记录生成、临床表型辅助诊疗、医疗知识问答交互、医院管理决…

【数据库】深入解析慢 SQL 的识别与优化策略

文章目录 什么是慢 SQL?慢 SQL 的危害如何检测分析慢 SQL使用 MySQL 慢查询日志利用 EXPLAIN 分析执行计划通过 Profiling 获取详细执行信息借助慢 SQL 收集分析平台 实际案例解析:600秒的慢 SQL 优化之旅问题描述初步分析优化步骤1. 优化 SQL 语句结构2…

高校大数据人工智能教学沙盘分享

大数据教学实训沙盘(TipDM-SP)是根据企业实际项目建设而成,并提供沙盘配套装置、软件以及教学实训资源。沙盘的作用主要有3个: 1、采集真实数据,解决教学中缺少真实数据的困扰; 2、形成从数据…

【C++】string模拟实现

各位读者老爷好,俺最近在学习string的一些知识。为了更好的了解string的结构,俺模拟实现了一个丐版string,有兴趣的老爷不妨垂阅!!! 目录 1.string类的定义 2.模拟实现成员函数接口 2.1.constructor&am…

c_str()函数 string类型转换成char*类型 C++实现

问题:在 class 的构造函数中,如果我们在类中初始化了 char * 类型,在调用构造函数时,如果直接传入字符串( string )类型,编译器会提出如下警告: 想要消除这个警告,就需要将 string 类型的变量转…

【vue3文件上传同时出现两个提示框,一个提示成功,一个提示失败,一个是用写死的,一个是接口返回的】

文件上传同时出现两个提示框,一个提示成功,一个提示失败,一个是用写死的,一个是接口返回的 原因: 接口返回的是字符串code200" 把判断的code码改为字符串的就好了

选择哪种Facebook广告目标更有效

在Facebook广告投放中,广告目标的选择决定了投放效果和转化率,但很多人往往忽略了这一步的细节。今天,我们来一起看看Facebook广告目标有哪些,以及如何精准选择! 1. 广告目标在投放中的重要性 广告目标不仅仅是一…

matlab实现主成分分析方法图像压缩和传输重建

原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏 为了研究图像的渐进式传输技术,前文提到过小波变换,但是发现小波变换非常适合传输缩略图,实现渐进式传输每次传输的数据量不一样,这是因为每次变换之后低频成分大约是上一…

【缓存策略】你知道 Cache Aside(缓存旁路)这个缓存策略吗

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

稀疏视角CBCT重建的几何感知衰减学习|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 Geometry-Aware Attenuation Learning forSparse-View CBCT Reconstruction 稀疏视角CBCT重建的几何感知衰减学习 01 文献速递介绍 稀疏视角锥形束计算机断层扫描(CBCT)重建的几何感知学习方法 锥形束计算机断层扫描(CBCT&a…