python读取三元组数据,如何生成neo4j节点及关系文件?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
综合前几篇文章的内容,本文要解决的问题就是:如何从存放三元组数据的记事本文件,整理生成neo4j-admin import
所需要的nodes.csv
和relationships.csv
两个文件。主要涉及的知识点就是:neo4j-admin
的csv
文件特殊格式,python
生成csv
文件。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文中,将要分为三部分来讲述整个程序。测试环境:win10
,python@3.6.8
。
提取实体
首先,有个已经去重处理好的三元组数据文件,去重逻辑的范例代码见这里:
获得的三元组数据文件,格式如下图所示:
接下来,代码将要读取其中的所有实体。
import pandas as pd
import csv
# 分析实体列表
result_name = ["entity_start", "role", "entity_end"]
result = pd.read_table("test2.txt", decimal="\t", names=result_name)
entity = set()
entity_start = result['entity_start'].tolist()
entity_end = result['entity_end'].tolist()
for i in entity_start:
entity.add(i)
for i in entity_end:
entity.add(i)
entity = list(entity)
生成实体csv文件
在本步骤中,生成实体文件的同时,还需要对所有的这些entity
进行编号,编号的规则是自定义的,只要不重复就可以,具体的格式没有要求。(当然,用自增一来表示是最好的选择)
csvf_entity = open("nodes.csv", "w", newline='', encoding='utf-8')
w_entity = csv.writer(csvf_entity)
w_entity.writerow(("entity:ID", "name", ":LABEL")) # 固定名称
entity_dict = {}
for i in range(len(entity)):
w_entity.writerow(("e" + str(i), entity[i], "标签")) # 多个label分号分割,id只要不重复就可以
entity_dict[entity[i]] = "e" + str(i)
csvf_entity.close()
这个最核心的要求就是要生成符合要求的nodes.csv
文件,表头固定为:"entity:ID", "name", ":LABEL"。
生成关系csv文件
在本步骤中,最重要的地方就是,实体到实体id的转化,而这个转化关系在上一步中已经生成对应关系。这个对应关系的确认,巧妙的使用了series
的map()
功能。详情请参考:
result[':START_ID'] = result['entity_start'].map(entity_dict) # 起始实体ID
result[':END_ID'] = result['entity_end'].map(entity_dict) # 终点实体ID
result[":TYPE"] = result['role'] # 关系
result.pop('role') # 不pop的话,就会成为这层关系的属性
result.pop('entity_start')
result.pop('entity_end')
result.to_csv("relationships.csv", index=False)
本段代码的输出是relationships.csv
文件。格式如下:
导入neo4j数据库
拿到nodes.csv
和relationships.csv
文件后,就可以通过下面的命令导入到数据库了。
neo4j-admin import --nodes "nodes.csv" --relationships "relationships.csv" --force
具体可以参考:
导入成功后,就可以通过下面的链接,查看数据了。
参考文献
总结
这个导入neo4j
数据库的代码,终于连载完了。代码不长,文章写了十多篇。接下来要连载的内容是:neo4j
的数据查询语句。欢迎关注:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。