#py2neo v3.1.2
from py2neo import Graph, Node, Relationship graph = Graph( "http://localhost:7474", username="neo4j", password="123456" )#事务-------------------------
tx=graph.begin() a = Node('Person', name='Alice2',id='123',label='ppp') #前面的lable不需要指定, 后面kv的全都是属性 #graph.create(a) 没有事务的时候直接使用graph创建节点 tx.create(a) b = Node('Person', name='Bob1') #graph.create(b) tx.create(b) ab = Relationship(a, 'KNOWS2', b) print(a,b,ab) #graph.create(ab) tx.create(ab) tx.commit() print(graph.exists(ab)) #commit之前是False, commit之后是True#Node & Relationship -------------------------
#Node 和 Relationship 都继承了 PropertyDict 类,它可以赋值很多属性,类似于字典的形式 a['class']='A' b['name']='Bob_update' ab['time']='2019-04-04' print(a,b,ab) #还可以通过 setdefault() 方法赋值默认属性 b.setdefault('class','B') #没有赋值的会使用默认属性 a.setdefault('class','甲') #已经赋值的 不会使用默认属性 print(a,b,ab) #通过update函数批量更新属性 data = { 'name': 'Amy', 'id': 222 } a.update(data) print(a,b,ab)#subgraph 子图-------------------------
s=a|b|ab # ab|ac 并集 ab&ac 交集 ab-ac取ab中有但ac中没有的 ab^ac 对称差,取ab有但ac没有和ac有但ab没有的 print('SubGraph:',s) #用 keys()、labels()、nodes()、relationships()、types() 分别获取 Subgraph 的 Key、Label、Node、Relationship、Relationship Type print('SubGraph节点:',s.nodes()) print('SubGraph关系:',s.relationships()) #frozenset 类型 #用 order() 或 size() 方法来获取 Subgraph 的 Node 数量和 Relationship 数量 print('SubGraph节点数量:',s.__order__()) #节点数量 print('SubGraph关系数量:',s.__size__()) #关系数量
#walkable 增加了遍历信息的 Subgraph -------------------------
a1 = Node('Person', name='Alice') b1 = Node('Person', name='Bob') c1 = Node('Person', name='Mike') ab1 = Relationship(a1, "KNOWS", b1) ac1 = Relationship(a1, "KNOWS", c1) w = ab1 + Relationship(b1, "LIKES", c1) + ac1 print('walk:',w) graph.create(w) #调用 walk() 方法实现遍历 for u in w.__walk__(): print(u) #按关系顺序从左向右打印节点和关系 #用 start_node()、end_node()、nodes()、relationships() 方法来获取起始 Node、终止 Node、所有 Node 和 Relationship print('walk的start_node:',w.start_node()) print('walk的end_node:',w.end_node()) print('walk的nodes:',w.nodes()) print('walk的relationships:',w.relationships())#Graph ------------------------
data = graph.data('MATCH (p:Person) return p') #返回list中字典[{},{}]的格式 可以通过pandas中的df函数转成df对象 from pandas import DataFrame data2 = graph.data('MATCH (p:Person) return p.id,p.name limit 4') df=DataFrame(data2) print(data) print(df) #使用find 和find_one查找node 使用match和match_one查找relationship node = graph.find_one(label='Person') print(node) relationship = graph.match_one(rel_type='LIKES') print(relationship) relationship['time']='2019-12-31' relationship = graph.match_one(rel_type='LIKES') print(relationship) graph.push(relationship) #推到服务器 print(graph.match_one(rel_type='LIKES')) #删除某个 Node 或relationship可以使用 delete() 方法 注意:删除 Node 时必须先删除其对应的 Relationship,否则无法删除 Node #graph.delete(relationship) #graph.delete(node)#NodeSelector 根据多个条件进行 Node 的查询 ------------------------------
a = Node('Person_select', name='Alice', age=21, location='广州') b = Node('Person_select', name='Bob', age=22, location='上海') c = Node('Person_select', name='Mike', age=21, location='北京') r1 = Relationship(a, 'KNOWS', b) r2 = Relationship(b, 'KNOWS', c) graph.create(a) graph.create(r1) graph.create(r2) from py2neo import NodeSelector selector = NodeSelector(graph) p = selector.select('Person_select',age=21) print('-----NodeSelector通过条件查询-----') print(list(p)) #使用 where() 进行更复杂的查询 p = selector.select('Person_select').where('_.name =~ "A.*"') #查询所有A开头的姓名的人 正则表达式匹配查询 print(list(p)) #使用order_by()排序 p = selector.select('Person_select').order_by('_.age') print(list(p)) #查询单个节点的话,可以使用 first() 方法 p = selector.select('Person_select').where('_.name =~ "A.*"').first() #查询所有A开头的姓名的人第一个 正则表达式匹配查询 print(list(p))#Cursor----------------------------
data = graph.run('MATCH (p:Person) return p').data() # run返回的是cursor对象 #data = graph.find(label = "Person") print(data) #print(list(data)) # list(graph.run)==graph.run.data() #print(data.data())#OGM Object Graph Mapping,这样可以实现一个对象和 Node 的关联----------------------------
from py2neo.ogm import GraphObject, Property, RelatedTo, RelatedFrom class Person_select(GraphObject): #类名对应节点label __primarykey__ = 'name' name = Property() age = Property() location = Property() knows = RelatedTo('Person_select', 'KNOWS') person = Person_select.select(graph).where(age=21).first() print(person) print(person.name) print(person.age) print(person.location) print(person.__ogm__.node) #取节点对象 person.age=200 print(person.__ogm__.node) #修改属性 graph.push(person) print(list(person.knows)) new_person = Person_select() #新建一个节点对象 new_person.name = 'Durant' new_person.age = 28 person.knows.add(new_person) #给person 和new_person新增一个关系 print(list(person.knows)) graph.push(person) #remove() 方法移除某个关联 Node person = Person_select.select(graph).where(name='Alice').first() target = Person_select.select(graph).where(name='Durant').first() person.knows.remove(target) #从person的关系中将target节点删除 graph.push(person) graph.delete(target) #删除target节点