py2neo(2) --操作 Neo4j 图数据库

#encoding:utf-8
#在 database 模块中包含了和 Neo4j 数据交互的 API,最重要的当属 Graph,它代表了 Neo4j 的图数据库,
#同时 Graph 也提供了许多方法来操作 Neo4j 数据库。 Graph 在初始化的时候需要传入连接的 URI,
#初始化参数有 bolt、secure、host、http_port、https_port、bolt_port、user、password, 
#详情说明可以参考:http://py2neo.org/v3/database.html#py2neo.database.Graph。

from py2neo import Graph,Node,Relationship
# #Graph()实例化
graph=Graph("http://localhost:7474",username="neo4j",password="。。。。。。")
# #可以利用 create() 方法传入 Subgraph 对象来将关系图添加到数据库中
#a = Node('Person',name='Alice')
#b = Node('Person', name='Bob')
#r=Relationship(a,'knows',b)
#s=a|b|r 
#graph.create(s)
# #可以单独添加Node或Relationship
#a = Node('Person', name='Mike')
#graph.create(a)
#b = Node('Person', name='Jack')
#ab = Relationship(a, 'KNOWS', b)
#graph.create(ab)
#可以利用 data() 方法来获取查询结果
#data=graph.run("match (p:Person) return p.name ").data()
#print(data)
# [{'p.name': 'bob'}, {'p.name': 'Alice'}, {'p.name': 'Bob'}, {'p.name': 'Jack'}, {'p.name': 'Jack'}, {'p.name': 'Jack'}, {'p.name': 'Mike'}, {'p.name': 'Jack'}, {'p.name': 'Mike'}, {'p.name': 'Mike'}, {'p.name': 'Mike'}]

## 以字典列表的形式返回查询的结果数据 
#g.run('match(p:明星) return *').data()
## 转化为pandas数据
#g.run('match(p:明星) return p.name,p.born').to_data_frame()
## 转化为numpy数据
#g.run('match(p:明星) return p.name,p.born').to_ndarray()
 
#转换为DataFrame
#from pandas import DataFrame
#df=DataFrame(data)
#print(df)
#a = Node('Person', name='Alice', age=21, location='广州')
#b = Node('Person', name='Bob', age=22, location='上海')
#c = Node('Person', name='Mike', age=21, location='北京')
#r1 = Relationship(a, 'KNOWS', b)
#r2 = Relationship(b, 'KNOWS', c)
#graph.create(a)
#graph.create(r1)
#graph.create(r2)

#可以通过 run() 方法直接执行 CQL 语句
#data = graph.run('MATCH (p:Person) RETURN p LIMIT 5')
#print(list(data))

#更改节点或者关系的属性 :

relationships=graph.relationships
print(relationships[63])
relationships[63]['time']='2018/08/31'
graph.push(relationships[63]) graph.push(可以是关系也可以是节点)

https://blog.csdn.net/qq_32795135/article/details/81198978

y2neo的v2和v3版本有两个很简便的查找节点的函数find_one()和find(),但是在v4版本里面不见了。

现在查找节点的操作是这样子的:

from py2neo import Graph, NodeMatcher

graph = Graph()

matcher = NodeMatcher(graph)

matcher.match("Person", name="Keanu Reeves").first()

# 通过节点/关系查找相关联的节点/关系

参考 https://www.jianshu.com/p/a2497a33390f 作者写的很清楚了 

#删除节点  没有关系 

g.run('match(p:Person{name:"alice"}) delete p')

# 删除节点 有 关系的 

g.run('match(p:Person{name:"alice"}) detach delete p')

# OGM 类似于 ORM,意为 Object Graph Mapping,这样可以实现一个对象和 Node 的关联

from py2neo.ogm import GraphObject,Property
# #可以用它来结合 Graph 查询

class Person(GraphObject):
    __primarykey__='name'
    name=Property()
    age=Property()
    location=Property()
    
# #可以用它动态改变 Node 的属性,例如修改某个 Node 的 age 属性    
person=Person.match(graph).where(age=22).first()
print(person.__ogm__.node)
person.age=22
print(person.__ogm__.node)
graph.push(person)
#///////  
#可以用它来结合 Graph 查询
peson=Person.match(graph).where(age=21).first() 
print(person)
print(person.name)
print(person.age)
#也可以通过映射关系进行 Relationship 的调整,例如通过 Relationship 添加一个关联 Node
from py2neo.ogm import GraphObject,Property,RelatedTo 
class Person(GraphObject):
    __primarykey__='name'
    name=Property()
    age=Property() 
    location=Property()
    # 连接 什么关系连接什么对象  
    knows=RelatedTo('Person','KNOWS')
person=Person.match(graph).where(age=22).first() 
print(list(person.knows))  # [<Person name='Mike'>]
data=graph.run('match(p:Person{name:"Bob"})--(p1:Person) return *').data()
print(data)
new_person=Person()
new_person.name="druanta"
new_person.age=18
person.knows.add(new_person)
print(list(person.knows))
#这样我们就完成了 Node 和 Relationship 的添加,同时由于设置了 primarykey 为 name,所以不会重复添加。
#但是注意此时数据库并没有更新,只是对象更新了,如果要更新到数据库中还需要调用 Graph 对象的 push() 
#或 pull() 方法,添加如下代码即可:
#graph.push(person)
target=Person.match(graph).where(name="druanta").first()
print(list(person.knows))
person.knows.remove(target) #   #可以通过remove来删除节点间的关系
print(list(person.knows))
graph.push(person)
graph.delete(target)  # #先删除节点上的关系,才能删除节点

猜你喜欢

转载自blog.csdn.net/candy134834/article/details/82983391