通过python操作neo4j

小邹子 2024-08-03 10:31:02 阅读 71

使用python语言操作neo4j数据库

对于python开发者来说,Py2neo库可以完成对neo4j的操作。

首先安装Py2neo,建立数据库连接。Py2neo使用pip安装:

<code>pip install py2neo

连接数据库

连接前,先确保neo4j服务开启:

在这里插入图片描述

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

<code># 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')code>

建立结点、关系

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

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:创建关系

基本语法:

<code>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:路径

基本语法:

<code>Path(*entities)

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

例如:

from py2neo import Path

# 建一个路径:比如按照该路径查询,或者遍历的结果保存为路径

node_4,node_5,node_6 = Node(name='阿大'),Node(name='阿二'),Node(name='阿三')code>

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 的基类。

基本语法:

<code>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表示只读,不给参数默认开始写。

示例代码如下:

<code># 创建一个新的事务

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()#事务提交

在这里插入图片描述

删除结点

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

<code>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方法来找到相应节点,请参考以下代码:

<code>n=db.nodes.match("英雄")

for i in n:

print(i)

在这里插入图片描述

当然也可以进行更为细致的匹配,请参考以下代码

<code>n=db.nodes.match("英雄",武力值=100)

for i in n:

print(i)

在这里插入图片描述

这里为啥只有一个呢?是因为上面的武力值一个是数值100,一个是字符串100.

NodeMatcher

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

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

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:定位满足特定条件的节点。

基本语法:

<code> NodeMatcher(graph).match(*labels, **properties)

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

方法名 功能
first() 返回查询结果第一个Node,没有则返回空
all() 返回所有节点
where(condition,properties) 对查询结果二次过滤
order_by 排序

# 定义查询

nodes = NodeMatcher(db)

# 单个节点,按照label和name查询

## 查询节点:杨逍

node_single = nodes.match("英雄", name="杨逍").first()code>

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()code>

print('name查询结果:',node_name)

# get()方法按照id查询节点

node_id = nodes.get(1)

print('id查询结果:',node_id)

在这里插入图片描述

NodeMatch

NodeMatch:基本用法,

<code> 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:用于选择满足一组特定标准的关系的匹配器。

基础语法:

<code>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')code>

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='情敌')code>

for x_ in x:

print(x_)

在这里插入图片描述

在这里插入图片描述

RelationshipMatch

基本语法:

<code>RelationshipMatch(graph, nodes=None, r_type=None, predicates=(), order_by=(), skip=None, limit=None)

可以按照NodeMatch理解

参考

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。