根据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/Table2KGgithub.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从表的结构进行构造,不过新构造的实体和原实体列名不能一样。