neo4j-Py2neo使用

neo4j-Py2neo(一):基本库介绍使用

py2neo的文档地址:https://neo4j-contrib.github.io/py2neo/

py2neo的本质是可以采用两种方式进行操作,一种是利用cypher语句,一种是使用库提供的DataTypes,Data类的实例需要和远程的数据库中一一对应。

说明
Core Graph API直接可以直接从py2neo引用的几个核心类。负责具体执行提交的类。
Data Typesneo4j的核心,节点关系等。也就是py2neo.data,这个类下面的所有成员都可以直接从py2neo引用。
Cyphercypher语言执行后的结果如何访问,在这个类中。
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')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm运行正常,但命令行执行提示module不存在的多种解决方式

问题描述 在执行某个测试模块时出现提示&#xff0c;显示自定义模块data不存在&#xff0c;但是在PyCharm下运行正常。错误信息如下&#xff1a; Traceback (most recent call last):File "/run/channelnterface-autocase/testcases/test_chanel_detail.py", line 2…

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…

蜘点云原生之 KubeSphere 落地实践过程

作者&#xff1a;池晓东&#xff0c;蜘点商业网络服务有限公司技术总监&#xff0c;从事软件开发设计 10 多年&#xff0c;喜欢研究各类新技术&#xff0c;分享技术。 来源&#xff1a;本文由 11 月 25 日广州站 meetup 中讲师池晓东整理&#xff0c;整理于该活动中池老师所分享…

npm login报错:Public registration is not allowed

npm login报错:Public registration is not allowed 1.出现场景2.解决 1.出现场景 npm login登录时,出现 2.解决 将自己的npm镜像源改为npm的https://registry.npmjs.org/这个&#xff0c;解决&#xff01;

Android Studio 显示前进后退按钮

在写代码的过程中我们经常需要快速定位到先前或者往后的代码位置&#xff0c;可以使用Alt左右箭头 但是新安装的Android Studio工具栏上是没有显示左右箭头的工具按钮的&#xff0c;需要我们设置将Toolbar显示出来 View-Appearance-Toolbar 勾选即可 显示后

Qt窗体常用属性设置

01 显示屏尺寸&#xff1a; QDesktopWidget 获取系统屏幕大小 QDesktopWidget* pDesktopWidget QApplication::desktop();//获取可用桌面大小 QRect deskRect QApplication::desktop()->availableGeometry(); //获取主屏幕分辨率 QRect screenRect QApplication::deskt…

关于反射机制的简单理解

1、反射的简单认识 1.1 定义 Java的反射&#xff08;reflection&#xff09;机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;既然能拿到,那么我…

el-form与el-upload结合上传带附件的表单数据(后端篇)

1.写在之前 本文采用Spring Boot MinIO MySQLMybatis Plus技术栈&#xff0c;参考ruoyi-vue-pro项目。 前端实现请看本篇文章el-form与el-upload结合上传带附件的表单数据&#xff08;前端篇&#xff09;-CSDN博客。 2.需求描述 在OA办公系统中&#xff0c;流程表单申请人…

【图的应用一:最小生成树】- 用 C 语言实现普里姆算法和克鲁斯卡尔算法

目录 一、最小生成树 二、普里姆算法的构造过程 三、普里姆算法的实现 四、克鲁斯卡尔算法的构造过程 五、克鲁斯卡尔算法的实现 一、最小生成树 假设要在 n 个城市之间建立通信联络网&#xff0c;则连通 n 个城市只需要 n - 1 条线路。这时&#xff0c;自然会考虑这样…

Android的组件、布局学习

介绍 公司组织架构调整&#xff0c;项目组需要承接其他项目组的android项目&#xff0c;负责维护和开发新需求&#xff0c;故学习下基础语法和项目开发。 组件学习 Toolbarheader布局部分 就是app最顶部的部分 他的显示与否&#xff0c;是与F:\androidProject\android_lear…

功能点估算的常规流程

功能点估算流程在软件项目管理中起着重要的作用&#xff0c;它可以帮助项目团队更好地理解项目的需求和目标&#xff0c;从而提高项目的成功率和效率。如果功能点估算未按流程进行&#xff0c;可能会导致项目估算不准确&#xff0c;估算时间超出预期等问题。 因此功能点估算的常…

Linux: sysctl: network: ip_no_pmtu_disc,容易搞混的参数名称

这个参数的迷惑性在于双重否定,字面意思是关闭PMTU发现的功能。如果设置为1,代表关闭;如果是0,代表不关闭pmtu发现的功能。所以说明里,有disable/enable,就容易搞混。所以要甄别网上的某些博客的说明,不要被误导。 ip_no_pmtu_disc - INTEGER Disable Path MTU Discover…

设计测试用例(万能思路 + 六种设计用例方法)(详细 + 图解 + 实例)

一、设计测试用例的万能思路 针对某个物品/功能进行测试。 万能思路&#xff1a;功能测设 界面测试 性能测试 兼容性测试 易用性测试 安全测试。 总结&#xff1a; 功能测试&#xff1a; 水杯&#xff1a;装水、喝水... 注册场景&#xff1a;注册 登录 想象日常使用…

西南科技大学数字电子技术实验五(用计数器设计简单秒表)FPGA部分

一、实验目的 1.进一步理解用中规模集成计数器构成任意进制计数器的原理。 2.了解计数器的简单应用。 3.进一步学习与非门和译码显示器的使用方法。 4.学会用FPGA实现本实验内容。 二、实验原理 简单秒表 可暂停、复位秒表 三、程序清单(每条语句必须包括注释或在开发…

[Linux] LVS+Keepalived高可用集群部署

一、Keepalived实现原理 1.1 高可用方案 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色…

Jenkins+Docker+Gitee搭建自动化部署平台

目录 服务器准备 Docker安装 yum 包更新到最新 设置yum源 安装docker 启动和开机启动 验证安装是否成功 Jenkins安装 拉取镜像 创建映射目录 运行镜像 运行出错 修正权限 重新运行镜像 新建安全组&#xff0c;放通8080端口 激活Jenkins Jenkins插件 Jenkins全…

【论文解读】Comparing VVC, HEVC and AV1 using Objective and Subjective Assessments

时间&#xff1a;2020 级别&#xff1a;IEEE 机构&#xff1a; IEEE 组织 摘要&#xff1a; 对3种最新的视频编码标准HEVC (High Efficiency video Coding)测试模型HM (High Efficiency video Coding)、amedia video 1 (AV1)和Versatile video Coding测试模型 (VTM)进行了客观和…

UE5 水材质注意要点

1、两个法线反向交替流动&#xff0c;可以去观感假的现象 2、水面延边的透明度低 3、增加水面延边的浪花 4、增加折射 折射要整体质量至少在High才有效果 改为半透明材质没有法线信息&#xff1f; 5、处理反射效果 勾选为true 找到这个放在水域 勾为false&#xff0c;即可有非…

欺骗技术:网络反情报的艺术

网络攻击变得越来越普遍和复杂。例如&#xff0c;2022 年&#xff0c;数据泄露的平均成本高达 445 万美元&#xff0c;显示了这些威胁的严重影响。 这清楚地表明对先进安全方法的需求与日俱增。迅速流行的技术之一是欺骗技术。 与直接阻止或识别威胁的标准安全方法不同&…

MATLAB版本、labview版本、UHD版本 互相对应

LabVIEWMATLABUHD2019R2021bUHD_3.15.0.0-vendor2020R2022bUHD_4.1.0.4-vendorR2023bUHD_4.2.0.0-vendor 更换固件 MATLAB 更换固件指令 status sdruload(Device "X310", IPAddress 192.168.10.2)