当前位置:   article > 正文

权力的游戏击杀和家族知识图谱(python+neo4j)_权力的游戏知识图谱

权力的游戏知识图谱

一、任务描述

数据集是github上某大神整理出来的全八季任务信息,包括姓名、家族、杀了谁、被谁杀了等等。本文做的知识图谱仅包含所有人物及其被杀关系和家族关系。

数据集链接:https://github.com/jeffreylancaster/game-of-thrones/blob/master/data/characters.json

二、neo4j的安装和部署

参考:https://www.cnblogs.com/ljhdo/p/5521577.html

1.安装Java JRE

下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html

配置Java环境变量。

第一步,新建JAVA_HOME变量,变量值填写jdk的安装目录,默认的安装目录是:C:\Program Files\Java\jre1.8.0_211

第二步,编辑Path变量,在Path变量值的最后输入:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

检查配置是否成功,运行cmd,输入java -version,如果显示java的版本信息,说明Java的安装和配置成功。

2.安装Neo4j

下载地址:https://neo4j.com/download-center/

解压到主目录,“D:\Program Files\neo4j-community-3.2.”。

Neo4j应用程序有如下主要的目录结构:

  • bin目录:用于存储Neo4j的可执行程序;
  • conf目录:用于控制Neo4j启动的配置文件;
  • data目录:用于存储核心数据库文件;
  • plugins目录:用于存储Neo4j的插件;

配置Neo4j环境变量:创建主目录环境变量NEO4J_HOME,并把主目录设置为变量值。

3.启动Neo4j

以管理员身份启动命令行,切换到D:\Program Files\neo4j-community-3.2.\bin,输入以下命令,通过控制台启用neo4j程序:

neo4j.bat console

如果看到以下消息,说明neo4j已经开始运行:

4.Neo4j浏览器

通过命令行启动neo4j之后,访问 “http://localhost:7474/”

默认的host是bolt://localhost:7687,默认的用户是neo4j,默认的密码是:neo4j,第一次成功connect到Neo4j服务器之后,需要重置密码。

5.在Neo4j浏览器中创建节点和关系

  1. CREATE (n:Person { name: 'Andres', title: 'Developer' }) return n;
  2. CREATE (n:Person { name: 'Vic', title: 'Developer' }) return n;
  3. match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)-[r:Friend]->(m) return r;
  4. match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)<-[r:Friend]-(m) return r;

三、数据处理

从数据集中抽取需要的信息生成节点和关系csv文件。

原始数据集如下图:

只需要其中的characterName、houseName和killedBy信息,同时去除没有人物图片和重复的小角色,建立一个notuse.txt

  1. import json
  2. import pandas as pd
  3. with open('./characters.json', 'r') as f:
  4. data = json.load(f)
  5. with open('./notuse.txt', 'r') as f:
  6. notuse = []
  7. for name in f.readlines():
  8. name = name.strip()
  9. notuse.append(name)
  10. characters = []
  11. character2index = {}
  12. index2character = {}
  13. house2index = {}
  14. index2house = {}
  15. character = {'index:ID':[],
  16. 'name':[],
  17. ':LABEL':[]}
  18. house = {'index:ID':[],
  19. 'name':[],
  20. ':LABEL':[]}
  21. kill = {':START_ID':[],
  22. ':END_ID':[],
  23. 'relation':[],
  24. ':TYPE':[]}
  25. belong = {':START_ID':[],
  26. ':END_ID':[],
  27. 'relation':[],
  28. ':TYPE':[]}
  29. index_character = 1
  30. index_house = 10001
  31. for dic in data['characters']:
  32. if 'characterImageThumb' in dic.keys() and dic['characterName'] not in notuse:
  33. characters.append(dic)
  34. # 构建character节点
  35. name2index[dic['characterName']] = index_character
  36. index2name[index_character] = dic['characterName']
  37. character['index:ID'].append(index_character)
  38. character['name'].append(dic['characterName'])
  39. character[':LABEL'].append('character')
  40. index_character += 1
  41. # 构建house节点
  42. if 'houseName' in dic:
  43. if type(dic['houseName']) == str:
  44. if dic['houseName'] not in house['name']:
  45. house2index[dic['houseName']] = index_house
  46. index2house[index_house] = dic['houseName']
  47. house['index:ID'].append(index_house)
  48. house['name'].append(dic['houseName'])
  49. house[':LABEL'].append('house')
  50. index_house += 1
  51. elif type(dic['houseName']) == list:
  52. for hname in dic['houseName']:
  53. if hname not in house['name']:
  54. house2index[hname] = index_house
  55. index2house[index_house] = hname
  56. house['index:ID'].append(index_house)
  57. house['name'].append(hname)
  58. house[':LABEL'].append('house')
  59. index_house += 1
  60. for person in characters:
  61. # 构建killedBy关系
  62. if 'killedBy' in person.keys():
  63. for killer in person['killedBy']:
  64. if killer in name2index.keys():
  65. kill[':START_ID'].append(name2index[person['characterName']])
  66. kill[':END_ID'].append(name2index[killer])
  67. kill['relation'].append('killedBy')
  68. kill[':TYPE'].append('killedBy')
  69. # 构建belongTo关系
  70. if 'houseName' in person.keys():
  71. if type(person['houseName']) == str:
  72. belong[':START_ID'].append(name2index[person['characterName']])
  73. belong[':END_ID'].append(house2index[person['houseName']])
  74. belong['relation'].append('belongTo')
  75. belong[':TYPE'].append('belongTo')
  76. elif type(person['houseName']) == list:
  77. for h in person['houseName']:
  78. belong[':START_ID'].append(name2index[person['characterName']])
  79. belong[':END_ID'].append(house2index[h])
  80. belong['relation'].append('belongTo')
  81. belong[':TYPE'].append('belongTo')
  82. df_character = pd.DataFrame(character)
  83. df_house = pd.DataFrame(house)
  84. df_kill = pd.DataFrame(kill)
  85. df_belong = pd.DataFrame(belong)
  86. df_character.to_csv('./character.csv', index=False)
  87. df_house.to_csv('./house.csv', index=False)
  88. df_kill.to_csv('./kill.csv', index=False)
  89. df_belong.to_csv('./belong.csv', index=False)

构建节点和关系csv文件时,注意以下几点:

1.所有的节点文件,第一列都要为“index:ID”,最后一列都要为":LABEL" , 中间所有列即为这个实体的属性。注意实体属性最好不要用中文,label即为这个实体的对应标签。

人物节点文件character.csv:

家族节点文件house.csv:

2.所有的关系文件,第一列都要为“:START_ID”,第二列都要为":END_ID",第三列要为"relation",第四列要为":TYPE" , start_id对应一个节点的index_id,end_id对应另一个节点的index_id,relation即为两者的关系,type即为标签,一般type和relation内容相同。

击杀关系文件kill.csv:

家族关系文件belong.csv:

3.不管是实体还是关系文件里的index_id,可以在一开始设一个比数据规模大出两个数量级的初始值,比如本文的家族id都是10000+i,因为主键设的太小容易造成不同文件的主键混淆。

参考:https://blog.csdn.net/shr903988854/article/details/83145088

四、导入Neo4j数据库

节点路径和关系路径可以根据自己需要指定。文件路径的根目录默认为neo4j/bin。

另外,在执行此语句前要确保没有got.db这个数据库,并且conf文件中注释这句dbms.active_database=got.db(如果存在的话),不然会报数据库存在的错误。

导入成功后,再在conf文件中添加语句dbms.active_database=got.db或取消注释。

在浏览器中查看人物及其关系:

用cypher语句可以对数据库进行增删改查操作

教程:http://neo4j.com.cn/public/cypher/default.html

熟悉了知识存储和检索操作,接下来看一下知识推理和知识融合,希望在2019DeeCamp上能做出完整的知识图谱吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/645823
推荐阅读
相关标签
  

闽ICP备14008679号