neo4j-Py2neo使用
neo4j-Py2neo(一):基本库介绍使用
py2neo的文档地址:https://neo4j-contrib.github.io/py2neo/
py2neo的本质是可以采用两种方式进行操作,一种是利用cypher语句,一种是使用库提供的DataTypes,Data类的实例需要和远程的数据库中一一对应。
类 | 说明 |
---|---|
Core Graph API | 直接可以直接从py2neo引用的几个核心类。负责具体执行提交的类。 |
Data Types | neo4j的核心,节点关系等。也就是py2neo.data,这个类下面的所有成员都可以直接从py2neo引用。 |
Cypher | cypher语言执行后的结果如何访问,在这个类中。 |
Bulk | 批量执行cypher语句。 |
Object-Graph Mapping | 将图谱映射到python类中,比如整个数据库,已知节点。 |
from py2neo import Graph
graph = Graph("bolt://localhost:7687", auth=("neo4j", "password")) # 不指定name, 就用默认数据库
graph.run("UNWIND range(1, 3) AS n RETURN n, n * n as n_sq")
Node
1, 创建节点 ,Node(*labels, **properties)。节点就是两个部分组成:标签、属性。
from py2neo import Node # 或者 from py2neo.data import Node
a = Node('Person', name='alice')
b = Node(*['Person', 'Man', 'Manager'], **{'name':'Joey'}) # 查看标签
list(a.labels)# 是否具有标签
a.has_label()# 添加标签
a.add_label('Woman')# 删除标签
a.remove_label('Person')# 删除所有标签
a.clear_labels()# 添加多个标签
a.update_labels(['Coder', 'Mother'])# 查看属性
a['name']
a.get('name', default='John')
# 属性赋值
a['name'] = 'Pheebe'# 如果没有属性,就赋予属性默认值。如果有保持原属性值。
a.setdefault('name', default='john')# 添加属性,如果存在更新属性
a.update(age=29, love='football') # 或者 a.update(**{'age':29, 'love':'football'})# 删除属性
del a['name']# 属性数量
len(a)# 字典形式返回属性,以及具有字典类似的属性
dict(a)
a.items()
a.keys()
a.values()# 删除所有属性
a.clear()# 查看对应的数据库
a.graph # 如果时None表示a还没有和远程数据库有链接。# 查看节点对应数据库中的唯一身份
a.identity
RelationShip
创建关系:
class py2neo.data.Relationship(start_node, type, end_node, **properties)[source]
class py2neo.data.Relationship(start_node, end_node, **properties)
class py2neo.data.Relationship(node, type, **properties)
class py2neo.data.Relationship(node, **properties)
from py2neo import Relationship, Node
# 创建三种方式
start = Node('Man', name='Ross')
end = Node('Woman', name='Richiel')class Love(Relationship): pass # 先指定是啥关系
rl_1 = Love(start, end)love = Relationship.type('Love') # 先制定是啥关系
rl_2 = love(start, end, )# 一般常用的就是这个。
rl_3 = Relationship(start, 'Love', end, **{'retain'='two season'}) # 如果不指定type,类型就是''# 查看关系的名称
rl_1.type.__name__# 查看关系开始结
rl_1.nodes
rl_1.start_node
rl_1.end_node# 关系的属性,和节点一样
dict(rl_1)
rl_1.keys()
rl_1.values()
rl_1.items()
# 添加、更新
rl_1.update(**{'name':'love'})
# 删除
del rl_1['name']# 以及其他的get, setdefault
rl_1.get('name', default=None)rl_1.setdefault('name', default='john')
Path
Path特点是相邻必须连接。本质上就是相邻节点必须连接的几段关系。
from py2neo import Path, Relationshipa = Node('Person', name='a')
b = Node('Person', name='b')
c = Node('Person', name='c')
d = Node('Person', name='d')
e = Node('Person', name='e')# 连接节点与节点
ab = Path(a, 'love', b)
de = Path(d, 'love', e)# 连接节点与节点与节点。。。
abc = Path(a, 'love', b, Relationship(b, 'love', c), c)# 相邻必须连接
abc = Path(a, 'love', b, Relationship(a, 'love', c), c) # 报错ValueError: Cannot append walkable love(Node('Person', name='a'), Node('Person', name='c')) to node Node('Person', name='b')# 连接节点与关系
ab = Relationship(a, 'love', b)
abc = Path(ab, 'love', c)# 连接关系与关系
ca = Relationship(c, 'love', a)
abca = abcd = Path(ab, 'love', ca)# 连接节点与Path
cde = Path(c, 'love', de)# 连接Path与Path
abcde = Path(abc, 'love', de)# 查看开始结束的节点
abcde.start_node
abcde.end_node# 按照顺序查看所有节点
abcde.nodes# 按照关系查看所有关系
abcde.relationships
Subgraph
就是图。通过逻辑的方式进行创建 | & - ^
# 节点、关系、Path、subgraph之间通过逻辑进行连接就是subgraph
sub1 = abc | abca
sub2 = abc & abca # 节点与关系都必须在两边都存在
sub3 = abc - abca # 节点关系在前者存在,在后者不存在
sub4 = abc ^ abca # 各自独特的部分,sub1|sub2 - sub1&sub2# 查看所有节点,关系
sub4.nodes
sub4.relationships# 查看图中所有关系的type
sub4.types()# 查看图中所有节点的属性key以及标签的集合
sub4.keys()
sub4.labels()
Data Types就完事了,剩下就是增删改查事务提交等数据库通用性的东西。数据库的操作都是以事务为单位,所以先从事务执行返回的结果record看起。
class* py2neo.cypher.Record
执行语句后返回的结果是cursor,是一堆结果。record是其中一个结果,本质上就是一个字典。
cursor = graph.run('match (n) return n')
if cursor.forward():record = cursor.current# 转换为字典
dict(record) # {'n': Node('Symtom', name='脱水')}
record.data() # {'n': Node('Symtom', name='脱水')}# 所有键
record.keys() # ['n']# 所有值
record.values() # [Node('Symtom', name='脱水')]# 将record里的所有节点,关系形成一个子图
record.to_subgraph().nodes # (Node('Symtom', name='脱水'),)
py2neo.cypher.Cursor(result, hydrant=None, sample_size=3)
cursor是执行语句返回的是cursor,通过cursor来查询一个个record。
cursor = graph.run('match (n) return n')# 基本使用就是,结合forward()以及current使用
while cursor.forward():record = cursor.current# 一次性返回所有结果
record_list = cursor.data()# 转换为dataframe
cursor.to_data_frame()# 转换为ndarray
cursor.to_ndarray()# 转换为子图
cursor.to_subgraph()
Transaction
py2neo的用法就是分成两种,一种是使用cypher语句,一种是使用自己的数据类,这些类是要和远程的实际的节点一一对应。
cypher语句的使用遵循的规则是,利用$标志语句中的变量,例如match (n) where n.name=$name。输入变量值有两种方式,一种是name=‘biden’, 一种是**{‘name’:‘biden’}
# 建立一个事务
tx = Graph.auto() # 自动提交的事务,操作之后默认执行graph.commit(tx)
tx = Graph.begin() # 非自动提交的事务# 结束一个事务
Graph.commit(tx) # 提交
Graph.rollback(tx) # 回滚# 属性
tx.graph # Graph('bolt://localhost:7687', name='neo4j')
tx.readonly # False表示可以写入。# 使用cypher语句,只用一个run就可以,evaluate就是只返回第一个结果,udpate是不用返回结果
record = tx.evaluate('match (n) return n') # 返回一个数据类型,节点,关系或者子图。cursor = tx.run('match (n) return n') # 返回多个结果,是一个cursortx.update("match (n:boss) where n.name='biden' set n.name=$newname", **{'newname':'aoguanhai'})
tx.update("match (n:boss) where n.name='biden' set n.name=$newname", newname='auguanhai')# create(subgraph) 创建一个本地,create函数会在远程创建一个同样的节点/关系/子图,并和本地对应。
a = Node('Person', **{'name'})
a.graph # None,说明
tx.create(a)
a.graph # Graph('bolt://localhost:7687', name='neo4j') ,说明和远程一一对应了。# delete(subgraph) 删除远程对应的节点关系子图
tx.delete(a)
a.graph # None,说明远程已经删除。# exists(subgraph) 检测是否有远程对应
tx.exists(a) # False 已经无对应# merge(subgraph, primary_label=None, primary_key=None) # pull 更新本地,针对已经连接的
tx.pull(a)# 更新远程,针对已经连接的
a['name'] = 'bob'
tx.push(a)# separate(subgraph),删除远程中的子图中的所有关系,本地不受影响
tx = graph.begin()
a = Node('Person', name='Alice')
b = Node('Person', name='bob')
ab = Relationship(a, 'love', b)
sub = a | b | ab
tx.create(sub) # 创建
tx.separate(sub) # 删除其中的关系
graph.commit(tx)
GraphServer
from py2neo import GraphService, Graphurl = "bolt://localhost"
auth = ('neo4j', '123456')gs = GraphService(url, auth=auth)# 查看所有数据库名称
list(gs) # ['neo4j', 'system']
gs.keys() # ['neo4j', 'system']# 建立一个Graph
graph = gs['neo4j']
graph = gs.default_graph
graph = gs.system_graph# 查看gs的属性值,和字典使用方法一致。
gs.config.items()
gs.config.keys()
gs.config.values()# 查看连接地址信息
gs.connector
gs.profile
gs.uri# 查看neo4j版本
gs.kernel_version # <Version('5.14.0')>
gs.product # 'Neo4j Kernel 5.14.0 (Community)'
Graph
# 建立一个Graph,也从GraphServer建立
graph = Graph(uri=url, auth=auth, name='neo4j') # 创建事务,在事务已经介绍过了
tx_auto = graph.auto()
tx = graph.begin()# 提交事务
graph.commit(tx)# create(subgraph),创建一个自动提交事务进行create,注意tx_auto并不支持create。
from py2neo import *a = Node('person', name='ali')
b = Node('person', name='bli')
c = Node('person', name='cli')ac = Relationship(a, 'fr', c)
bc = Relationship(b, 'fr', c)sub = ac|bc
graph.create(sub)# delete(subgraph),也是自动提交
graph.delete(a)# delete_all(),删除全部
graph.delete_all()# evaluate(cypher, parameters=None, **kwparameters),执行cypher语句,按照cypher语句规则进行就可以。
record = graph.evaluate('match (n) return n') # 返回一个record# exists(subgraph) 查看是否存在
graph.exists(sub)# match(nodes=None, r_type=None, limit=None),用来匹配关系。nodes是(start_node, end_node),r_type是关系类型,如果nodes=(Node, c),表示所有end_node是c的关系。
list(graph.match((None, c) ,r_type='fr')) # 查找所有以c为朋友的人
'''
[fr(Node('person', name='ali'), Node('person', name='cli')),fr(Node('person', name='bli'), Node('person', name='cli'))]
'''# match_one(nodes, r_type), 值匹配一个关系。
graph.match_one((None, c) ,r_type='fr') # fr(Node('person', name='ali'), Node('person', name='cli'))# nodes, relationships,获取所有节点关系到本地,可以使用match进行匹配。
list(graph.nodes.match("person", **{'name':'cli'})) # [Node('person', name='cli')]list(graph.relationships.match((a, c), 'fr')) # [fr(Node('person', name='ali'), Node('person', name='cli'))]# pull(subgraph),将已经连接的子图从远程更新
graph.pull(sub)# push(subgraph),从本地已经连接到的子图更新到远程
graph.push(sub)# separate(subgraph) ,从已经连接的子图删除关系
graph.separate(sub)# cypher操作,run,update(无返回结果), query(只能查),使用方法就是使用cypher的规则
graph.run('match (n) where n.name=$name return n', name='cli')
graph.query('match (n) where n.name=$name return n', name='cli')
graph.update('match (n) where n.name=$name set n.name=$newname', name='cli', newname='ccli')
相关文章:
neo4j-Py2neo使用
neo4j-Py2neo(一):基本库介绍使用 py2neo的文档地址:https://neo4j-contrib.github.io/py2neo/ py2neo的本质是可以采用两种方式进行操作,一种是利用cypher语句,一种是使用库提供的DataTypes,Data类的实例需要和远程…...
uint29传输格式
前言 不知道谁想出来的。 反正我是想不到。 我看网上也没人讲这个。 写篇博客帮一下素未谋面的网友。 uint29 本质上是网络传输的时候,借用至多4字节Bytes,表达29位的无符号整数。 读8位数字,判断小于128? 是的话,返回末7位…...
Linux:终端定时自动注销
这样防止了,当我们临时离开电脑这个空隙,被坏蛋给趁虚而入 定几十秒或者分钟,如果这个时间段没有输入东西那么就会自动退出 全局生效 这个系统中的所有用户生效 vim /etc/profile在末尾加入TMOUT10 TMOUT10 这个就是10 秒,按…...
STM32F103RCT6开发板M3单片机教程06--定时器中断
前言 除非特别说明,本章节描述的模块应用于整个STM32F103xx微控制器系列,因为我们使用是STM32F103RCT6开发板是mini最小系统板。本教程使用是(光明谷SUN_STM32mini开发板) STM32F10X定时器(Timer)基础 首先了解一下是STM32F10X…...
数据库故障Waiting for table metadata lock
场景:早上来发现一个程序,链接mysql数据库有点问题,随后排查,因为容器在k8s里面。所以尝试重启了pod没有效果 一、重启pod: 这里是几种在Kubernetes中重启Pod的方法: 删除Pod,利用Deployment重建 kubectl delete pod mypodDepl…...
Springboot数据校验与异常篇
一、异常处理 1.1Http状态码 HTTP状态码是指在HTTP通信过程中,服务器向客户端返回的响应状态。它通过3位数字构成,第一个数字定义了响应的类别,后两位数字没有具体分类作用。以下是常见的HTTP状态码及其含义: - 1xx(信…...
第三十六章 XML 模式的高级选项 - 创建子类型的替换组
文章目录 第三十六章 XML 模式的高级选项 - 创建子类型的替换组创建子类型的替换组将子类限制在替换组中 第三十六章 XML 模式的高级选项 - 创建子类型的替换组 创建子类型的替换组 XML 模式规范还允许定义替换组,这可以是创建选择的替代方法。语法有些不同。无需…...
堆与二叉树(上)
本篇主要讲的是一些概念,推论和堆的实现(核心在堆的实现这一块) 涉及到的一些结论,证明放到最后,可以选择跳过,知识点过多,当复习一用差不多,如果是刚学这一块的,建议打…...
HBase查询的一些限制与解决方案
Apache HBase 是一个开源的、非关系型、分布式数据库,它是 Hadoop 生态系统的一部分,用于存储和处理大量的稀疏数据。HBase 在设计上是为了提供快速的随机读写能力,但与此同时,它也带来了一些查询上的限制: 没有SQL支持…...
软件开发 VS Web开发
我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 目录 介绍: 角色和职责: 软件开发人员: Web开发人员: 技能: 软件开发人员: Web开发人…...
基于Springboot的旅游网站设计与实现(论文+调试+源码)
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...
【从零开始学习--设计模式--策略模式】
返回首页 前言 感谢各位同学的关注与支持,我会一直更新此专题,竭尽所能整理出更为详细的内容分享给大家,但碍于时间及精力有限,代码分享较少,后续会把所有代码示例整理到github,敬请期待。 此章节介绍策…...
条款6:若不想使用编译器自动生成的函数,就该明确拒绝
有些场景我们不需要编译器默认实现的构造函数,拷贝构造函数,赋值函数,这时候我们应该明确的告诉编译器,我们不需要,一个可行的方法是将拷贝构造函数和赋值函数声明为private。 class HomeForSale { ... }; HomeForSal…...
零基础也能制作家装预约咨询小程序
近年来,随着互联网的快速发展,越来越多的消费者倾向于使用手机进行购物和咨询。然而,许多家装实体店却发现自己的客流量越来越少,急需一种新的方式来吸引顾客。而开发家装预约咨询小程序则成为了一种利用互联网技术来解决这一问题…...
Mybatis的插件运⾏原理,如何编写⼀个插件?
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…...
C++复合数据类型:字符数组|读取键盘输入|简单读写文件
文章目录 字符数组(C风格字符串)读取键盘输入使用输入操作符读取单词读取一行信息getline使用get读取一个字符 读写文件 字符数组(C风格字符串) 字符串就是一串字符的集合,本质上其实是一个“字符的数组”。 在C中为了…...
Windows11环境下配置深度学习环境(Pytorch)
目录 1. 下载安装Miniconda2. 新建Python3.9虚拟环境3. 下载英伟达驱动4. 安装CUDA版Pytorch5. CPU版本pytorch安装6. 下载并配置Pycharm 1. 下载安装Miniconda 下载安装包:镜像文件地址 将Miniconda相关路径添加至系统变量的路径中。 打开Anaconda Powershell Pr…...
泛型深入理解
泛型的概述 泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。 泛型的格式:<数据类型>; 注意:泛型只能支持引用数据类型。 集合体系的全部接口和实现类都是支持泛型的使用的。 泛型的…...
Linux内核模块
文章目录 一、内核模块介绍二、模块讲解1、最简模块代码:2、模块三要素3、常用操作命令3.1、 lsmod:显示已加载模块状态3.2、 insmod:载入模块3.3、rmmod:卸载模块3.4、dmesg:显示信息3.5、modinfo:显示ker…...
Java 栈和队列的交互实现
文章目录 队列和栈的区别一.用队列模拟实现栈1.1入栈1.2出栈1.3返回栈顶元素1.4判断栈是否为空 二.用栈模拟实现队列2.1 入队2.2出队2.3peek2.4判断队列是否为空 三.完整代码3.1 队列模拟实现栈3.2栈模拟实现队列 队列和栈的区别 栈和队列都是常用的数据结构,它们的…...
HarmonyOS应用开发者高级认证满分指南
声明:由于HarmonyOS应用开发者高级认证的题库一直在变,所以文章中的题目直做参考。 1. 判断题 云函数打包完成后,需要到APPGallery Connect创建对应函数的触发器才可以在端侧中调用。 【错】每一个自定义组件都有自己的生命周期。 【对】基…...
CSharp中Blazor初体验
Blazor 是一个由微软开发的开源 Web 框架,用于构建富客户端 Web 应用程序使用 C# 语言和 .NET 平台。Blazor 允许开发人员使用 C# 语言来编写前端 Web 应用程序,而不需要像传统的 JavaScript 框架(如 Angular、React 或 Vue.js)那…...
Linux下新建用户,并进行授权
注意:以下操作需要在root用户下! 新增用户 adduser 用户名设置密码 passwd 用户名更改目录所有者命令 chown -R 用户名:用户名 目录更改目录权限命令 chmod -R 755 目录...
STM32为基础的模拟I2C通用8bit和16bit读取以及多字节读取
GPIO模拟I2C驱动的通用代码,I2C的寄存器地址有8位和16位的,主要解决了同一个MCU同时处理8位和16位寄存器地址芯片时候的驱动问题。 typedef enum {IIC_8BIT_BASE_ADDR,IIC_16BIT_BASE_ADDR }iic_bits_e; typedef struct {uint8_t DevAddr;uint16_t RegA…...
算法训练营Day19
#Java #二叉树 #双指针 开源学习资料 Feeling and experiences: 二叉搜索树的最小绝对差:力扣题目链接 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的…...
C++数据结构——二叉搜索树详解
目录 一,关于二叉搜索树 1.1 概念 1.2 基本结构 二,二叉搜索树接口实现 2.1 插入 2.2 查找 2.3 打印 2.4* 删除 三,二叉搜索树接口递归实现 3.1 查找 3.2 插入 3.3 删除 四,二叉搜索树的默认成员函数 五,…...
ros2机器人在gazebo中移动方案
原文连接Gazebo - Docs: Moving the robot (gazebosim.org) 很重要的地方:使用虚拟机运行Ubuntu的时候,需要关闭”加速3D图形“的那个选项,否则gazebo无法正常显示。 Moving the robot(使用命令移动机器人示例) In t…...
学习Java第74天,Ajax简介
什么是ajax AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页…...
【Java面试题】在Java中String,Stringbuffer,StringBuilder的区别?
Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在Java中String,Stringbuffer,StringBuilder的区别以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录…...
让AIGC成为你的智能外脑,助力你的工作和生活
人工智能成为智能外脑 在当前的科技浪潮中,人工智能技术正在以前所未有的速度改变着我们的生活和工作方式。其中,AIGC技术以其强大的潜力和广泛的应用前景,正在引领着这场革命。 AIGC技术是一种基于人工智能的生成式技术,它可以通…...
wordpress menu插件/长沙关键词优化公司电话
这是一篇讨论Node.js在无需修改任何代码从单核垂直扩展到多核,再水平扩展到多台集群和消息集成的分布式系统,展示了Node.JS在无缝扩展性方面要强于Java。其主要架构是Node.js微服务 消息Messaging 集群Clustering 。翻译如下: 当使用微服务…...
网站建设网站开发/站长统计网站统计
2019独角兽企业重金招聘Python工程师标准>>> 表结构与数据:https://github.com/XuePeng87/TSQLV4 表的表达式(Table Expression)是一个命名的查询表达式,MSSQL支持4种类型的表表达式:派生表、公用表表达式&…...
免费最好网站建设/域名注册需要多久
使用场景: 想要在某APP打新包之后,立即执行自动化测试的job来验证该新包。比如Job A 执行完执行Job B ,如下图所示,如何建立依赖呢? 主要有两种方法: 1、配置上游依赖; 2、配置下游依赖…...
凡科网做网站怎么样/英文外链平台
VB.NET中对于表格数据的显示经常使用到DataGridView控件,其以丰富多样的数据表呈现形式被程序猿喜爱。本人在做一个小系统中运用DataGridView控件的部分属性,这些功能的使用在使用之初比較不易去理清,随着系统接近尾声,如今对一些…...
wordpress复制数据库结构/互联网营销培训
Ubuntu环境下的“批处理”长时间生活在CLI中,“批处理”绝对能简化不少工作。在Windows环境中,建立一个后缀名为.bat的文件,输入需要的指令,保存之后执行即可,十分方便。其实在Ubuntu中也有类似的功能,而且…...
wordpress 邮箱留言/品牌网
紫上给得比较奇怪,其实没有必要用唯一分解定理。我觉得这道题用唯一分解只是为了表示大数。 但是分解得到的幂,累乘的时候如果顺序很奇怪也可能溢出。其实直接边乘边除就好了。因为答案保证不会溢出, 设定一个精度范围,如果中间结…...