python知识图谱工具_个人的Python小工具(6.表格转知识图谱)

根据neo4j-admin的上传格式(仅保留最重要的参数):

>> neo4j-admin import --nodes nodesFile1.csv

--nodes nodesFile2.csv

--relationships relationFile1.csv

--relationships relationFile2.csv

而neo4j根据nodes与relationships的文件内部架构连接节点与关系,最终得到知识图谱。因此我们需要知道nodes的内部数据结构:

relationships的内部结构:

而我们的工具需要完成如下目的:将第一范式的一张表格转换成知识图谱;

该表格的各个数据条目可任意定义为实体或实体的属性;

定义为实体的条目应为该条目所涉及实体的索引;

条目间的关系应可以任意制定,但是关系所对应的头和尾节点应同属原表格中的同一行。

如果可以该工具应该能适应任意表格数据

我们以下表为例:学生信息表(数据完全捏造,如有雷同,emmm你真棒!)

该表反映了某高校新一年级学生的基本情况,其中包含四个实体(学生、班主任、学生高中、学生初中),接下来我们需要把这些实体衔接为一定的关系。大致关系如下图所示:知识图谱节点及关系图

学生实体的中学(__middleSchool__)关系与middleSchool关联,高中(__highSchool_)关系与highSchool关联,班主任实体的管理(_mornitor__)与student关联。相对应的工具工作流程如下:抽取实体列实体,去重,得到每个实体对应的个体列表(包含实体中的个体id及属性)‘

为个体增加实体名(:LABEL);

构建关系文件,列明(:TYPE)类型需要主动定义。

相应的完整代码与样例已上传至github:Timaos123/Table2KG​github.com

当前仅支持csv格式文件。接下来,仅针对main函数阐述该工具使用方法:

if __name__ == "__main__":

parameters={

"fileName":"table2KG.csv",# 文件名尽量遵守windows命名规范,减少“.”的使用,最好csv

"entityList":["student","mentor","highSchool","middleSchool"],# 实体名:一维-list,作为ID

"attrList":[["学生姓名","语文","数学","英语","班级"],["班主任姓名","班主任年龄","班级"],["高中名","是否是示范性高中"],["初中名","是否是私立学校"]],# 属性名:二维-list

"relationDict":{"student-highSchool":"__highSchool__","student-middleSchool":"__middleSchool__","mentor-student":"__monitor__"},#实体间的关系,格式:{"实体1-实体2":"关系名"}

"sheet":"",#当文件时xls时使用

}

main(parameters)

fileName内容即为上述表格所在位置,entityList定位实体的列,attrList定义实体的属性列,由于属性依附于实体,因此attrList中的元素应与entityList中的元素一一对应,若某实体不存在属性,则置空一个list于对应位置,relationDict为{“实体1-实体2”:“关系名”}格式的词典,其中实体1与实体2为相应的实体列名,关系方向从实体1连接向实体2,sheet只有在fileName为xls时使用,不过当前暂未加入xls功能。

以上参数调整完成后运行代码,若顺利将出现如下输出:

生成nodes文件...

生成文件: studentNodes.csv

生成文件: mentorNodes.csv

生成文件: highSchoolNodes.csv

生成文件: middleSchoolNodes.csv

生成relationships文件...

生成文件: student-highSchool___highSchool__Relationships.csv

生成文件: student-middleSchool___middleSchool__Relationships.csv

生成文件: mentor-student___monitor__Relationships.csv

此时,同一文件夹下将生成7个文件(4个nodes,3个relationships)新生成7个文件

关闭neo4j,修改dbms.default_database=newStudent,调用neo4j-admin将这些文件输入到neo4j中,导入成功后,重新启动neo4j

>>>neo4j stop

>>>neo4j-admin import --database newStudent

--nodes highSchoolNodes.csv

--nodes mentorNodes.csv

--nodes middleSchoolNodes.csv

--nodes studentNodes.csv

--relationships mentor-student___monitor__Relationships.csv

--relationships student-highSchool___highSchool__Relationships.csv

--relationships student-middleSchool___middleSchool__Relationships.csv

>>>neo4j start

打开neo4j的newStudent数据库,所得结果如下图所示:知识图谱可视化展示

可见,所需关系及实体都被成功反应到neo4j上。不过使用过程中有些问题依然需要注意:

注:neo4j的console的编码格式应该是"utf8"(目前还没找到修改的地方),所以在使用neo4j-admin时对应的文件名就不能是中文,而文件名是通过实体列及关系名定义的,因此实体列和关系名都不能用英文,否则会报错。不过文件内部内容可以是中文;

各个实体列应该是该实体对应的id,而非名字等有可能重复的值,不过不同实体的id可以不同,代码中会自动给实体id前面加上实体名,例如,若student的id为[1,2,3]而mentor的同样是[1,2,3],此时,代码会给两个实体的id前面加上实体名,于是student的id就变成了[student1,student2,student3],而mentor的id就变成了[mentor1,mentor2,mentor3];

可能出现实体分享属性的情况,如student与mentor属于同一个班级时,此时,在attrList中需要在student和mentor对应的属性中分别指定“班级”这一属性;

目前不支持同一实体列的互相引用,不过可以考虑在生成表的时候通过select join从表的结构进行构造,不过新构造的实体和原实体列名不能一样。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值