目录
背景
知识图谱数据的来源主要有三个:结构化数据、半结构化数据和非结构化的数据。这里所使用的电影数据就是结构化的数据。半结构化的数据指的是数据有一定的组织形式,但较结构化数据而言更松散(属性名和属性值具有多样性,比如“生日”就有“出生日期”、“诞辰”等多种表达方式)。
W3C的RDB2RDF工作小组制定了两个标准,用于将关系型数据库的数据转换为RDF格式的数据。
第一个标准是direct mapping,即直接映射。
另外一个标准是R2RML,可以让用户更灵活的编辑和设置映射规则。
这里先记录一下,后续有时间再详细了解。
为了创建知识图谱的应用知识问答项目,把mysql数据库的内容以RDF的形式转化出来,上传到Fuseki数据库中,在这里进行记录,主要记录如何用d2rq这个工具把mysql的数据转为RDF。
1.安装D2RQ
1.1 简介
Accessing Relational Databases as Virtual RDF Graphs--D2RQ的官方介绍。
D2RQ平台是一个能够把关系数据库当作虚拟的、只读的RDF图来访问的一个平台。它提供了基于RDF的访问模式,但不需要把数据以RDF的形式存储。以虚拟RDF图的方式访问关系数据库是其最主要的一个特性。它的机理就是通过mapping文件,把对RDF的查询等操作翻译成SQL语句,最终在RDB上实现对应操作。在做知识图谱项目的时候,我们可以灵活地选择数据访问方式。当对外提供服务,查询操作比较频繁的情况下,最好是将RDB的数据直接转为RDF,会节省很多SPARQL到SQL的转换时间。
使用D2RQ,你可以:
- 使用SPARQL查询非RDF数据库
- 把数据库的内容当作链接来访问
- 把数据库的内容以RDF的形式转化出来
- 使用Apache Jena API 访问非RDF数据库
D2RQ支持的数据库有MySQL、Oracle、PostgreSQL、SQL Server、HSQLDB、Interbase/Firebird。也支持其他某些数据库,但可能会有限制。请参考数据库兼容性说明(Accessing Relational Databases as Virtual RDF Graphs)。
1.2 下载安装
进入官网:http://d2rq.org/下载安装包,解压即安装。
也可以下载最新release进行安装,Github地址:https://github.com/d2rq/d2rq。
1.3 配置mysql连接
将mysql-connector-java-5.1.44-bin的jar文件放入d2rq的/lib文件夹中
进入sun官网找到MySQL Community Downloads社区下载,选择Connector/J,进入Archives存档版本,选择你想要的版本,我选择了5.1.44版本,也可以直接复制https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.44.zip下载。
解压mysql-connector-java-5.1.44.zip后,将mysql-connector-java-5.1.44-bin.jar放入d2rq的/lib文件夹中。
2.转换为RDF
在本地MySQL数据库中新建一个database,里面table是你要转换的数据。注意每个table的column中要指定一个primary key主键,作为。
2.1 将mysql映射到mapping上
连接数据库,把数据导出到ttl文件中。执行下列命令后在D2RQ目录下会生成ttl文件,如下图所示。
.\generate-mapping -o temp_mapping.ttl -u root -p root jdbc:mysql://localhost:/mydb
-u root 是数据库的登录名
-p root 是登录密码,没有密码则不输入
-o temp_mapping.ttl 是映射文件的名称,指定输出文件路径及名称
jdbc:mysql:///mydb 指定数据库的名称,指定我们要映射的数据库
?useSSL=false 避免提示警告
该命令的其他参数及使用方式请参考文档。
-
可以进行网页端口访问
d2r-server temp_mapping.ttl
- 修改mapping文件
根据mysql数据库生成的默认mapping文件进行修改:
先是数据库的映射,然后是类型的映射(也就是资源类型),接下来就是在资源和属性值之间搭一个桥梁propertyBridge。
映射文件的理解,详见官方文档The D2RQ Mapping Language。
@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.kgdemo.com#> . #设置一个前缀
# 整个映射的主要模式: 把每个表映射成一个类;每一行是一个资源;每一列就是资源的属性。
map:database a d2rq:Database; # 把数据库名映射为Database
d2rq:jdbcDriver "com.mysql.jdbc.Driver";
d2rq:jdbcDSN "jdbc:mysql://localhost/police";
d2rq:username "root";
d2rq:password "bitnet";
jdbc:autoReconnect "true";
jdbc:zeroDateTimeBehavior "convertToNull";
.# Table mysql_tab 建立mysql_tab表的映射
map:mysql_tab a d2rq:ClassMap; # 每个表都是一个ClassMap
d2rq:dataStorage map:database; # 指明来自哪个数据库# uriPattern 这个是对资源的标识,'@@'前面可以自己修改,默认是ttl文件存储位置。'@@' 之间是表示取标识串里面的值,也就是会取数据库表对应的值。'urlify' 表示自动采用urlencode编码,而且会把空格转化为_。
# d2rq:uriPattern "mysql_tab/@@mysql_tab.WFXYRBH|urlify@@";
d2rq:uriPattern "http://www.kgdemo.com/@@mysql_tab.WFXYRBH|urlify@@";
# d2rq:class vocab:mysql_tab;
d2rq:class :mysql_tab; # 指明资源的类型,对应rdf:type
d2rq:classDefinitionLabel "mysql_tab"; # 指明类型定义的标签,对应与rdfs:label
.# 定义每一个资源标签的属性
map:mysql_tab__label a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:mysql_tab;
d2rq:property rdfs:label;
d2rq:pattern "mysql_tab #@@mysql_tab.WFXYRBH@@"; # 标签的模式
.# 属性值的映射
map:mysql_tab_WFXYRBH a d2rq:PropertyBridge; # 指明是一个属性
d2rq:belongsToClassMap map:mysql_tab; # 指明属于哪个类别的
# d2rq:property vocab:mysql_tab_WFXYRBH;
d2rq:property :mysql_tab_WFXYRBH; # 指明属性的标识名字
d2rq:propertyDefinitionLabel "mysql_tab WFXYRBH"; # 属性标签
d2rq:column "mysql_tab.WFXYRBH"; # 指定属性的值,注意一定要用双引号表示取其中的值map:mysql_tab_NAME a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:mysql_tab;
# d2rq:property vocab:mysql_tab_NAME;
d2rq:property :mysql_tab_NAME;
d2rq:propertyDefinitionLabel "mysql_tab NAME";
d2rq:column "mysql_tab.NAME";
2.2 将Mysql数据转为RDF
dump-rdf.bat -o temp_rdf.nt temp_mapping.ttl
temp_mapping.ttl是修改后的mapping文件。其支持导出的RDF格式有"TURTLE", "RDF/XML", "RDF/XML-ABBREV", "N3",和"N-TRIPLE"。其中,"N-TRIPLE"是默认的输出格式。
例子:以turtle格式转换为nt文件。
./dump-rdf -f TURTLE -o dump.nt mydb.ttl
temp_rdf.nt部分内容所下所示:
<http://www.kgdemo.com/X410700481708201408000001> <http://www.kgdemo.com#mysql_tab_NAME> "\u90D1\u798F\u5B89" .
<http://www.kgdemo.com/X410700480L07201510000001> <http://www.kgdemo.com#mysql_tab_NAME> "\u738B\u660E\u78CA" .