py2neo操作图数据库——知识图谱实战-2
py2neo操作图数据库
连接数据库
#导入py2neo
from py2neo import Node, Graph, Relationship,NodeMatcher
#连接数据库
link = Graph("http://localhost:7474", auth=("neo4j", "neo4j"))#在高版本Graph不支持username参数,也创建了图
创建节点和关系
简易练习
node3 = Node('animal' , name = 'cat')
node4 = Node('animal' , name = 'dog')
node2 = Node('Person' , name = 'Alice')
node1 = Node('Person' , name = 'Bob')
r1 = Relationship(node2 , 'know' , node1)
r2 = Relationship(node1 , 'know' , node3)
r3 = Relationship(node2 , 'has' , node3)
r4 = Relationship(node4 , 'has' , node2)
self.graph.create(node1)
self.graph.create(node2)
self.graph.create(node3)
self.graph.create(node4)
self.graph.create(r1)
self.graph.create(r2)
self.graph.create(r3)
self.graph.create(r4)
简单例子
from py2neo import Node, Graph, Relationship,NodeMatcher
#过程:1、创建图 2、创建节点 3、建立关系 4、查找
class DataToNeo4j(object):
"""将excel中数据存入neo4j"""
def __init__(self):
"""建立连接"""
# link = Graph("http://localhost:7474", username="neo4j", password="wangmeng")#老版本neo4j用这个调用
link = Graph("http://localhost:7474", auth=("neo4j", "1999623Xt"))#在高版本Graph不支持username参数,也创建了图
self.graph = link
#self.graph = NodeMatcher(link)
# 定义label
self.buy = 'buy'
self.sell = 'sell'
self.graph.delete_all()#之前做的所有内容先删掉
self.matcher = NodeMatcher(link)
def create_node(self, node_buy_key,node_sell_key):
"""建立节点"""
for name in node_buy_key:
buy_node = Node(self.buy, name=name)#name是这个节点的属性
self.graph.create(buy_node)
for name in node_sell_key:
sell_node = Node(self.sell, name=name)
self.graph.create(sell_node)
def create_relation(self, df_data):
"""建立关系"""
m = 0
for m in range(0, len(df_data)):
try:
print(list(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'")))#打印关系里面的buy和sell节点,.where是匹配条件
print(list(self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'")))#这样写是为了匹配dataframe里面的字符串
rel = Relationship(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'").first(),
df_data['money'][m], self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'").first())
self.graph.create(rel)
except AttributeError as e:
print(e, m)
从excel读取数据并创建数据库
数据

创建节点
test_data = pd.read_excel('test_data_Demo.xls', header=0)
def data_extraction():
"""节点数据抽取"""
# 取出甲方名称到list
node_buy_key = []
for i in range(0, len(test_data)):
node_buy_key.append(test_data['甲方名称'][i])
# 取出乙方名称到list
node_sell_key = []
for i in range(0, len(test_data)):
node_sell_key.append(test_data['乙方名称'][i])
# 去除重复的发票名称
node_buy_key = list(set(node_buy_key))
node_sell_key = list(set(node_sell_key))
# value抽出作node
node_list_value = []
for i in range(0, len(test_data)):
for n in range(1, len(test_data.columns)):
node_list_value.append(test_data[test_data.columns[n]][i])
# 去重
node_list_value = list(set(node_list_value))
# 将list中浮点及整数类型全部转成string类型
node_list_value = [str(i) for i in node_list_value]
return node_buy_key, node_sell_key,node_list_value
创建节点关系
def relation_extraction():
"""练习题数据抽取"""
links_dict = {}
sell_list = []
money_list = []
buy_list = []
for i in range(0, len(test_data)):#遍历数据,采集下面三个数据
money_list.append(test_data[test_data.columns[2]][i])#交易金额
sell_list.append(test_data[test_data.columns[1]][i])#乙方方名称
buy_list.append(test_data[test_data.columns[0]][i])#甲方名称
# 将数据中int类型全部转成string,全部数据转换为字符串
sell_list = [str(i) for i in sell_list]
buy_list = [str(i) for i in buy_list]
money_list = [str(i) for i in money_list]
# 整合数据,将三个list整合成一个dict
links_dict['buy'] = buy_list
links_dict['money'] = money_list
links_dict['sell'] = sell_list
# 将数据转成DataFrame
df_data = pd.DataFrame(links_dict)
print(df_data)#练习题中34个元素
return df_data
完整的代码
from py2neo import Node, Graph, Relationship,NodeMatcher
#过程:1、创建图 2、创建节点 3、建立关系 4、查找
class DataToNeo4j(object):
"""将excel中数据存入neo4j"""
def __init__(self):
"""建立连接"""
# link = Graph("http://localhost:7474", username="neo4j", password="wangmeng")#老版本neo4j用这个调用
link = Graph("http://localhost:7474", auth=("neo4j", "neo4j"))#在高版本Graph不支持username参数,也创建了图
self.graph = link
#self.graph = NodeMatcher(link)
# 定义label
self.buy = 'buy'
self.sell = 'sell'
self.graph.delete_all()#之前做的所有内容先删掉
self.matcher = NodeMatcher(link)
"""
这里是官方小练习,跟本题无关
node3 = Node('animal' , name = 'cat')
node4 = Node('animal' , name = 'dog')
node2 = Node('Person' , name = 'Alice')
node1 = Node('Person' , name = 'Bob')
r1 = Relationship(node2 , 'know' , node1)
r2 = Relationship(node1 , 'know' , node3)
r3 = Relationship(node2 , 'has' , node3)
r4 = Relationship(node4 , 'has' , node2)
self.graph.create(node1)
self.graph.create(node2)
self.graph.create(node3)
self.graph.create(node4)
self.graph.create(r1)
self.graph.create(r2)
self.graph.create(r3)
self.graph.create(r4)
"""
def create_node(self, node_buy_key,node_sell_key):
"""建立节点"""
for name in node_buy_key:
buy_node = Node(self.buy, name=name)#name是这个节点的属性
self.graph.create(buy_node)
for name in node_sell_key:
sell_node = Node(self.sell, name=name)
self.graph.create(sell_node)
def create_relation(self, df_data):
"""建立关系"""
m = 0
for m in range(0, len(df_data)):
try:
print(list(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'")))#打印关系里面的buy和sell节点,.where是匹配条件
print(list(self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'")))#这样写是为了匹配dataframe里面的字符串
rel = Relationship(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'").first(),
df_data['money'][m], self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'").first())
self.graph.create(rel)
except AttributeError as e:
print(e, m)
if __name__ == "__main__":
data=DataToNeo4j()
data.create_node()
data.create_relation()
from build_node_relation import DataToNeo4j
import pandas as pd
test_data = pd.read_excel('test_data_Demo.xls', header=0)
#可以先阅读下文档介绍API应用:https://py2neo.org/v4/index.html
def data_extraction():
"""节点数据抽取"""
# 取出甲方名称到list
node_buy_key = []
for i in range(0, len(test_data)):
node_buy_key.append(test_data['甲方名称'][i])
# 取出乙方名称到list
node_sell_key = []
for i in range(0, len(test_data)):
node_sell_key.append(test_data['乙方名称'][i])
# 去除重复的发票名称
node_buy_key = list(set(node_buy_key))
node_sell_key = list(set(node_sell_key))
# value抽出作node
node_list_value = []
for i in range(0, len(test_data)):
for n in range(1, len(test_data.columns)):
node_list_value.append(test_data[test_data.columns[n]][i])
# 去重
node_list_value = list(set(node_list_value))
# 将list中浮点及整数类型全部转成string类型
node_list_value = [str(i) for i in node_list_value]
return node_buy_key, node_sell_key,node_list_value
def relation_extraction():
"""练习题数据抽取"""
links_dict = {}
sell_list = []
money_list = []
buy_list = []
for i in range(0, len(test_data)):#遍历数据,采集下面三个数据
money_list.append(test_data[test_data.columns[2]][i])#交易金额
sell_list.append(test_data[test_data.columns[1]][i])#乙方方名称
buy_list.append(test_data[test_data.columns[0]][i])#甲方名称
# 将数据中int类型全部转成string,全部数据转换为字符串
sell_list = [str(i) for i in sell_list]
buy_list = [str(i) for i in buy_list]
money_list = [str(i) for i in money_list]
# 整合数据,将三个list整合成一个dict
links_dict['buy'] = buy_list
links_dict['money'] = money_list
links_dict['sell'] = sell_list
# 将数据转成DataFrame
df_data = pd.DataFrame(links_dict)
print(df_data)#练习题中34个元素
return df_data
create_data = DataToNeo4j()#调用外部py的子函数,建立连接,把图数据库先建好
create_data.create_node(data_extraction()[0], data_extraction()[1])#建立买方,卖方结点。利用函数的第0个,第1个返回值
create_data.create_relation(relation_extraction())#建立关系,利用relation_extraction返回的dataframe
图数据建立


浙公网安备 33010602011771号