多读书多实践,勤思考善领悟

从零开始学习知识图谱 之 十三.百科知识图谱构建 7.基于Silk批量知识融合

本文于1581天之前发表,文中内容可能已经过时。

一. 简介

前面使用 Silk 工具进行知识融合。但实际操作中发现,当数据量较大时,会出现内存爆掉的情况。同时由于 Silk 的 SPARQL 查询语句比较复杂,当数据量大时,获取同样的数据要慢上很多倍。因此我这里将数据分成一个一个的小数据,而后对这些小数据进行分别链接。这样虽然整体耗时变长了,但具有了可操作性。不过光百度百科就有六千多万数据,可以分成13份。互动也是同样规模的数据。这一组合就是169个任务。所以必须采用自动化的方法构建任务并执行,这里介绍一下我的方法和代码。

本教程的项目代码放在github上,下载地址为《从零开始学习知识图谱》项目源代码

二. 环境准备

1. 操作系统

支持操作系统:windows、macOS、Linux。为了方便大家搭建开发环境,笔者尽可能在windows下构建,系列篇未特意说明时操作系统都是windows。Linux安装可以参考VirtualBox虚拟机安装UbuntuVirtualBox虚拟机安装CentOS8进行安装。

笔者建议在docker下安装silk,参考VirtualBox虚拟机安装Ubuntu,其中有安装docker。

在docker下,只须一条命令: docker run -d --name silk-workbench -p 80:80 silkframework/silk-workbench:latest ,就能完成silk镜像拉取及运行,不需要进行下面的软件安装

2. Apache jena

安装参见从零开始学习知识图谱 之 二

3. Silk

安装参见从零开始学习知识图谱 之 十二

三. 加载数据到 tdb

处理代码文件knowledge_fusion/silk/batch_link.py

这一步的流程为:

  • 分割出要加载的数据,并存储成单独的 nt 文件,由 seg_nt()函数完成。该函数采用 sed 命令快速获取指定行数间的数据。
  • 删除 Fuseki 中已经存在的同名数据库,防止被已存在数据的污染。由 delete_tdb() 函数完成。
  • 在 Fuseki 中创建数据库,来存储 tdb 文件信息。由 add_tdb() 函数完成。
  • 将 N-triples 文件加载到 Fuseki 中,存储到对应 tdb 数据库中。由 load_nt()函数完成。
  • 将 刚刚得到的 tdb 文件转移到 Fuseki 对应的文件夹内。
  • 重启 Fuseki 服务器,加载刚刚得到的数据库。

经过上面的步骤,我们就将 N-triples 文件加载到 Fuseki 服务器中了。下面将对其进行调用来链接数据。

四. 知识融合

处理代码文件knowledge_fusion/silk/batch_link.py

这一步的流程为:

  • 创建项目,由 control_project() 函数完成,该函数向 Silk 发送 POST请求进行项目创建。也可以发送 DELETE 请求来删除任务。
  • 添加 PREFIXEX,由 add_prefix() 函数完成,该函数向 Silk 发送 PUT 请求添加 PREFIXES。
  • 创建 endpoint 数据,由 build_endPoint() 完成,该函数发送 PUT 请求,在Datasets中创建SPARQL endpoint 数据。
  • 创建输出文件,由 build_output() 函数 和 build_rdf() 完成。其中build_output() 函数在将在Resource 中创建 .nt 文件。build_rdf() 函数利用该文件在 Datasets 中创建 数据。
  • 创建任务,由 build_task() 函数完成。该函数通过 POST 请求,利用上面得到的源文件、目标文件、输出文件来创建融合任务。
  • 为任务添加规则,由 add_rule() 函数完成,该函数 通过PUT请求将我们定义好的 规则添加到任务中去。
  • 执行链接任务, 由control_linking() 函数完成,当action等于 start 时,执行链接任务,当 action 为 cancel 时,取消链接任务。

通过以上步骤的循环,就可以实现自动批量处理融合任务了。