前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通用知识图谱导入Neo4j——以ownthink为例

通用知识图谱导入Neo4j——以ownthink为例

原创
作者头像
轻吻晴雯
修改2019-06-28 09:43:14
5.6K0
修改2019-06-28 09:43:14
举报
文章被收录于专栏:杂文共赏

前言

http://openkg.cn/

这个网站里有很多通用知识图谱。尤其是网站整合的ownthikhttps://kg.ownthink.com/还可以进行可视化检索。

https://kg.ownthink.com/

那么我们是否可以将这个ownthik导入自己的Neo4j数据库呢?

电脑配置

Win7旗舰版

4CPU+8GB内存

i5-6500@3.2GHz

1TB机械硬盘

Neo4j社区版3.5.6

初步了解

首先网站提供了下载,是一个大约800MB的压缩包,解压了有2.8GB左右。包括网站提供的其他图片数据,大多都以文本形式存储。

这么大的txt文件,必须要用一些工具才能打开,普通的txt游览器,包括notepad都是打不开的。

我使用了PilotEdit来打开。

打开预览

可以看到,都是一些文本三元组格式。

经过尝试,发现必须使用neo4j-admin import命令才能导入。LOAD CSV等都是不行的,import用时1h,LOAD CSV可能要500小时。而neo4j-admin需要一个实体csv(entity.csv),和一个关系csv(Relationship.csv)。

参考这个https://blog.csdn.net/paopaopotter/article/details/81779575

实体csv可以有2个,但我们只需要一个就够了。其中entity.csv的格式必须有:ID,name,:LABLE三个字段。而relationship.csv必须有:START_ID,name,:END_ID,:TYPE四个字段。如下:

entity.csv

relationship.csv

数据处理及导入

首先数据并不是标准的csv格式,csv格式使用逗号做分隔符,而这里使用的是\t。其次数据中有很多项是缺失的,这将导致导入失败。最后,txt中的三元组格式也不符合导入的要求。

如此大的文本,想要一次性加载入内存然后进行处理显然也不是正确的处理方式。如果以后面临200G的文本,难道也全加载入内存吗。在网上找到一些处理三元组为entity.csv和relationship.csv的python代码,但是代码是整个读入文件,然后使用map函数,我认为这样做不行,就没试了,不然等半天报一个Out of Memory就不好了。

首先一行一行的读入,把空值所在的行都删掉,写入一个新的CSV中,进行去空处理。然后编写脚本进行处理。

把左右实体都给他一个唯一的ID,如entity1、entity2....,并在CSV文件里写入对应关系就行了。如:

代码语言:javascript
复制
姚明  英文名 YaoMing
姚明  性别  男
姚明  民族  汉
周润发 职业  演员
周润发 出生地  中国香港

变为:

entity.csv

代码语言:javascript
复制
:ID,name,:LABLE
entity0,姚明,ENTITY
entity1,周润发,ENTITY
entity2,YaoMing,ENTITY1
entity3,男,ENTITY1
entity4,汉,ENTITY1
entity5,演员,ENTITY1
entity6,中国香港,ENTITY1

relationship.csv

代码语言:javascript
复制
:START_ID,name,:END_ID,:TYPE
entity0,英文名,entity2,RELATIONSHIP
entity0,性别,entity3,RELATIONSHIP
entity0,民族,entity4,RELATIONSHIP
entity1,职业,entity5,RELATIONSHIP
entity1,出生地,entity6,RELATIONSHIP

成功导入:

成功导入

可以看到耗时1个半小时(如果是SSD就好了),峰值内存使用了2GB不到。

结果

其中实体数7100w(因为三元组两头都算做了实体,中间是关系。),关系数6000w。实际上就是说三元组最左边的主语有大约1000w,最右边的宾语有大约6000w,加起来7000w实体。

占用11GB硬盘空间。

占用磁盘及版本号

试着查询一下,采用模糊匹配:

代码语言:javascript
复制
match R = (n:ENTITY)-[r:REL]->(m:ENTITY1) where n.name=~'姚明.\*' return R limit 100

可以在1s内返回结果(实际使用需设置超时时间,避免搜索失败导致遍历整个数据库):

结果

最后可以使用一些开源展示的工具(TODO),就可以进行交互和展示了:

https://github.com/jexp/neo4j-3d-force-graph

图形展示

作者:base64_decode('UTc4MjQ2NDI5NQ==')

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 电脑配置
  • 初步了解
  • 数据处理及导入
  • 结果
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档