知识图谱

知识库构建(三):从数据库到知识库

本文基本参考自:实践篇(二):关系数据库到RDF - SimmerChan的文章 - 知乎

一、数据库构建

在实验的准备阶段,我们抓取了一些临床路径的数据,其中主要包括三个主体:疾病、治疗方法和药物。以每个主体为单位构建表,实体之间的关系通过关系表来表现,数据库结构如图所示。

二、映射到知识库——D2RQ

下面我们要做的就是把我们的关系数据库映射到知识库中。这里使用了D2RQ。这个工具的原理是利用映射文件(mapping),将对RDF的查询转化为对应的SQL语句,并将结果返回。
其使用方法如下:

  • 下载好D2RQ之后,进入安装目录,运行如下语句:
    generate-mapping -u 数据库用户名 -p 数据库密码 -o 你的文件名.ttl jdbc:mysql:///Mysql数据库中对应的Scheme名
    这时候我们就可以在安装目录中看到我们生成的ttl文件,但这个文件是默认生成的,为了后续的使用我们需要自己修改一下。

使用任意一个文本编辑器打开生成的ttl文件,进行如下修改:

  • 在文件的头部定义语句中加入@prefix : <之前一篇在protege中设置的uri> .
    我的修改后的文件头:
@prefix map: <#> .
@prefix db: <> .
@prefix vocab: <vocab/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> .
@prefix jdbc: <http://d2rq.org/terms/jdbc/> .
@prefix : <http://www.mydemo.com#> .

接下来进行修改的部分是大坑,我摸索了很长的时间才修改好,这里将表现描述Object的表称为实体表,将描述Object间关系的表称为关系表

  • 删掉除了头部的@prefix vocab: <vocab/> .语句之外的所有vocab

  • 将所有实体表对应的d2rq:property项中的前缀表名删掉。
    例:# Table disease中的d2rq:property :disease_disease_id;改为d2rq:property :disease_id;

  • 将所有的关系表的d2rq:property项改为自己在OWL文件中定义的实体间关系。
    例:# Table treatment_to_drug (n:m)中的d2rq:property :treatment_to_drug;改为d2rq:property :use;

  • 根据之前的owl文件修改关系表中d2rq:belongsToClassMap mapd2rq:refersToClassMap map两个属性的值,这里的belongsToClassMap是对应我们在owl文件中定义的range,refersToClassMap对应domain。

  • 之后我们运行命令.\dump-rdf.bat -o 输出文件名.nt .\之前修改好的文件.ttl可以获得我们需要的RDF映射文件。但到这里注意一下,需要再次检查nt文件的内容保证之前的最后一步修改是正确的。

比如我定义的treatment与drug两个实体间的关系是use,即“treatment use drug”,那么我的nt文件中对应的行应表现为:

<file:///d:/d2rq/mydemo.nt#treatment/5> <http://www.mydemo.com#use> <file:///d:/d2rq/mydemo.nt#drug/1> .