from py2neo import Node, Graph, Relationship, NodeMatcher,Subgraph
from py2neo.matching import *
# 连接neo4j 数据库
test_graph = Graph('http://localhost:7474',auth=('neo4j','neo4j'))
# 建立节点, 标签名,属性值
node1 = Node('person',name='Bob')
# 此时的节点已经创建在本地,但还没有上传到 Neo4j 数据库中,因此在 Neo4j 客户端中是没有任何内容的
node2 = Node('person',name='Tom',age=12)
test_graph.create(node1)
# 使用 Graph 中的 create 方法来上传数据。
test_graph.create(node2)
# 创建节点,属性值用字典表示
node3 = Node('person',**{'name':'Jack','age':13,'sex':'male'})
test_graph.create(node3)
# 更新节点、关系的属性值。push
# 如果设置成 none,该属性值会被删除。也可以直接删除属性值
node1['age']=10
test_graph.push(node1)
del node2['name]
# 创建关系,如果创建关系时,两个节点不存在则自动创建节点。添加属性值
re12 = Relationship(node1, 'know', node2,**{'years':10})
test_graph.create(re12)
# 更新关系属性值
r['time'] = '20210917'
test_graph.push(r)
# 删除节点,会同时把与之相连的关系删除。
test_graph.delete(node1)
# 以字典形式返回节点属性
print(dict(node2))
# 返回某个节点的label
print(node1.labels)
# 删除节点的标签
node1.labels.remove('person')
# merge 合并
r = Relationship(node1, 'call', node2, **{'count':5})
test_graph.merge(r)
# 查询节点。返回match类型的数据,可以继续使用 where(),first(), oreder_by()操作,也可以用list强制转换
print(type(test_graph.nodes.match('person')))
test_graph.nodes.match('person').all()
test_graph.nodes.match('person').first()
test_graph.nodes.match('person').count()
test_graph.nodes.match('person').where(age=10).first()
list(test_graph.nodes.match('person').limit(3))
list(test_graph.nodes.match('person').order_by("_.name"))
# 构建matcher再进行查询
matcher = NodeMatcher(test_graph)
matcher.match('person',name='Jack').first()
# 使用正则表达式进行查询
matcher.match("person").where(name=LIKE(".*o.*")).order_by("_.name").limit(3).all()
matcher.match("person", age=IN([10, 11, 12])).all()
# 查询 关系
test_graph.match(nodes=[node1,node2],r_type='call').first()
从mysql读取数据,然后批量插入节点(5000个)
# 读取数据
import pandas as pd
import pymysql
connect_mysql = pymysql.connect(host='localhost', user='root', password='root',database='neo4jdata')
person_df = pd.read_sql('select * from person', con=connect_mysql)
# 开启事务批量插入,耗时2.5s
tx = test_graph.begin()
nodes = []
for i in range(len(person_df)):
onenode = Node('person',**({
'id':str(person_df['id'][i]),
'name':person_df['name'][i],
'sex':person_df['sex'][i]
}))
nodes.append(onenode)
subnodes = Subgraph(nodes)
tx.create(subnodes)
tx.commit()
'''
逐行读取逐行插入,耗时166.8s
for i in range(len(person_df)):
onenode = Node('person',**({
'id':str(person_df['id'][i]),
'name':person_df['name'][i],
'sex':person_df['sex'][i]
}))
test_graph.create(onenode)
'''
Py2neo 连接问题
不同版本的py2neo连接函数参数不同,注意区分。
参见
https://blog.csdn.net/u010785550/article/details/116856031
中文输入乱码
参见
https://blog.csdn.net/giraffe_kun/article/details/111401240
版本匹配问题
error:The old parameter syntax {param}
is no longer supported. Please use $param
instead
参见
https://www.cnblogs.com/nfuquan/p/13130518.html
(别的bug遇到了再来改)
参考教程
https://www.jianshu.com/p/febe8a248582