发布于2019-08-07 11:55 阅读(2621) 评论(0) 点赞(2) 收藏(1)
import pandas as pd
path="D:\\ProgramData\\Neo4j\\neo4j-community-3.4.8\\import\\"# neo4j 数据导入的根目录
data=pd.read_csv(path+"data.csv")
因为load_csb不能动态传入节点和关系的标签,故需要按照节点标签、关系标签来分成不同csv.
# 按照节点标签建立对应csv,并保存
data_label=[]
list_label=[("borrower","good"),("borrower","bad"),("contacter","good"),("contacter","bad")]
for label1,label2 in list_label:
data_label.append(data[data["label1"]==label1][data[data["label1"]==label1]["label2"]==label2])
# 保存data_label
i=1
for data_label in data_label:
data_label.to_csv(path+"data"+str(i)+"_label.csv",index=False)
i+=1
依次导入按节点标签分开的csv,语句及导入后的效果见下图,红框内为每次导入需要修改的地方:
# 导入模块
from py2neo import Graph,Node,Relationship,NodeSelector
# 连接Neo4j图形数据库,保证neo4j服务器处于start状态
graph = Graph("http://**.**.***.***:7474",
username="****", #neo4j用户名
password='****'#neo4j密码
)
print("succeed to link Neo4j data")
#读取节点csv
import os
dirs=os.listdir(path)
files_node_csv = list(filter(lambda x: x[-10:]=='_label.csv' , dirs))
print("the csv files under path1:\n",files_node_csv)
##输出内容***************************************************************************
succeed to link Neo4j data
the csv files under path1:
['data1_label.csv', 'data2_label.csv', 'data3_label.csv', 'data4_label.csv']
def LoacCsvNodes(num,files_csv,list_label):
'''
num: 每次导入的行数,用来防止内存溢出,str类型
files_csv: csv文件名列表
list_label: 节点标签列表,和file_csv同长度
'''
for i in range(len(files_csv)):
# graph.run ()中为cypher 语句
graph.run('USING PERIODIC COMMIT '+num+' \
LOAD CSV WITH HEADERS FROM "file:///'+files_csv[i]+'" AS line \
merge (n:'+list_label[i][0]+ ':'+list_label[i][1]+ \
'{ID:line.ID,name:line.name,card:line.card,IP:line.IP})')
LoacCsvNodes("3",files_node_csv,list_label)
导入后查看:
和前面直接用cypher在neo4j browser导入效果一样,用API会更方便一些,因为可以用动态变量嘛
def RelFile(data,file_name,col,rel_label,str1=""):
'''
data:原始数据集
file_name:保存的文件名
col:字段名(列),str类型
str_rel:关系标签,str类型
str1:联系人时的ID和贷款人的ID字段差别,str类型
'''
import csv
file_rel=open(path+file_name+"_rel.csv","w",newline='',encoding='utf-8')
w=csv.writer(file_rel)
w.writerow((":START_ID","rel_prop",":END_ID",":TYPE"))# import需要的header格式,load_csv可以不带
for i in range(len(data)):
data_other=data[i+1:len(data)]
data_same=data_other[data_other[col]==data[col][i]+str1].reset_index(drop=True)
if len(data_same)>0:
for j in range(len(data_same)):
w.writerow((data["ID"][i],data[col][i],data_same["ID"][j],rel_label))
file_rel.close()
RelFile(data,"contact","ID","紧急联系人",str1="_eg")
RelFile(data,"IP","IP","IP_equal")
data["phone"]=data["phone"].astype("str")
RelFile(data,"phone","phone","phone_equal")
2. IP相等关系
其他关系依次建立,这样建立关系比较适合小数据集,因为match(n)是在全节点中搜索,如果没有标签限制,还没加索引,那速度是可以想象的
依次导入每个关系csv即可
# 读取关系数据
files_rel_csv = list(filter(lambda x: x[-8:]=='_rel.csv' , dirs))
print("the csv files under path1:\n",files_rel_csv)
# 导入关系数据函数
def LoadCsvRel(num,files_csv,list_rel_label,node_label1="",node_label2=""):
'''
num: 每次导入的行数,防止内存溢出,str类型
files_csv:文件名列表
list_label: 节点标签列表,和file_csv同长度
'''
for i in range(len(files_csv)):
graph.run('USING PERIODIC COMMIT '+num+' \
LOAD CSV FROM "file:///'+files_csv[i]+'" AS line \
MATCH (a'+node_label1+'{ID:line[0]}),(b'+node_label2+'{ID:line[2]}) \
merge (a)-[r:'+list_rel_label[i]+'{prop:line[1]}]-> (b) '
)
list_rel_label=["contacter","IP_equal","phone_equal"]# 和file_rel_csv 对应
LoadCsvRel("3",files_rel_csv,list_rel_label)
查看:
导入时需停止neo4j 服务器,清空graph.db下的所有文件(即清库)
admin import 对导入的文件有一定的要求:
data[":Label"]=data["label1"]+";"+data["label2"]
data=data.drop(columns=["label1","label2"])
# import对列名有要求,冒号后面的字段时必须有的,且保持一致
data.columns=["node_ID:ID","name","card","phone","IP",":LABEL"]
data.head()
结果:
load_csv中我们已经处理好了关系文件,可以直接用啦
在命令窗口中输入,记得在noe4j的根目录下哦:
bin\neo4j-admin import --nodes import\nodes.csv --relationships import\IP_rel.csv --relationships import\phone_rel.csv --relationships import\contact_rel.csv
如果数据较大的话,可以把列名单独存csv,数据分几个csv保存,按照下图csv命名规范保存即可。
导入成功后,会显示节点、关系数和属性数及运行时间:
和load_csv一样的结果,必然的啦,因为一样的数据嘛,哈哈,皮一下~
参考文档:
http://weikeqin.cn/2017/04/11/neo4j-load-csv/
https://neo4j.com/docs/operations-manual/current/tutorial/import-tool/
作者:大王叫我来巡山了
链接:https://www.pythonheidong.com/blog/article/10523/2ea22681619ec2115a0f/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!