大家如果对python操作Neo4j导入CSV并不是很熟悉的话,可以先看看这篇文章有个大概的操作基础。传送门
大家看过上篇文章应该知道,我们最后构建出来的知识如下图所示,但很明显可以看出来华南师范大学这个节点应该只有一个,应该让所有属于华南师范大学的人物都连接在唯一的节点上而不是每个人物都有属于它自己的节点。这样才会使得我们的图谱更加的紧凑。
数据源
这是本次构建知识图谱的CSV格式的数据源,这是在上次数据的基础上截取了一小部分并且对数据的内容进行了一定的修改便于大家看的更加明显(图中数据信息均为乱改 不做实际参考)
我们导入CSV格式的文件数据和上次讲的一样,直接读取数据并构建其节点。
with open('D:\\Python\\neo4j-community-4.1.1\\import\\data.csv', 'r',encoding='utf-8') as f:
reader = csv.reader(f)
data = list(reader)
for i in range(1,len(data)):
node = Node('person',name = data[i][1],level= data[i][2],major = data[i][4],univer = data[i][3])
relation = Node('major',name = data[i][4])
relation1 = Node('univer',name = data[i][3])
relation2 = Node('level',name = data[i][2])
graph.create(node)
graph.create(relation)
graph.create(relation1)
graph.create(relation2)
这样构建出来的节点肯定有重复的,比如level这一列我们构建了十个节点但是不重复的节点只有三个,所以我们要把重复的节点都给删除掉。
graph.run('MATCH (n:level) WITH n.name AS name, COLLECT(n) AS nodelist, COUNT(*) AS count WHERE count > 1 CALL apoc.refactor.mergeNodes(nodelist) YIELD node RETURN node')
运行这行程序就可以把level中重复的节点删除掉。其他有重复的也是如此(graph.run()里面的代码也可以在neo4j中运行防止因为python代码出错而显示不出来)
当我们把重复的节点删除以后我们就可以根据关系把节点联系在一起
graph.run('MATCH (entity1:person) , (entity2:major{name:entity1.major}) CREATE (entity1)-[:研究]->(entity2)')
graph.run('MATCH (entity1:person) , (entity2:univer{name:entity1.univer}) CREATE (entity1)-[:学校]->(entity2)')
graph.run('MATCH (entity1:person) , (entity2:level{name:entity1.level}) CREATE (entity1)-[:学位]->(entity2)')
最后运行出来 结果如下:
基于python的Django框架和Neo4j的知识图谱可视化