# 引入库 from py2neo import Node, Relationship # 创建节点a、b并定义其标签为Person,属性name a = Node("Person", name="Alice",height=166) b = Node("Person", name="Bob") # 节点添加标签 a.add_label('Female') # 创建ab之间的关系 ab = Relationship(a, "KNOWS", b) # 输出节点之间的关系:(Alice)-[:KNOWS]->(Bob) print(ab)
Node 和 Relationship 都继承了 PropertyDict 类,类似于python的dictionary,可以通过如下方式对 Node 或 Relationship 进行属性赋值和访问
# 节点和关系添加、修改属性 a['age']=20 ab['time']='2019/09/03' # 删除属性 del a['age'] # 打印属性 print(a[name]) # 设置默认属性,如果没有赋值,使用默认值,否则设置的新值覆盖默认值 a.setdefault('sex','unknown') # 更新属性 a.update(age=22, sex='female') ab.update(time='2019/09/03')
由节点和关系组成的集合就是子图,通过关系运算符求交集&、并集|、差集-、对称差集^
subgraph.labels返回子图中所有标签集合,keys()返回所有属性集合,nodes返回所有节点集,relationships返回所有关系集
# 构建一个子图 s = a | b | ab # 对图中的所有节点集合进行遍历 for item in s.nodes: print('s的节点:', item)
通常将图中的所有节点和关系构成一个子图后再统一写入数据库,与多次写入单个节点相比效率更高
# 连接neo4j数据库,输入地址、用户名、密码 graph = Graph('http://localhost:7474', username='neo4j', password='123456') # 将节点和关系通过关系运算符合并为一个子图,再写入数据库 s=a | b | ab graph.create(s)
walkable是在子图subgraph的基础上增加了遍历信息的对象,通过它可以便捷地遍历图数据库。
通过+号将关系连接起来就构成了一个walkable对象。通过walk()函数对其进行遍历,可以利用 start_node、end_node、nodes、relationships属性来获取起始 Node、终止 Node、所有 Node 和 Relationship
# 组合成一个walkable对象w w = ab + bc + ac # 对w进行遍历 for item in walk(w): print(item) # 访问w的初始、终止节点 print('起始节点:', w.start_node, ' 终止节点:', w.end_node) # 访问w的所有节点、关系列表 print('节点列表:', w.nodes) print('关系列表:', w.relationships)
运行结果为:
(:Person {age: 20, name: 'Bob'})
(Bob)-[:KNOWS {}]->(Alice)
(:Person {age: 21, name: 'Alice'})
(Alice)-[:LIKES {}]->(Mike)
(:Person {name: 'Mike'})
(Bob)-[:KNOWS {}]->(Mike)
(:Person {age: 20, name: 'Bob'})
起始节点: (:Person {age: 22, name: 'Bob', sex: 'female'}) 终止节点: (:Person {age: 22, name: 'Bob', sex: 'female'})
节点列表: ((:Person {age: 22, name: 'Bob', sex: 'female'}), (:Person {age: 21, name: 'Alice'}), (:Person {name: 'Mike'}), (:Person {age: 22, name: 'Bob', sex: 'female'}))
关系列表: ((Bob)-[:KNOWS {time: '2019/09/03'}]->(Alice), (Alice)-[:LIKES {}]->(Mike), (Bob)-[:KNOWS {}]->(Mike))
py2neo通过graph对象操作neo4j数据库,目前的neo4j只支持一个数据库定义一张图
通过Graph的初始化函数完成对数据库的连接并创建一个graph对象
graph.create()可以将子图写入数据库,也可以一次只写入一个节点或关系