通过python操作neo4j
创始人
2024-11-05 17:12:49
0

使用python语言操作neo4j数据库

对于python开发者来说,Py2neo库可以完成对neo4j的操作。
首先安装Py2neo,建立数据库连接。Py2neo使用pip安装:

pip install py2neo 

连接数据库

连接前,先确保neo4j服务开启:
在这里插入图片描述

建立连接代码示例:定义db为待使用的neo4j连接[默认的账号密码均为“neo4j”,若已修改则为新的,我的密码已修改为“12345678”]

# Graph("http://127.0.0.1:7474",auth=("账号","密码")) import py2neo db=Graph("http://localhost:7474",auth=("neo4j","12345678")) 

后续添加结点时可能会报错,== Cannot decode response content as JSON ==
此时只需要将连接语句修改为:即指定连接数据库name=‘neo4j’

db=Graph("http://localhost:7474",auth=("neo4j","12345678"),name='neo4j') 

建立结点、关系

建立结点时候要定义结点的标签和一些基本属性。

Node:创建节点

基本语法:

node_1=Node(*labels,**properties) db.create(node_1) 

注意:代码中,db.create(node_1)的作用是将本地创建的node放入数据库中,后面关系、路径等,在本地创建以后,均需要create。
示例:

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

运行结果:
在这里插入图片描述
在localhost:7474/中查询发现:
在这里插入图片描述

Relationship:创建关系

基本语法:

Relationship((start_node, type, end_node, **properties)) 

例如:

node_1_to_node_2 = Relationship(node_1,'教主',node_2) node_3_to_node_1 = Relationship(node_1,'统领',node_3) node_2_to_node_3 = Relationship(node_2,'师出',node_3)  db.create(node_1_to_node_2) db.create(node_3_to_node_1) db.create(node_2_to_node_3)  

表示创建三个结点关系,例如node_1是node_2的教主。需要注意的是,如果建立关系的时候起始结点不存在,则建立关系的同时会建立这个结点。
在这里插入图片描述

Path:路径

基本语法:

Path(*entities) 

注意entities是实体(关系,节点都可以作为实体)。
例如:

from py2neo import Path # 建一个路径:比如按照该路径查询,或者遍历的结果保存为路径 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) db.create(path_1)  print(path_1) 

在这里插入图片描述

* 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]) db.create(subgraph_1)  

在这里插入图片描述

工作流

GraphService:基于图服务的工作流。
Graph:基于图数据库的工作流(前文所述的基本上都是如此)。
Transaction:基于事务的工作流。通常,该种方式通过Graph.begain(readonly=False)构造函数构造,参数readonly表示只读,不给参数默认开始写。
示例代码如下:

# 创建一个新的事务 transaction_1 = db.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()#事务提交 

在这里插入图片描述

删除结点

删除数据库中所有节点和关系:

db.delete_all() 

其他删除方法如下(删除的基础是查询,但凡查询条件没错,就不会删错):

# 删除所有:谨慎使用 # db.delete_all() 

删除单个节点

#db.delete(node)#node在前面已经定义好 

run方法运行Neo4j指令代码进行删除

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

删除子图

# delete(self, subgraph) 

修改结点

改的基础也是查询,查到就可以改,因此本文的重点放在查询上,下面示例简单修改。

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

在这里插入图片描述

查询结点

db的nodes属性包含图当中的所有节点信息,可以使用match方法来找到相应节点,请参考以下代码:

n=db.nodes.match("英雄") for i in n:     print(i) 

在这里插入图片描述
当然也可以进行更为细致的匹配,请参考以下代码

n=db.nodes.match("英雄",武力值=100) for i in n:     print(i) 

在这里插入图片描述
这里为啥只有一个呢?是因为上面的武力值一个是数值100,一个是字符串100.

NodeMatcher

为了便于查询更多类容,使用事务的方法新增一些关系和节点

# 为了便于查询更多类容,使用事务的方法新增一些关系和节点 transaction_2 = db.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(graph).match(*labels, **properties) 

结合不同的方法可以取得不同的效果。主要方法表如下所示:

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

在这里插入图片描述

NodeMatch

NodeMatch:基本用法,

 NodeMatch(graph, labels=frozenset({}), predicates=(), order_by=(), skip=None, limit=None) 

可以看出,NodeMatch的参数和NodeMatcher的参数完全不同。后面是可以加很多条件的,包含的主要方法如下表:

方法作用
iter(match)遍历所匹配节点
len(match)返回匹配到的节点个数
all()返回所有节点
count()返回节点计数,评估所选择的节点
limit(amount)、 返回节点的最大个数
order_by(*fields)按指定的字段或字段表达式排序。要引用字段或字段表达式中的当前节点,请使用下划线字符
where(*predicates, **properties)二次过滤
# 遍历查询到的节点 from py2neo import NodeMatch nodess = NodeMatch(db,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

RelationshipMatcher:用于选择满足一组特定标准的关系的匹配器。
基础语法:

relation = RelationshipMatcher(db) 
from py2neo import RelationshipMatcher # 查询某条关系 relation = RelationshipMatcher(db)  # 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) db.create(re1_1) db.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) 

可以按照NodeMatch理解

参考
https://zhuanlan.zhihu.com/p/437824721

相关内容

热门资讯

安卓系统变身软件有哪些,盘点热... 你有没有发现,你的安卓手机最近是不是有点儿“焕然一新”了呢?是不是觉得它突然变得超级酷炫,仿佛拥有了...
安卓系统在欧珀手机,安卓系统下... 你有没有发现,最近欧珀手机在国内外的市场上可是越来越火了?这不,咱们就来聊聊安卓系统在欧珀手机中的应...
小米2原生安卓7系统,性能与体... 你有没有想过,一部手机,除了拍照、玩游戏,还能给你带来怎样的惊喜?今天,就让我带你走进小米2的世界,...
安卓最简单的手机系统,最简单手... 你有没有想过,拥有一部手机,却不用为复杂的系统烦恼?想象只需轻轻一点,就能完成所有操作,那该多美好!...
ros是安卓系统吗,揭秘安卓系... 哦,亲爱的读者,你是否曾好奇过,ROS(Robot Operating System)是不是安卓系统...
安卓系统装饰房子游戏,打造梦幻... 你知道吗?现在手机游戏可是越来越好玩了,尤其是那些可以在安卓系统上装饰房子的游戏,简直让人爱不释手!...
大厂攻略系统和安卓互通,解锁全... 你有没有想过,那些在大厂工作的朋友们,他们是如何轻松应对各种复杂的工作任务的呢?秘密武器之一,就是那...
amigoos是安卓系统吗,安... 你有没有听说过Amigoos这个软件?最近,它在网上可是引起了不小的讨论呢!很多人都在问,Amigo...
安卓如何弄系统配音,安卓系统配... 你有没有想过,你的安卓手机也能变得像电影里的配音演员一样,声音抑扬顿挫,引人入胜?没错,今天就要来教...
谷歌加大控制安卓系统,新策略解... 你知道吗?最近谷歌可是动作频频,对安卓系统进行了大刀阔斧的改革。这可不是小打小闹,而是要彻底改变安卓...
安卓纯净os系统就是苹果系统吗... 你有没有想过,安卓纯净OS系统是不是就像苹果系统那样呢?是不是一提到纯净,就让人联想到那简洁、优雅的...
win系统和安卓哪个好,谁更胜... 说到电脑操作系统,你是不是也跟很多人一样,在Win系统和安卓之间纠结不已?今天,就让我来给你好好分析...
安卓系统后台走流量,如何有效管... 你有没有发现,手机里的安卓系统有时候就像一个偷跑的小偷,悄无声息地在你不知情的情况下消耗着你的流量呢...
安卓系统upapp怎么更新,从... 亲爱的安卓用户们,你是否也遇到了这样的烦恼:每次打开upapp,总是发现它还停留在那个版本,而新版本...
安卓10系统的华为,创新与性能... 你知道吗?最近手机圈里可是热闹非凡呢!安卓10系统的新风潮已经吹到了华为的身上,让这款国产手机品牌焕...
安卓车机系统推介,安卓车机系统... 你有没有发现,现在开车出门,车机系统的重要性简直堪比手机里的操作系统呢!想象你正驾驶着爱车,突然想听...
安卓5.0系统我的世界,探索安... 亲爱的读者,你是否曾在某个午后,坐在电脑前,被《我的世界》那五彩斑斓的世界深深吸引?今天,就让我带你...
给安卓系统制造故障,揭秘幕后黑... 你知道吗?在科技飞速发展的今天,安卓系统已经成为了全球最受欢迎的手机操作系统之一。但是,你知道吗?有...
安卓系统怎么拍漫画,一键拍出精... 你有没有想过,用安卓手机也能轻松拍出漫画风格的图片呢?没错,就是那种色彩鲜艳、线条流畅,看起来就像是...
安卓系统的心酸史,从心酸起步到... 你有没有想过,我们每天离不开的安卓系统,它也有着一段不为人知的心酸史呢?想象一个从无到有,从默默无闻...