写点什么

Neo4j 导入思知 OwnThink 开源的知识图谱

作者:Joshua
  • 2022 年 8 月 12 日
    江苏
  • 本文字数:2470 字

    阅读完需:约 8 分钟

本文主要介绍如何将 OwnThink 开源的知识图谱三元组导入 Neo4j 中。

环境:

1.Neo4j database: 4.0.1 (是 Neo4j graph 数据库版本,非 neo4j desktop 版本)

2.jdk11 (neo4j 4.0.1 要求 jdk 需要 11)


数据准备

OwnThink开源了史上最大规模(1.4 亿)中文知识图谱,地址:https://github.com/ownthink/KnowledgeGraphData

下载解压后查看知识图谱规模:

$ wc -l ownthink_v2.csv140919781 ownthink_v2.csv
复制代码

样例数据:

$ head ownthink_v2.csv实体,属性,值胶饴,描述,别名: 饴糖、畅糖、畅、软糖。词条,描述,词条(拼音:cí tiáo)也叫词目,是辞书学用语,指收列的词语及其释文。词条,标签,文化红色食品,描述,红色食品是指食品为红色、橙红色或棕红色的食品。红色食品,中文名,红色食品红色食品,是否含防腐剂,否红色食品,主要食用功效,预防感冒,缓解疲劳红色食品,适宜人群,全部人群红色食品,用途,增强表皮细胞再生和防止皮肤衰老
复制代码

在 github 开源地址下可以找到阿里巴巴的一个下载数据源(链接 https://nebula-graph.oss-accelerate.aliyuncs.com/ownthink/kg_v2.tar.gz),下载之后解压,打开其中的 read_first.txt ,下载好简单清洗后的 edge.csv 和 vertex.csv。

可以看到数据量很大,在阿里巴巴的压缩包中,还有一篇 pdf 文档,介绍了将数据导入 nebula 图数据库中的步骤以及 edge.csv 和 vertex.csv 的格式,这里简单贴一下数据格式:

  • 清洗完的 vertex.csv 文件长这样:

-2469395383949115281,过度包装

-5567206714840433083,Over Package

3836323934884101628,有的商品故意增加包装层数

1185893106173039861,很多采用实木、金属制品

3455734391170888430,非科学

9183164258636124946,教育

5258679239570815125,成熟市场

-8062106589304861485,"成熟市场是指低增长率,高占有率的市场。"

说明:每一行是一个顶点,第一列整型 -2469395383949115281 是顶点的 ID(叫做 VID),它是由第二列文字通过 hash 计算出来的,例如 -2469395383949115281 就是由 std::hash("过度包装") 计算出来的值。

  • 清洗完的 edge.csv 文件:

3413383836870836248,-948987595135324087,含义

3413383836870836248,8037179844375033188,定义

3413383836870836248,-2559124418148243756,标签

3413383836870836248,8108596883039039864,标签

2587975790775251569,-4666568475926279810,描述

2587975790775251569,2587975790775251569,中文名称

2587975790775251569,3771551033890875715,外文名称

2587975790775251569,2900555761857775043,地理位置

2587975790775251569,-1913521037799946160,占地面积

2587975790775251569,-1374607753051283066,开放时间

说明:第一列是起点的 VID,第二列是终点的 VID,第三列是这条边的"属性"或者"描述"。


数据转换

在网上找了一下如何导入到 neo4j 中,参考了:https://yuukiblog.top/2019/10/16/neo4j%E5%AF%BC%E5%85%A5%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1%E5%88%9D%E4%BD%93%E9%AA%8C/

Neo4j 要求的数据格式(不清楚其他的格式能否导入):

entity.csv —— 作为图数据库中的实体::ID,name,:LABEL


rel.csv —— 作为实体的关系: :START_ID,name,:END_ID,:TYPE


因此,首先在 阿里巴巴清洗后的文本基础上 将文件格式转成符合我们要求的格式。限于篇幅,代码这里就不贴了,如果有需要可以给我留言。最终转成的数据格式如下,使用 Python 读出了前 10 行:

导入

转成需要的格式之后即可准备进行导入。首先将转换后的两个文件放入 neo4j 安装路径下的 import 文件夹。如果不知道在哪,可以通过 Neo4j desktop 打开本地的一个图数据库,点击 Manage:

点击 open folder 即可打开 import 文件夹。

由于版本差异,上述文章中的导入命令无法运行,经过修改测试,个人使用如下格式成功进行导入:

./neo4j-admin import --database graph.db --nodes=../import/vertex_new_form.csv --relationships=../import/edge_new_form.csv --ignore-extra-columns=true --skip-duplicate-nodes=true --skip-bad-relationships=true

注:网上很多版本说需要先删除 databases 文件夹下的 graph.db 文件夹,从本人测试来看,完全不需要,上述命令中的 graph.db 可任意更换名称。

如果数据运行正确,会出现一下画面,首先确定导入需要的资源(对内存还是有一定要求的):

接着导入节点:

导入关系:

建立关系:

完成:

最终导入,csv 格式中还是有错误的数据,因此设置了 skip-bad-relationships

IMPORT DONE in 19m 10s 463ms.Imported:45464785 nodes139916576 relationships185380388 propertiesPeak memory usage: 688.9MiBThere were bad entries which were skipped and logged into

下面即需要将数据库进行展示,新建的 graph 默认有两个数据库,对应 databases 文件夹下的两个文件夹:neo4j 和 system。不知道为何使用上述命令导入之后新增的 graph.db(名字和命令中的 database 参数有关)无法显示,也可能是本来就不会显示。。。

没办法,只能通过其他办法。对比了一下几个文件夹下的内容,发现可以将 graph.db 先 dump 再载入到现有的某个数据库几个,成功实现:

进入到安装目录的 bin 文件夹下,需要先新建好 dump 文件的目录:dump:

./neo4j-admin dump --database=graph.db --to=../backups/graph/2020-3-16.dump

在 load 到现有的数据库中,因为我原有的两个数据库是空的,不清楚是否会抹除已有的数据(when use –force option, any existing database gets overwritten),load:

./neo4j-admin load --from=../backups/graph/2020-3-16.dump --database=neo4j --force

更多参数参考: https://neo4j.com/docs/operations-manual/current/tools/dump-load/

接下来,在 graph 中选择你导入的数据库即可看到了,简单查询一下:

后续工作:

  1. 由于数据量较大,检索的时间较慢,后续看看有哪些优化查询速度的;

  2. 个人使用知识图谱主要服务于智能问答,下一步就是思考如何结合知识图谱做好智能问答了,有兴趣的小伙伴可以去这里试试我的智(智)能(障)问答

update: 针对第一条,发现将检索的范围指定能加快检索速度,即:

MATCH p = (n1:ENTITY)-[r:RELATIONSHIP]->(n2:ENTITY) where n1.name ="微软" RETURN p

发布于: 2022 年 08 月 12 日阅读数: 92
用户头像

Joshua

关注

Remove all barriers in'd way of science! 2022.08.11 加入

InfoQ签约作者 | www.junphy.com

评论

发布
暂无评论
Neo4j导入思知OwnThink开源的知识图谱_nlp_Joshua_InfoQ写作社区