|
使用python语言操作neo4j数据库对于python开发者来说,Py2neo库可以完成对neo4j的操作。首先安装Py2neo,建立数据库连接。Py2neo使用pip安装:pipinstallpy2neo1连接数据库连接前,先确保neo4j服务开启:建立连接代码示例:定义db为待使用的neo4j连接[默认的账号密码均为“neo4j”,若已修改则为新的,我的密码已修改为“12345678”]#Graph("http://127.0.0.1:7474",auth=("账号","密码"))importpy2neodb=Graph("http://localhost:7474",auth=("neo4j","12345678"))123后续添加结点时可能会报错,==CannotdecoderesponsecontentasJSON==此时只需要将连接语句修改为:即指定连接数据库name=‘neo4j’db=Graph("http://localhost:7474",auth=("neo4j","12345678"),name='neo4j')1建立结点、关系建立结点时候要定义结点的标签和一些基本属性。Node:创建节点基本语法:node_1=Node(*labels,**properties)db.create(node_1)12注意:代码中,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)123456789运行结果:在localhost:7474/中查询发现:Relationship:创建关系基本语法:Relationship((start_node,type,end_node,**properties))1例如: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)12345678表示创建三个结点关系,例如node_1是node_2的教主。需要注意的是,如果建立关系的时候起始结点不存在,则建立关系的同时会建立这个结点。Path:路径基本语法:Path(*entities)1注意entities是实体(关系,节点都可以作为实体)。例如:frompy2neoimportPath#建一个路径:比如按照该路径查询,或者遍历的结果保存为路径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)1234567*Subgraph:子图子图是节点和关系的任意集合,它也是Node、Relationship和Path的基类。基本语法:Subgraph(nodes,relationships)1空子图表示为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)1234567891011工作流GraphService:基于图服务的工作流。Graph:基于图数据库的工作流(前文所述的基本上都是如此)。Transaction:基于事务的工作流。通常,该种方式通过Graph.begain(readonly=False)构造函数构造,参数readonly表示只读,不给参数默认开始写。示例代码如下:#创建一个新的事务transaction_1=db.begin()#事务开始#创建一个新nodenode_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()#事务提交1234567891011121314删除结点删除数据库中所有节点和关系:db.delete_all()1其他删除方法如下(删除的基础是查询,但凡查询条件没错,就不会删错):#删除所有:谨慎使用#db.delete_all()12'运行运行删除单个节点#db.delete(node)#node在前面已经定义好1'运行运行run方法运行Neo4j指令代码进行删除#按照节点id删除:要删除某个节点之前,需要先删除关系。否则会报错:ClientErrordb.run('match(r)whereid(r)=3deleter')#按照name属性删除:先增加一个单独的节点:node_x=Node('英雄',name='韦一笑')db.create(node_x)db.run('match(n:英雄{name:\'韦一笑\'})deleten')#删除一个节点及与之相连的关系db.run('match(n:英雄{name:\'韦一笑\'})detachdeleten')#删除某一类型的关系db.run('match()-[r:喜欢]->()deleter;')1234567891011删除子图#delete(self,subgraph)1'运行运行修改结点改的基础也是查询,查到就可以改,因此本文的重点放在查询上,下面示例简单修改。#改#将狮王的武力值改为100node_9['武力值']=100#本地修改完,要push到服务器上哦db.push(node_9)12345查询结点db的nodes属性包含图当中的所有节点信息,可以使用match方法来找到相应节点,请参考以下代码:n=db.nodes.match("英雄")foriinn:print(i)123当然也可以进行更为细致的匹配,请参考以下代码n=db.nodes.match("英雄",武力值=100)foriinn:print(i)123这里为啥只有一个呢?是因为上面的武力值一个是数值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()12345678910111213141516171819202122232425262728NodeMatcher:定位满足特定条件的节点。基本语法:NodeMatcher(graph).match(*labels,**properties)1结合不同的方法可以取得不同的效果。主要方法表如下所示:方法名功能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=0fornodeinnode_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)12345678910111213141516171819202122232425NodeMatchNodeMatch:基本用法,NodeMatch(graph,labels=frozenset({}),predicates=(),order_by=(),skip=None,limit=None)1可以看出,NodeMatch的参数和NodeMatcher的参数完全不同。后面是可以加很多条件的,包含的主要方法如下表:方法作用iter(match)遍历所匹配节点len(match)返回匹配到的节点个数all()返回所有节点count()返回节点计数,评估所选择的节点limit(amount)、返回节点的最大个数order_by(*fields)按指定的字段或字段表达式排序。要引用字段或字段表达式中的当前节点,请使用下划线字符where(*predicates,**properties)二次过滤#遍历查询到的节点frompy2neoimportNodeMatchnodess=NodeMatch(db,labels=frozenset({'英雄'}))#遍历查询到的节点print('='*15,'遍历所有节点','='*15)fornodeiniter(nodess):print(node)#查询结果计数print('='*15,'查询结果计数','='*15)print(nodess.count())#按照武力值排序查询结果:注意引用字段的方式,前面要加下划线和点:_.武力值print('='*10,'按照武力值排序查询结果','='*10)wu=nodess.order_by('_.武力值')foriinwu:print(i)1234567891011121314151617RelationshipMatcherRelationshipMatcher:用于选择满足一组特定标准的关系的匹配器。基础语法:relation=RelationshipMatcher(db)1frompy2neoimportRelationshipMatcher#查询某条关系relation=RelationshipMatcher(db)#None表示anynode哦!不是表示空print('='*10,'hate关系查询结果','='*10)x=relation.match(nodes=None,r_type='hate')forx_inx: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='情敌')forx_inx:print(x_)12345678910111213141516171819202122RelationshipMatch基本语法:RelationshipMatch(graph,nodes=None,r_type=None,predicates=(),order_by=(),skip=None,limit=None)1可以按照NodeMatch理解参考https://zhuanlan.zhihu.com/p/437824721
|
|