用Python连接Neo4j实现增删改查
目录
一、 Neo4j简介
图数据库也称为图形数据库管理系统或GDBMS。图数据库的基本含义是以“图”这种数据结构存储和查询数据,而不是存储图片的数据库。它的数据模型主要是以**节点和关系(边)**来体现,也可处理键值对。
Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。
Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下,而不是严格、静态的表中。但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注。
二、安装py2neo模块
在用python连接neo4j之前,需要安装py2neo模块,安装之前一定要将翻墙软件关闭,否则会出现错误,这个错误困扰我好几天,没想到因为这个原因,一直安装不上。具体的py2neo模块导入步骤如下:
- 点击file-setting进入设置界面。
- 在python解释器中点击加号搜索py2neo,注意对勾打上,之后点击导入即可,如下图所示:
三、连接Neo4j
在连接neo4j的时候需要neo4j的账户名和密码,如果忘记了可以通过下面的办法找回来:打开dbms文件夹,找到auth文件并删除,重新启动neo4j,此时使用浏览器访问neo4j就可以使用默认的用户名密码登录,之后再修改自己的账号密码,修改之后之前导入的节点都在。
下面开始正式的导入:
# 连接Neo4j数据库输入地址、用户名、密码
url = 'bolt://localhost:7687'
key = 'birthday_name'
usr = 'neo4j'
graph = Graph(url,auth = (usr,key))
matcher = NodeMatcher(graph) #创建关系需要用到
连接完成之后我们开始创建新节点,看是否真连接上了neo4j。
四、增删改查
4.1 增
1. 增加结点
语法:
节点编号=Node('节点标签名称',name='节点名称' ) # 左边标签,右边是节点
a = Node('owl_Class', name = 'banana') # 创建一个label = 'owl_Class',属性name值为'banana',此时节点并没有真的传到Neo4j
graph.create(a) # 将节点a创建到数据库
创建新节点在neo4j中的显示如下:
2. 增加关系
先创建好所需要的节点,如下:
# 1.创建结点
a = Node('owl_Class', name = 'banana') # 创建一个label = 'owl_Class',属性name值为'banana',此时节点并没有真的传到Neo4j
b = Node('owl_Class', name = 'apple')
c = Node('ns1_Mammal',name = 'monkey')
graph.create(a) # 将节点a创建到数据库
graph.create(b) # 将节点b创建到数据库
graph.create(c) # 将节点b创建到数据库
再创建关系,这里我们创建“eat”这个关系属性,猴子吃香蕉这个关系,代码如下:
# 2.创建关系(已有节点)
cRelation = matcher.match('ns1_Mammal',name = 'monkey').first()
aRelation = matcher.match('owl_Class',name = 'banana').first()
a_eat_c = Relationship(c,'eat',a)
graph.create(a_eat_c) # 将创建传递到图上
结果如下:
3.增加属性
之前我们创建的节点只有名字,下面我们给他们增加属性和属性值。代码如下:(代码是依据前面我们创建结点的前提下的)
from py2neo import Graph, Node, Relationship
from py2neo.matching import *
url = 'bolt://localhost:7687'
key = '19981017hlt'
usr = 'neo4j'
graph = Graph(url, auth=(usr, key))
matcher = NodeMatcher(graph) # 创建节点匹配器
node=matcher.match('owl_Class').where(name = 'pig').first() # 评估匹配并返回匹配的第一个节点
node.setdefault('age',default='30')
# setdefault() 如果此节点具有的属性age,则返回其值。如果没有,添加‘age’属性和对应的属性值'30'
node['number']='002' #添加“number”属性对应的属性值为“002”
print('node:')
print(node) #打印节点信息
graph.push(node) #将更改或者添加的放到图中
运行结果:可以看到添加了属性age和number。
打印结果
D:\ruanJian\python.exe D:/ruanJian/Project/ZCGC.py
node:
(_176:owl_Class {age: '30', name: 'pig', number: '002'})
4.2 删
1. 删除全部结点
graph.delete_all()
print('您已经删除成功!')
2.根据名字删除一个结点
node=matcher.match('owl_Class').where(name = 'pig').first() #先匹配,叫pig的第一个结点
graph.delete(a) #a代表前面已经定义的结点
删除之前我们可以看到有9个结点,
删除之后就8个了。
3. 删除一个标签
a.remove_label('owl_Class2') #括号里面的是节点名称
4.3 改
1.改变属性
node=matcher.match('owl_Class').where(name = 'pig').first() # 评估匹配并返回匹配的第一个节点
node.setdefault('sex',default='male')
# setdefault() 如果此节点具有的属性age,则返回其值。如果没有,添加‘age’属性和对应的属性值'30'
node['number']='001' #添加“number”属性对应的属性值为“002”
node['age']='10'
node['home']='AnHui'
print('node:')
print(node) #打印节点信息
graph.push(node) #将更改或者添加的放到图中
注意:setdefault只能用name,用id就会报错。
这里我们改变了age,number等,并加了home,sex等属性。
2. 改变和查同步
node = Node('ns1_Mamal', name = 'pig')
graph.create(node)
node_id = node.identity
print('修改之前:',node)
print('id号是:',node_id)
create_node = matcher[node_id]
node['name']='cat'
print('修改之后:', node)
运行结果:
D:\ruanJian\python.exe D:/ruanJian/Project/ZCGC.py
修改之前: (_158:ns1_Mamal {name: 'pig'})
id号是: 158
修改之后: (_158:ns1_Mamal {name: 'cat'})
由此可见:改属性直接这样node[‘属性名字’]=‘属性值’
4.4 查
1. 查找节点id/根据id查找节点
用 node.identity 获取节点的 id ,用节点匹配器根据id查找节点。代码如下:
# 第一步:先创建一个结点
node = Node('ns1_Mamal', name = 'pig')
graph.create(node)
print(node)
# 第二步:获取节点的id
node_id = node.identity
print(node_id)
# 第三步:根据id查找节点
create_node = matcher[node_id]
print(create_node)
运行结果:
D:\ruanJian\python.exe D:/ruanJian/Project/main.py
(_174:ns1_Mamal {name: 'pig'})
174
(_174:ns1_Mamal {name: 'pig'})
Process finished with exit code 0
Neo4j里面的运行结果:
如果我们要删除该节点直接在第三步后面接着写下面这段代码即可。如下:
# 第四步:删除节点
graph.delete(create_node)
print('删除该节点成功!')
运行结果:
D:\ruanJian\python.exe D:/ruanJian/Project/main.py
(_147:ns1_Mamal {name: 'pig'})
147
(_147:ns1_Mamal {name: 'pig'})
删除该节点成功!
问题
如何在自己导入的项目中增删改查?
node=matcher.match('ns1__Mamal').where(name = 'Tiger').first()
graph.delete(node)
node=matcher.match(ns1__Mammal).where(name = 'Tiger').first()
graph.delete(node)
报错什么原因