通过graph.run().to_subgraph()方法将返回的结果转化为SubGraph对象,接着按之前操作SubGraph对象的方法取得节点对象,这里的节点对象Node可以直接按照之前的Node操作
# 查询(p1)-[k]->(p2),并返回所有节点和关系 gql = "MATCH (p1:Person)-[k:KNOWS]->(p2:Person) RETURN *" sub_graph = graph.run(gql).to_subgraph() # 获取子图中所有节点对象并打印 nodes=sub_graph.nodes for node in nodes: print(node) # 输出的节点对象如下: ''' (_101:Person {name: 'xiaozhang'}) (_100:Person {name: 'xiaowang'}) (_103:Person {name: 'xiaoli'}) (_102:Person {name: 'xiaozhao'}) '''
Object-Graph Mapping将图数据库中的节点映射为python对象,通过对象的方式对节点进行访问和操作。
将图中的每种标签定义为一个python类,其继承自GraphObject,注意使用前先import。在定义时可以指定数据类的主键,并定义类的属性Property()、标签Label()、关系RelatedTo()/RelatedFrom。
from py2neo.ogm import GraphObject, Property, RelatedTo, RelatedFrom, Label class Person(GraphObject): # 定义主键 __primarykey__ = 'name' # 定义类的属性 name=Property() age=Property() # 定义类的标签 student=Label() # 定义Person指向的关系 knows=RelatedTo('Person','KNOWS') # 定义指向Person的关系 known=RelatedFrom('Person','KNOWN')
通过类方法wrap()可以将一个普通节点转化为类的对象。
类方法match(graph,primary_key)可以在graph中查找主键值为primary_key的节点
可以直接通过类构造方法创建一个对象,并直接访问对象的属性及方法,并通过关系方法add()添加关系
类的标签是一个bool值,默认为False,将其修改为True,即可为对象添加标签
# 将节点c转化为OGM类型 c=Person.wrap(c) print(c.name) # 查找Person类中主键(name)为Alice的节点 ali=Person.match(graph,'Alice').first() # 创建一个新的Person对象并对其属性赋值 new_person = Person() new_person.name = 'Durant' new_person.age = 28 # 标签值默认为False print(new_person.student) # 修改bool值为True,为对象添加student标签 new_person.student=True # 将修改后的图写入数据库 graph.push(ali)
在定义节点类时还可以定义其相关的关系,例如通过RelatedTo()定义从该节点指出的关系,RelatedFrom()定义指向该节点的关系。通过对象调用关系的对应的方法完成节点周围的关系操作,例如add()添加关系,clear()清除节点所有的关系,get()获取关系属性,remove()清楚指定的关系,update()更新关系
class Person(GraphObject): # 定义Person指向的关系 knows=RelatedTo('Person','KNOWS') # 定义指向Person的关系 known=RelatedFrom('Person','KNOWN') # 新建一个从ali指向new_person的关系 ali.knows.add(new_person) # 清除ali节点所有的know关系 ali.knows.clear() # 清除ali节点指向new_person的那个know关系 ali.knows.remove(new_person) # 更新ali指向new_person关系的属性值 ali.knows.update(new_person,year=5) # 获取ali指向new_person关系的属性year的值 ali.knows.get(new_person,'year')
通过图对象也可以调用match方法对节点、关系进行匹配
# 获取第一个主键name名为Alice的Person对象 ali = Person.match(graph, 'Alice').first() # 获取所有name以B开头的Person对象 Person.match(graph).where("_.name =~ 'B.*'")