py2neo学习记录

py2neo

通用

# -*- coding: UTF-8 -*-
from py2neo import Graph, Node, Relationship, walk, NodeMatcher, RelationshipMatcher, Subgraph

graph = Graph("http://localhost:7474", username="neo4j", password="123456")

# 建立节点
node1 = Node('Person' , name = 'Bob')  
node2 = Node('Person' , name = 'Alice')
graph.create(node1)
graph.create(node2)

# 建立关系
r1 = Relationship(node2 , 'know' , node1)  
graph.create(r1)

# 设置节点属性
node1['age'] = 21
node1['height'] = 180
graph.push(node1)

data = {
    'age':24,
    'height':177
}
node2.update(data)
graph.push(node2)

# 设置关系属性
r1['level'] = 'familiar'
graph.push(r1)

  • 查节点
# 查找标签为Person,属性name="Alice"的节点,并返回第一个结果
graph.nodes.match("Person", name="Alice").first()

# 查找所有标签为Person,name以B开头的节点,并将结果按照age字段排序
res = graph.nodes.match("Person").where("_.name =~ 'B.*'").order_by('_.age')

# 查找id为4的节点
t_node = graph.nodes[4]


graph.evaluate()执行一个Cypher语句并返回结果的第一条数据

# 执行Cypher语句并返回结果集的第一条数据
res = graph.evaluate('MATCH (p:Person) return p')
# 输出:(_3:Person {age: 20, name: 'Bob'})
print(res)
  • 查关系

graph.match(nodes=None, r_type=None, limit=None)查找符合条件的关系,第一个参数为节点集合或者集合(起始节点,终止节点),如果省略代表所有节点。第二个参数为关系的属性,第三个为返回结果的数量。也可以使用match_one()代替,返回一条结果。

# 查找id为196的关系
rel = graph.relationships[196]

# 查找所有以a为起点,并且属性为know的关系
res = graph.match((a, ), r_type="know")
# 打印关系的终止节点,即为a所有认识的人
for rel in res:
  print(rel.end_node["name"])
  • 查子图

graph.run()执行Cypher语句并返回结果数据流的游标Cursor,通过forward()方法不断向前移动游标可以向前切换结果集的每条记录Record对象.

# 查询(p1)-[k]->(p2),并返回所有节点和关系
gql="MATCH (p1:Person)-[k:know]->(p2:Person) RETURN *"
cursor=graph.run(gql)
# 循环向前移动游标
while cursor.forward():
  # 获取并打印当前的结果集
  record=cursor.current
  print(record)


# 还可以将graph.run()返回的结果通过data()方法转化为字典列表,所有结果整体上是一个列表,其中每一条结果是字典的格式
# 查询(p1)-[k]->(p2),并返回所有节点和关系
gql = "MATCH (p1:Person)-[k:know]->(p2:Person) RETURN *"
res = graph.run(gql).data()
print(res)

# 通过graph.run().to_subgraph()方法将返回的结果转化为SubGraph对象,接着按之前操作SubGraph对象的方法取得节点对象
# 查询(p1)-[k]->(p2),并返回所有节点和关系
gql = "MATCH (p1:Person)-[k:know]->(p2:Person) RETURN *"
sub_graph = graph.run(gql).to_subgraph()
# 获取子图中所有节点对象并打印
nodes=sub_graph.nodes
for node in nodes:
  print(node)
  • 通过属性值来查找节点和关系(find,find_one)
node1 = graph.find_one(
  label="Person",
  property_key="name",
  property_value="Bob"
)
print(node1['name'])
  • 补充
# 查
data1 = test_graph.run('MATCH (a:人) RETURN a')   # 返回的是cursor对象
data1 = data1.data()   # 返回的是list
print(data1, type(data1))
 
 
# 查节点
print(pd.DataFrame(test_graph.nodes.match('人')))
 
print(pd.DataFrame(test_graph.nodes.match('人', name='莎莎')))
 
# 查关系
 
print(list(test_graph.match(r_type='喜欢')))
 
# py2neo提供了专门的查询模块 NodeMatcher节点  RelationshipMatcher关系
# ================== 测试NodeMatcher
nodeMatcher = NodeMatcher(test_graph)
node = nodeMatcher.match('人')
print(pd.DataFrame(list(node)))
 
# 返回列表的第一个节点
node = nodeMatcher.match('人').first()
print(node)
# 返回列表中age为21的节点
node = nodeMatcher.match('人').where(age=21)
print(list(node))
————————————————
版权声明:本文为CSDN博主「luer9」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40046426/article/details/112837659

# 删除节点
node3 = Node('animal' , name = 'cat')
graph.create(node3)
graph.delete(node3)

# 删除子图
gql = "MATCH (p1:Person)-[k:know]->(p2:Person) RETURN *"
sub_graph = graph.run(gql).to_subgraph()
graph.delete(sub_graph)
# 删除所有图
graph.delete_all()
# 删除关系rel
# 查找所有以a为起点,并且属性为know的关系
res = graph.match((a, ), r_type="know")
for rel in res:
	graph.separate(rel)

先查到指定节点,然后直接修改属性后使用graph.push(node)即可

from py2neo import Graph, NodeMatcher, Subgraph

tx = graph.begin()
# 找到你要找的Nodes
matcher = NodeMatcher(graph)
nodes = matcher.match("User")
# 将返回的“Match”类转成list
new_nodes = list(nodes)
## 添加你要修改的东西
for node in new_nodes:
    node['tag'] = node['tag'].split(',')
# 里面是Node的list可以作为Subgraph的参数
sub = Subgraph(nodes=new_nodes)
# 调用push更新
tx.push(sub)
tx.commit()
原文地址:https://www.cnblogs.com/wonker/p/15202727.html