python 与 neo4j 交互(py2neo 使用)

参考自:neo4j的python.py2neo操作入门
官方文档:The Py2neo Handbook — py2neo 2021.1
安装:pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple

1 节点 / 关系 / 属性 / 路径

节点(Node)和关系(relationship)是构成图的基础,节点和关系都可以有多个属性(property),并且均可以作为实体

重点:

  1. 节点:在图数据库中,节点代表实体,可以拥有属性和标签。节点通常用来表示实际的数据实体,比如人、地点、事件等
  2. 关系:关系描述了节点之间的连接或关联,必须包含两个节点,且具有方向:start node →end node
  3. 路径:路径是由节点和关系组成的序列,描述了节点之间的连接路径。路径是一个完整的图形结构,由起始节点、关系和结束节点组成,表示了实体之间的关系和连接方式
  4. 属性:键-值(key-value),键是字符串类型,值,可以是原数据,也可以由原数据同类型的数组
  5. 对于一个节点来说,与之相连的关系是有输入和输出两个方向。(如node2有输入关系和输出关系:node1→node2→node3),这个特性对于遍历图很重要
  6. 一个节点可以有一个关系是指向自己的

2 连接neo4j

前置安装可以看:

#cmd窗口下
neo4j.bat console
浏览器访问 http://localhost:7474/

3 创建图对象

from py2neo import Graph, Subgraph
from py2neo import Node, Relationship, Path# 连接数据库
# graph = Graph('http://localhost:7474', username='neo4j', password='123456') # 旧版本
graph = Graph('bolt://localhost:7687', auth=('neo4j', '123456'))# 删除所有已有节点
graph.delete_all()

4 数据类型及操作

4.1 Node:节点

基本语法:Node(*labels,**properties)

# 定义node
node_1 = Node('英雄',name = '张无忌')
node_2 = Node('英雄',name = '杨逍',武力值='100')
node_3 = Node('派别',name = '明教')# 存入图数据库
graph.create(node_1)
graph.create(node_2)
graph.create(node_3)
print(node_1)

在这里插入图片描述

4.2 Relationship:关系

基本语法:Relationship((start_node, type, end_node, **properties))

# 增加关系
node_1_to_node_2 = Relationship(node_2,'教主',node_1)
node_3_to_node_1 = Relationship(node_1,'统领',node_3)
node_2_to_node_2 = Relationship(node_2,'师出',node_3)graph.create(node_1_to_node_2)
graph.create(node_3_to_node_1)
graph.create(node_2_to_node_2)

在这里插入图片描述

4.3 Path:路径

基本语法:Path(*entities)
注:entities是实体

# 建一个路径:比如按照该路径查询,或者遍历的结果保存为路径
node_4,node_5,node_6 = Node(name='阿大'),Node(name='阿三'),Node(name='阿二')
path_1 = Path(node_4,'小弟',node_5,Relationship(node_6, "小弟", node_5),node_6) # (阿大)-[:小弟 {}]->(阿三)<-[:小弟 {}]-(阿二)
graph.create(path_1)print(path_1)

在这里插入图片描述

4.4 Subgraph:子图

节点和关系的任意集合,它也是 Node、Relationship 和 Path 的基类
基本语法:Subgraph(nodes, relationships)
空子图表示为None,使用bool()可以测试是否为空,且参数要按数组输入

# 创建一个子图,并通过子图的方式更新数据库
node_7 = Node('英雄',name = '张翠山')
node_8 = Node('英雄',name = '殷素素')
node_9 = Node('英雄',name = '狮王')relationship7 = Relationship(node_1,'生父',node_7)
relationship8 = Relationship(node_1,'生母',node_8)
relationship9 = Relationship(node_1,'义父',node_9)
subgraph_1 = Subgraph(nodes = [node_7,node_8,node_9],relationships = [relationship7,relationship8,relationship9])
graph.create(subgraph_1)

在这里插入图片描述

4.5 工作流

(1)GraphService:基于图服务的工作流。
(2)Graph:基于图数据库的工作流(前文所述的基本上都是如此)。
(3)Transaction:基于事务的工作流
在一个事务里,进行多种操作,只有操作全部完成,工作流才算完成,如:
一个Transaction分两个任务:① 增加一个新节点 ② 将该节点与已有节点创建新关系
两个任务只要有一个没完成,整个工作流就不会生效
通常,该种方式通过Graph.begain(readonly=False)构造函数构造,参数readonly表示只读,无参数默认可写

# 创建一个新的事务
transaction_1 = graph.begin()# 创建一个新node
node_10 = Node('武当',name = '张三丰')
transaction_1.create(node_10)
# 创建两个关系:张无忌→(师公)→张三丰   张翠山→(妻子)→殷素素
relationship_10 = Relationship(node_1,'师公',node_10)
relationship_11 = Relationship(node_7,'妻子',node_8)transaction_1.create(relationship_10)
transaction_1.create(relationship_11)transaction_1.commit()

在这里插入图片描述

4.6 删

# 删除所有:谨慎使用
# graph.delete_all()# 按照节点id删除:要删除某个节点之前,需要先删除关系。否则会报错:ClientError
graph.run('match (r) where id(r) = 3 delete r')
# 按照name属性删除:先增加一个单独的节点:
node_x = Node('英雄',name ='韦一笑')
graph.create(node_x)
graph.run('match (n:英雄{name:\'韦一笑\'}) delete n')# 删除一个节点及与之相连的关系
graph.run('match (n:英雄{name:\'韦一笑\'}) detach delete n')
# 删除某一类型的关系
graph.run('match ()-[r:喜欢]->() delete r;')# 删除子图
# delete(self, subgraph)

4.7 改

# 将node_9狮王的武力值改为100
node_9['武力值']=100
# 本地修改后要push到服务器上
graph.push(node_9)

在这里插入图片描述

4.8 查

为了使用更复杂查询,将图数据库扩充如下:

# 为了便于查询更多类容,新增一些关系和节点
transaction_2 = graph.begin()node_100 = Node('巾帼',name ='赵敏')
re_100 = Relationship(node_1,'Love',node_100)node_101 = Node('巾帼',name ='周芷若')
re_101 = Relationship(node_1,'knows',node_101)
re_101_ = Relationship(node_101,'hate',node_100)node_102 = Node('巾帼',name ='小昭')
re_102 = Relationship(node_1,'konws',node_102)node_103 = Node('巾帼',name ='蛛儿')
re_103 = Relationship(node_103,'Love',node_1)transaction_2.create(node_100)
transaction_2.create(re_100)
transaction_2.create(node_101)
transaction_2.create(re_101)
transaction_2.create(re_101_)
transaction_2.create(node_102)
transaction_2.create(re_102)
transaction_2.create(node_103)
transaction_2.create(re_103)transaction_2.commit()

在这里插入图片描述

① NodeMatcher:定位满足特定条件的节点
基本语法:NodeMatcher.match(*labels, **properties)

方法名功能
first()返回查询结果第一个Node,没有则返回空
all()返回所有节点
where(condition,properties)二次过滤查询结果
order_by排序
# 定义查询
nodes = NodeMatcher(graph)# 按照label查询所有节点
node_hero = nodes.match("英雄").all()
print('查询结果的数据类型:',type(node_hero))# 按property查询,返回符合要求的首个节点:name-杨逍
node_single = nodes.match("英雄", name="杨逍").first()
print('单节点查询:\n', node_)# 按property查询,返回符合要求的所有节点
node_name = nodes.match(name='张无忌').all()
print('name查询结果:', node_name)# 在查询结果中循环取值
i = 0
for node in node_hero:print('label查询第{}个为:{}'.format(i,node))i+=1# get()方法按照id查询节点
node_id = nodes.get(1)
print('id查询结果:', node_id)

② NodeMatch
基本用法:NodeMatch(graph, labels=frozenset({}), predicates=(), order_by=(), skip=None, limit=None)

方法功能
iter(match)遍历所匹配节点
len(match)返回匹配到的节点个数
all()返回所有节点
count()返回节点计数,评估所选择的节点
limit(amount)返回节点的最大个数
order_by(*fields)按指定的字段或字段表达式排序 要引用字段或字段表达式中的当前节点,请使用下划线字符
where(*predicates, **properties)二次过滤
from py2neo import NodeMatchnodess = NodeMatch(graph, labels=frozenset({'英雄'}))# 遍历查询到的节点
print('=' * 15, '遍历所有节点', '=' * 15)
for node in iter(nodess):print(node)
# 查询结果计数
print('=' * 15, '查询结果计数', '=' * 15)
print(nodess.count())
# 按照武力值排序查询结果:注意引用字段的方式,前面要加下划线和点:_.武力值
print('=' * 10, '按照武力值排序查询结果', '=' * 10)
wu = nodess.order_by('_.武力值')
for i in wu:print(i)

③ RelationshipMatcher:用于选择满足一组特定标准的关系的匹配器
基础语法:relation = RelationshipMatcher(graph)

from py2neo import RelationshipMatcher
# 查询某条关系
relation = RelationshipMatcher(graph)# None表示any node,而非表示空
print('='*10,'hate关系查询结果','='*10)
x = relation.match(nodes=None, r_type='hate')
for x_ in x:print(x_)# 增加关系
re1_1 = Relationship(node_101,'情敌',node_102)
re1_2 = Relationship(node_102,'情敌',node_103)
graph.create(re1_1)
graph.create(re1_2)# 情敌查询结果
print('='*10,'hate关系查询结果','='*10)
x = relation.match(nodes=None, r_type='情敌')
for x_ in x:print(x_)   

④ RelationshipMatch
基本语法:RelationshipMatch(graph, nodes=None, r_type=None, predicates=(), order_by=(), skip=None, limit=None)
用法类同,不再赘述

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

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

相关文章

学习python的第6天,痛苦焦虑的开始是期待

小号加了她的网易云音乐小号&#xff0c;成为了她的粉丝之一&#xff0c;收到她的私信回复之后&#xff0c;便又开始期待新的回复了&#xff0c;所以嘛&#xff0c;痛苦总是从开始期待开始的............. 昨天学习了python的逻辑控制之 if 和比较 .__eq__(a) 而且在最后顺带…

Git修改提交的文件的用户名和邮箱

实现效果 提交的测试二&#xff0c;用户名&#xff1a;git1 邮箱&#xff1a;email1,更改成 newGit1、newEmail1 一、概念 Git配置文件级别 系统级、全局级、本地级&#xff0c;生效规则是本地级>全局级>系统级&#xff0c;也就是当本地级配置上此属性&#xff0c;那么…

深度学习中数据的转换

原始&#xff08;文本、音频、图像、视频、传感器等&#xff09;数据被转化成结构化且适合机器学习算法或深度学习模型使用的格式。 原始数据转化为结构化且适合机器学习和深度学习模型使用的格式&#xff0c;通常需要经历以下类型的预处理和转换&#xff1a; 文本数据&#xf…

【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis&#xff0c;一级缓存失效 1.1、概述 MyBatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个SqlSession中执行两次相同的查询&#xff0c;第一次执行完毕后&#xff0c;Mybatis会将查询到的数据缓存起来&#xff08;缓存到内存中&#xf…

B² NETWORK空投

空投要点 众多大机构支持&#xff0c;是为数不多的有 Bitcoin 主网验证 Rollup 解决方案的 BTC Layer2&#xff0c;提前埋伏其实是普通人抢早期筹码最好的方式&#xff0c;参加 B Buzz 就是手握金铲子&#xff0c;对标eth二层网络的繁荣程度你就能想象这个前景明牌空投5%给早期…

2024年 前端JavaScript入门到精通 第四天 笔记

4.1 函数的基本使用以及封装练习 ★ 函数命名规范 4.2 函数的参数以及默认参数 函数的灵魂&#xff01;&#xff01;&#xff01; 4.3 函数封装数组求和案例 4.4 函数返回值return 4.5 函数返回值细节以及上午总结 4.6 函数返回值案例-求最大值和最 4.7 函数复习以及断点进入函…

《TCP/IP详解 卷一》第3章 链路层

目录 3.1 引言 3.2 以太网 3.3 全双工 省点 自动协商 流量控制 3.4 网桥和交换机 3.5 WiFi 3.6 PPP协议 3.6.1 PPP协议流程 3.7 环回 3.8 MTU和路径MTU 3.9 隧道基础 3.9.1 GRE 3.9.2 PPTP 3.9.3 L2TP 3.10 与链路层相关的攻击 3.11 总结 3.1 引言 城域网&…

【视频编码\VVC】环路滤波基础知识

本文为新一代通用视频编码H.266\VVC原理、标准与实现的简化笔记。 定义&#xff1a;在视频编码过程中进行滤波&#xff0c;滤波后的图像用于后续编码。 目的&#xff1a;1、提升编码图像的质量。2、为后续编码图像提供高质量参考&#xff0c;获得更好的预测效果。 VVC中主要…

RabbitMQ的死信队列和延迟队列

文章目录 死信队列如何配置死信队列死信队列的应用场景Spring Boot实现RabbitMQ的死信队列 延迟队列方案优劣&#xff1a;延迟队列的实现有两种方式&#xff1a; 死信队列 1&#xff09;“死信”是RabbitMQ中的一种消息机制。 2&#xff09;消息变成死信&#xff0c;可能是由于…

RuntimeError: CUDNN_STATUS_EXECUTION_FAILED

问题描述&#xff1a; 运行代码时候报错&#xff1a; 原因&#xff1a;pytorch与cuda版本不对&#xff0c;需要重新安装。不过我在复现代码的时候一般是要求特定的环境&#xff0c;不然会有其他错误&#xff0c;所以选择其他解决办法。 解决方案&#xff1a; 在train.py开头…

跨界计算与控制,强化显控和UI, 君正MPU再添新旗舰--Ingenic MPU X2600隆重发布

近日&#xff0c;北京君正隆重发布MPU芯片新产品X2600。该产品以商业和工业应用的数个细分领域为重点目标市场&#xff0c;兼顾通用处理器应用需求。无论从CPU结构的设计&#xff0c;还是专门控制器和接口的配备&#xff0c;都体现了北京君正MPU团队“技术路线上追求自主跨界&a…

鸿蒙开发之Profiler性能分析

一、Profiler性能分析器简介 应用或服务的性能较差时,可能表现为响应速度慢、动画播放不流畅、卡顿、崩溃或极其耗电。为了避免出现这些性能问题,需要通过一系列性能分析工具来确定应用或服务对哪方面资源(例如CPU、内存、显卡、网络和设备电池)的使用率比较高。DevEco St…

代码随想录算法训练营day25|216.组合总和III

216.组合总和III 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 跟77题差不多&#xff0c;要搞清楚k确定了递归的深度 依旧用回溯三部…

Facebook的数字社交使命:连接世界的下一步

在数字化时代&#xff0c;社交媒体已成为人们生活的重要组成部分&#xff0c;而Facebook作为其中最具影响力的平台之一&#xff0c;一直以来都在努力履行着自己的使命——连接世界。然而&#xff0c;随着时代的变迁和技术的发展&#xff0c;Facebook正在不断探索着连接世界的下…

【Logback】Logback 日志框架的架构

目录 1、Logger&#xff08;记录器&#xff09; &#xff08;1&#xff09;有效级别和级别继承 &#xff08;2&#xff09;日志打印和日志筛选 &#xff08;3&#xff09;记录器命名 2、Appenders&#xff08;追加器&#xff09; 3、Layouts&#xff08;布局&#xff09;…

提示工程(Prompt Engineering)、微调(Fine-tuning) 和 嵌入(Embedding)

主要参考资料&#xff1a; 还没搞懂嵌入&#xff08;Embedding&#xff09;、微调&#xff08;Fine-tuning&#xff09;和提示工程&#xff08;Prompt Engineering&#xff09;&#xff1f;: https://blog.csdn.net/DynmicResource/article/details/133638079 B站Up主Nenly同学…

智能高压森林应急消防泵|保障森林安全|深圳恒峰

随着科技的不断发展&#xff0c;我们的生活质量得到了显著提升。在森林保护领域&#xff0c;一项创新技术正在发挥着关键作用——智能高压森林应急消防泵。这种设备不仅提高了灭火效率&#xff0c;更为森林资源的安全保驾护航。 在过去&#xff0c;面对森林火灾&#xff0c;消防…

学习Python分支结构不走弯路

1.单分支语句 """ 语法&#xff1a; if 表达式:执行语句 执行流程&#xff1a;当表达式成立的时候&#xff0c;执行语句&#xff0c;否则不执行 """age int(input(请输入你的年龄&#xff1a;)) if age > 18:print(欢迎光临&#xff01;) …

PyTorch基础:Tensor类型张量的构建与相互转换

PyTorch基础&#xff1a;Tensor类型张量的构建与相互转换 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订…

【Java】Java基础(实验一)

目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 掌握Java程序的编辑、调试与运行&#xff1b;了解Java引用类型&#xff0c;掌握数组的定义和引用。掌握Java基本数据类型和输入输出。掌握Java程序结构 二、实验内容 1.JDK的环境变量设置及测试。 &#xff08…