本文主要介绍了Python对py2neo操作图数据库进行二次使用的方法,并结合实例详细分析了Python对py2neo操作图数据库进行二次使用的具体步骤、原理、相关技巧和注意事项。neo4j it的可以参考一下。
本文介绍了Python使用py2neo操作图形数据库neo4j的方法。分享给你,供你参考,如下:
1、概念
图:数据结构中的图由节点和它们之间的边组成。节点代表一个实体,边代表实体之间的连接。
数据库:以图形结构存储管理数据的数据库。有些数据库直接存储优化后的原生图结构,即原生图存储。还有一些图形数据库将图形数据序列化并存储在关系数据库或其他数据库中。
之所以用图数据库来存储数据,是因为它在处理实体间关系复杂的数据时有很大的优势。事实上,使用传统的关系数据库来处理数据之间的关系是不方便的。比如查询选修一门课的学生时需要连接两个表,需要查询选修一门课的学生选修什么课,这就需要两次连接操作。当涉及到非常复杂的关系和庞大的数据时,关系数据库的效率是非常低的。通过图形存储,可以很容易地通过节点之间的边找到结果。
图表模型:
节点是主要的数据元素,代表一个实体。
属性用于描述实体的特征,并表示为键-值对,其中键是一个字符串,可以在属性上创建索引和约束。
关系表示实体之间的关系。关系是有方向的。实体之间可以有多个关系,关系也可以有属性。
标签用于对实体进行分类。一个实体可以有多个标签,索引标签可以加快搜索速度。
2、Neo4j
Secondary是目前最流行的图形数据库。它采用原生图形存储,可以在windows下访问以下地址下载安装:https://neo4j.com/download/community-edition/.在Linux下通过以下命令下载并解压
科尔-奥http://dist.neo4j.org/neo4j-community-3.4.5-unix.tar.gz
塔尔-阿克斯夫neo4j-community-3.4.5-unix.tar.gz
修改配置文件conf/secondary.conf。
#在第22行修改load csv的L路径时,在它前面加一个#就可以从任意路径读取文件了。
# DBMS . directory . import=import
#修改第35行和第36行,设置JVM的初始堆内存和JVM的最大堆内存。
#生产环境给予JVM的最大堆内存尽可能大,但应该小于机器的物理内存。
DBMS . memory . heap . initial _ size=5g
dbms.memory.heap.max_size=10g
#修改46行,你可以把这个当成缓存。如果机器配置高,这个越大越好。
dbms.memory.pagecache.size=10g
#修改54行,去掉更改的行#,通过ip远程访问二级数据库。
dbms .连接器. default_listen_address=0.0.0.0
#默认的bolt端口是7687,http端口是7474,https网关是7473。不需要修改以下三项就可以做到。
#修改71行,删除#,将http端口设置为7687。只要不与其他端口冲突,可以自定义端口。
# DBMS . connector . bolt . listen _ address=:7687
#修改75行,删除#,将http端口设置为7474。只要不与其他端口冲突,可以自定义端口。
DBMS . connector . http . listen _ address=:7474
#修改79行,删除#,将http端口设置为7473。只要不与其他端口冲突,可以自定义端口。
DBMS . connector . https . listen _ address=:7473
# Remove #并允许从远程url加载csv。
DBMS . security . allow _ CSV _ import _ from _ file _ URLs=true
#修改250行,删除#,并设置辅助外壳端口。只要不与其他端口冲突,可以自定义端口。
dbms.shell.port=1337
#修改第254行,将辅助节点设置为可读和可写。
dbms.read_only=false
执行。/secondary在bin目录下启动服务,在浏览器http://中可以看到secondary的可视化界面,服务器ip地址:7474/browser/。
3、py2neo
Py2neo是一个社区第三方库,通过它可以更方便地使用python操作secondary。
安装py2neo:pip安装py2neo,我安装的版本是4.3.0。
3.1、Node与Relationship
创建节点以及它们之间的关系。请注意,在使用以下py2neo相关类之前,需要导入:
#导入库
从py2neo导入节点,关系
#创建节点A和B,并将它们的标签定义为人员和属性名
a=节点(' Person ',name='Alice ',height=166)
b=节点(' Person ',name='Bob ')
#向节点添加标签
a.add_label('女性')
#创建ab之间的关系
ab=关系(a,“知道”,b)
#输出节点之间的关系:(爱丽丝)-[:知道]-(鲍勃)
打印(ab)
节点和关系都继承了PropertyDict类,类似于python的字典。您可以通过以下方式分配和访问节点或关系的属性
#添加和修改节点和关系的属性
年龄=20岁
ab['时间']='2019/09/03 '
#删除属性
del a['年龄']
#打印属性
打印(一个名字)
#设置默认属性。如果没有赋值,则使用默认值,否则新值集将覆盖默认值。
a.setdefault('性别','未知')
#更新属性
a .更新(年龄=22,性别='女性')
ab.update(时间='2019/09/03 ')
3.2、Subgraph
由节点和关系组成的集合是子图。交集、并集、差集和对称差集是由关系算子得到的。
Subgraph.labels返回子图中的所有标签集,keys()返回所有属性集,nodes返回所有节点集,relationships返回所有关系集。
#构建子图
s=a | b | ab
#遍历图中的所有节点集
对于s.nodes中的项目:
打印(的节点:',项目)
通常一个图中的所有节点和关系形成一个子图然后统一写入数据库,比多次写入单个节点效率更高。
#连接到辅助数据库,输入地址、用户名和密码。
Graph=Graph(' http://localhost:7474 ',用户名='neo4j ',密码='123456 ')
#通过关系运算符将节点和关系合并成一个子图,然后写入数据库。
s=a | b | ab
图表.创建
3.3、Walkable
Walkable是在子图的基础上增加遍历信息的对象,它可以很容易地遍历图数据库。
一个可行走的物体是通过数字连接这些关系而形成的。通过walk()函数遍历它,可以使用start_Node、end_Node、Nodes、relationships属性获取开始节点、结束节点、所有节点和关系。
#组合成一个可行走的物体w
w=ab bc ac
#遍历w。
对于行走中的项目(w):
打印(项目)
#访问w的开始和结束节点。
Print('开始节点:',w.start_node,'结束节点:',w.end_node)
#访问关系列表W的所有节点
打印('节点列表:',w.nodes)
打印('关系列表:',w .关系)
运行结果是:
(:Person {年龄:20,姓名:' Bob'})
(鲍勃)-[:知道{}]-(爱丽丝)
(:Person {年龄:21岁,姓名:' Alice'})
(爱丽丝)-[:喜欢{}]-(迈克)
(:Person {name: 'Mike'})
(鲍勃)-[:知道{}]-(迈克)
(:Person {年龄:20,姓名:' Bob'})
起始节点:(:人{年龄:22,姓名:'鲍勃',性别:'女' })结束节点:(:人{年龄:22,姓名:'鲍勃',性别:'女' })
节点:(:人{年龄:22,姓名:'鲍勃',性别:'女性' }),(:人{年龄:21,姓名:'爱丽丝' }),(:人{姓名:'迈克' }),(:人{年龄:)
关系列表:((鲍勃)-[:知道{时间:' 2019/09/03'}]-(爱丽丝)-[:喜欢{}]-(迈克),(鲍勃)-[:知道{}]-(迈克))
3.4、Graph
Py2neo通过graph对象操作二级数据库。目前,secondary只支持一个数据库定义一个图。
通过graph的初始化功能完成与数据库的连接,创建一个Graph对象。
Graph.create()可以将子图写入数据库,或者一次只写入一个节点或关系。
Graph.delete()删除指定的子图,graph.delete_all()删除所有子图。
Graph.seperate()删除指定的关系。
#初始化与辅助数据库的连接,参数依次为url、用户名和密码。
Graph=Graph(' http://localhost:7474 ',用户名='neo4j ',密码='123456 ')
#写子图w
图形.创建(w)
#删除子图W
graph.delete(w)
#删除所有图表
graph.delete_all()
#删除关系rel
graph.separate(相对)
Graph.match (nodes=none,r _ type=none,limit=none)查找满足条件的关系。第一个参数是节点集或集合(开始节点,结束节点)。如果省略,则表示所有节点。第二个参数是关系的属性,第三个参数是返回结果的数量。也可以使用match_one()返回结果。例如,查找节点A认识的所有人:
#查找所有以A开头且属性为KNOWS的关系。
res=graph.match((a,),r_type='KNOWS ')
#打印关系的结束节点,即A认识的所有人。
对于相对于资源:
打印(相关结束节点['名称'])
使用graph.nodes.match()查找指定的节点。您可以使用first()、where()和order_by()等函数对搜索进行高级限制。
还可以通过节点或关系的id来查找。
#查找标记为Person且属性名为' Alice '的节点,并返回第一个结果
graph.nodes.match('Person ',name='Alice ')。首先()
#查找所有标记为Person的节点,其名称以B开头,并根据年龄字段对结果进行排序
res=graph.nodes.match('Person ')。哪里(' _。name=~ 'B.* ')。order_by('_)。年龄’)
对于res中的节点:
打印(节点['名称'])
#找到id为4的节点
t_node=graph.nodes[4]
#找到与id 196的关系
rel=graph.relationships[196]
通过图形对象执行密码操作,并处理返回的结果
Graph.evaluate()执行一个Cypher语句并返回结果的第一个数据。
#执行Cypher语句并返回结果集的第一个数据
RES=graph . evaluate(' MATCH(p:Person)return p ')
# Output:(_ 3:Person {年龄:20,姓名:' Bob'})
打印(分辨率)
Graph.run()执行Cypher语句并返回结果数据流的光标。通过forward()方法不断向前移动光标,可以将结果集中每条记录的Record对象向前切换。
# Query (p1)-[k]-(p2)并返回所有节点和关系
gql=' MATCH(P1:Person)-[k:KNOWS]-(p2:Person)RETURN * '
游标=graph.run(gql)
#循环向前移动光标
while cursor.forward():
#获取并打印当前结果集
记录=光标.当前
打印(记录)
中打印的每个记录对象如下所示,您可以看到其中的元素是一组key=value。特定的元素可以通过get(key)方法取出。方法项(键)可以以(键,值)元组的形式返回记录中指定的键。
记录k=(王晓)-[:知道{}]-(张晓)p1=(_96:人{姓名:'王晓' }) p2=(_97:人{姓名:'张晓' })
记录=光标.当前
Print ('returned by get:',record.get('k '))
对于record.items中的(key,value)(' P1 ',' p2 '):
Print('返回元组:',键,':',值到项)
#运行结果如下
'''
获得回报:(王晓)-[:知道{}]-(张晓)
通过项目返回元组:P1: (_ 92: person {name:'王晓' })
通过项目返回元组:P2: (_ 93: person {name:'张晓' })
'''
还可以通过data()方法将graph.run()返回的结果转换成字典列表。所有结果作为一个整体是一个列表,其中每个结果都是字典格式的。查询和结果如下。您可以通过访问列表和字典来获取数据:
# Query (p1)-[k]-(p2)并返回所有节点和关系
gql=' MATCH(P1:Person)-[k:KNOWS]-(p2:Person)RETURN * '
res=graph.run(gql)。数据()
打印(分辨率)
#结果如下:
'''
[{'k ':(王晓)-[:知道{}]-(张晓),
p1': (_196:Person {name:'王晓' }),
p2': (_197:Person {name:'张晓' })},
{'k ':(张晓)-[:知道{}]-(小昭),
p1': (_197:Person {name:'张晓' }),
p2': (_198:Person {name:'小昭' })},
{'k ':(小昭)-[:知道{}]-(小丽),
p1': (_198:Person {name:'小昭' }),
p2': (_199:Person {name:'小丽' })}
]
'''
通过graph.run()。to_SubGraph()方法,将返回的结果转换为子图对象,然后通过之前操作子图对象的方法得到节点对象。这里的节点对象可以直接根据上一个节点进行操作。
# Query (p1)-[k]-(p2)并返回所有节点和关系
gql=' MATCH(P1:Person)-[k:KNOWS]-(p2:Person)RETURN * '
sub_graph=graph.run(gql)。to _子图()
#获取子图中的所有节点对象并打印它们
节点=子图形.节点
对于节点中的节点:
打印(节点)
#输出节点对象如下:
'''
(_101:Person {name:'张晓' })
(_100:Person {name:'王晓' })
(_103:Person {name:'小丽' })
(_102:Person {name:'小昭' })
'''
3.5、OGM
对象-图映射将图数据库中的节点映射到python对象,并通过对象访问和操作节点。
将图中的每个标签定义为一个python类,该类继承自GraphObject。使用前请注意导入。定义时可以指定数据类的主键,定义类的属性,如Property()、Label()和RelatedTo()/RelatedFrom。
从py2neo.ogm导入GraphObject,Property,RelatedTo,RelatedFrom,Label
类别人员(GraphObject):
#定义主键
__primarykey__='name '
#定义类的属性
name=Property()
年龄=属性()
#定义类的标签
student=Label()
#定义该人指出的关系
knows=RelatedTo('Person ',' knows ')
#定义与人的关系
known=RelatedFrom('Person ',' known ')
类方法wrap()可以将普通节点转换成类对象。
Class match(graph,primary_key)可以找到图中有主键值的节点。
可以通过类构造方法直接创建对象,直接访问对象的属性和方法,通过关系方法add()添加关系。
该类的标签是一个布尔值,默认为False。将其修改为True,就可以给对象加标签了。
#将节点C转换为OGM类型
c=Person.wrap(c)
打印(姓名)
#在Person类中找到主键(名称)是Alice的节点
ali=Person.match(graph,' Alice ')。首先()
#创建一个新的Person对象,并为其属性赋值
新人员=人员()
new_person.name='Durant '
new_person.age=28
#标签值默认为False
打印(new_person.student)
#将bool值修改为True,并将学生标签添加到对象中。
new_person.student=True
#将修改后的图形写入数据库
graph.push(阿里)
定义节点类时,还可以定义其相关关系。比如RelatedTo()定义了从节点指向的关系,RelatedFrom()定义了指向节点的关系。对象调用关系的对应方法完成围绕节点的关系操作,如add()添加关系,clear()清除节点的所有关系,get()获取关系属性,remove()明确指定关系,update()更新关系。
类别人员(GraphObject):
#定义该人指出的关系
knows=RelatedTo('Person ',' knows ')
#定义与人的关系
known=RelatedFrom('Person ',' known ')
#创建从阿里到new_person的新关系
ali.knows.add(新_人)
#清除ali节点的所有已知关系
ali.knows.clear()
#清除阿里节点指向new_person的know关系。
ali.knows.remove(new_person)
#更新指向new_person关系的ali的属性值
ali.knows.update(new_person,year=5)
#获取阿里指向new_person关系的房产年份值。
ali.knows.get(new_person,' year ')
graph对象还可以调用match方法来匹配节点和关系。
#用主键名获取第一个名为Alice的Person对象
ali=Person.match(graph,' Alice ')。首先()
#获取名称以b开头的所有Person对象
Person.match(图形)。哪里(' _。name=~ 'B.* ')
还可以通过图形操作节点对象:
#更新图中阿里节点相关数据。
graph.push(阿里)
#使用图中的信息更新ali节点
graph.pull(阿里)
#删除图中的ali对象节点。
graph.delete(ali)
更多对Python相关内容感兴趣的读者,请查看我们的专题:《Python常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》和《Python入门与进阶经典教程》。
希望本文对Python编程有所帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。