D2RQ Mapping Language 语法基础学习 之 连接数据库与创建RDF资源

2020-03-17   95 次阅读


前言

这玩意我去年暑假有看了一小下,然后看不懂(太差了),直到持续深造了一点,慢慢理解了所构建项目的概念与大体结构才重新滚回来学习
我们的项目涉及到将主流关系数据库中的内容转化为RDF,因此就需要映射
直接映射虽然很简单,但显然是没有格局的,因为我们要求映射可以满足我们所定义的本体,因此自定义映射就显得十分重要,这就有一个工具叫做D2RQ可以实现
但首先需要学习其映射语言,大佬SimmerChan在博文中也写到语法规则比较简单,具体的操作不再赘述,那我今天就再来学习一波
链接在下面,如果觉得我写的不好可以亲自去官网学习(其实我只是梳理官方教程外加一些自己的理解与体会,实践罢了)
d2rq-language

开始

D2RQ映射定义了一个虚拟的RDF图,其中包含来自数据库的信息
D2RQ映射结构示例
D2RQ映射结构示例

  • 数据库使用d2rq:ClassMapsd2rq:PropertyBridges映射到RDF术语
  • 映射中最重要的对象是类映射
  • 类图表示本体的一个类或一组相似的类

官方网站提供了如下模板代码

# D2RQ Namespace  
@prefix d2rq:        <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> .
# Namespace of the ontology
@prefix : <http://annotation.semanticweb.org/iswc/iswc.daml#> .

# Namespace of the mapping file; does not appear in mapped data
@prefix map: <file:///Users/d2r/example.ttl#> .

# Other namespaces
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 

map:Database1 a d2rq:Database;
    d2rq:jdbcDSN "jdbc:mysql://localhost/iswc";
    d2rq:jdbcDriver "com.mysql.jdbc.Driver";
    d2rq:username "user";
    d2rq:password "password";
    .
# -----------------------------------------------
# CREATE TABLE Conferences (ConfID int, Name text, Location text);

map:Conference a d2rq:ClassMap;
    d2rq:dataStorage map:Database1;
    d2rq:class :Conference;
    d2rq:uriPattern "http://conferences.org/comp/confno@@Conferences.ConfID@@";
    .
map:eventTitle a d2rq:PropertyBridge;
    d2rq:belongsToClassMap map:Conference;
    d2rq:property :eventTitle;
    d2rq:column "Conferences.Name";
    d2rq:datatype xsd:string;
    .
map:location a d2rq:PropertyBridge;
    d2rq:belongsToClassMap map:Conference;
    d2rq:property :location;
    d2rq:column "Conferences.Location"; 
    d2rq:datatype xsd:string;
    .

数据库连接(Database connection)

d2rq:Database定义了一个连接到当地或是远程的关系数据库的JDBC
一个D2RQ map可以包含多个 d2rq:Database来连接不同的数据库

d2rq:Database 的属性(Properties)

属性含义与用法
d2rq:jdbcDSNJDBC数据库URL,对于一个MySQL数据库,可以是这样的jdbc:subprotocol:subnamejdbc:mysql://hostname:port/dbname
d2rq:jdbcDriver数据库的JDBC驱动程序类名称,例子MySQL数据库com.mysql.jdbc.Driver
d2rq:username用户名,如果数据库有要求的话
d2rq:password密码
d2rq:textColumn、d2rq:numericColumn、d2rq:dateColumn、d2rq:timestampColumn、d2rq:timeColumn、d2rq:binaryColumn、d2rq:booleanColumn、d2rq:bitColumn、d2rq:intervalColumn这些语句用来定义数据库的列(column)的列类型,会影响后续D2RQ用于查询这些列中的值的SQL文字类型 例子d2rq:timestampColumn 是结合的日期和时间列类型
d2rq:resultSizeLimit一个整数值,这个整数值将作为LIMIT字句被添加到所有生成的SQL查询中,为大型数据库返回的结果设置了上限,但这种做法实际上会使服务器陷入“瘫痪”,并造成不可预测后果
d2rq:startupSQLScript启动时要执行的SQL脚本的URL,对于初始化连接与测试很有作用
d2rq:fetchSize指定每个数据库要求检索的行数,dump-rdf一般将该值设置为500,MySQL将该值设置为Integer.MIN_VALUE

范例

1.连接到一个MySQL数据库

map:Database1 a d2rq:Database;
    d2rq:jdbcDSN "jdbc:mysql://localhost/iswc";
    d2rq:jdbcDriver "com.mysql.jdbc.Driver";
    d2rq:username "user";
    d2rq:password "password";
    .

2.长期保持连接

(

@prefix jdbc: <http://d2rq.org/terms/jdbc/> .

map:database a d2rq:Database;
    # ... other database configuration ...
    jdbc:keepAlive "3600"; # value in seconds
    jdbc:keepAliveQuery "SELECT 1"; # (optionally to override default noop query)
    .

默认情况下默认查询是SELECT 1,可以使用自定义的查询来覆盖默认查询

对mapping引擎的全局配置(Global configuration of the mapping engine)

d2rq:Configuration
控制D2RQ的全局行为,但是如果默认情况下满足就不需要额外配置

d2rq:Configuration的属性(Properties)

属性含义与用法
d2rq:serveVocabulary默认值为true,是否提供推断与用户提供的词汇数据
d2rq:useAllOptimizations是否采用前沿优化,默认值为false

范例:激活前沿优化

map:Configuration a d2rq:Configuration;
    d2rq:useAllOptimizations true.

创建RDF资源 (d2rq:ClassMap)

一个 d2rq:ClassMap代表OWL本体或RDFS的一个class或者一组相似的class,类映射定义了如何识别类的实例
它连接到d2rq:Database并且通过d2rq:PropertyBridges将属性附加到实例的属性

URI模式

通过将某些数据库列的值插入模式来实例化URI模式
列子

http://example.org/persons/@@Persons.ID@@
http://example.org/lineItems/item@@Orders.orderID@@-@@LineItems.itemID@@
urn:isbn:@@Books.isbn@@
mailto:@@Persons.email@@
  • 如果将列指定为@@Table.Column|urlencode@@,则在插入字符串之前将应用URL编码
  • 如果将列指定为@@Table.Column|urlify@@_,则将应用URL编码,并附加一个规则:将空格转换为下划线
  • 如果将列指定为@@Table.Column|encode@@,则在插入字符串之前应用百分比编码

d2rq:ClassMap的属性(Properties)

属性含义与用法
d2rq:dataStorage引用d2rq:Database实例数据的存储位置
d2rq:classRDFS或者OWL类,该ClassMap生成的所有资源都是该类的实例
d2rq:uriPattern指定用于表示该类映射实例的URL模式
d2rq:uriColumn数据库列,包含用于表示该类映射实例的URLref
d2rq:uriSqlExpression一个SQL表达式,为该类映射实例生成URI标识符
d2rq:bNodeIdColumns以逗号分割的列名列表,该类映射的实例将是空白节点
d2rq:condition指定一个 WHERE SQL语句,只有满足该条件的数据库才会生成此类实例,可以用于隐藏数据库的某些部分
d2rq:classDefinitionLabel制定一个标签,该标签将用作rdfs:label所有关联的类定义,支持多个标签
d2rq:classDefinitionComment|指定将作为rdfs:comment所有关联的类定义的注释,可有多个注释

example1

map:PaperClassMap a d2rq:ClassMap;
    d2rq:uriPattern "http://www.conference.org/conf02004/paper#Paper@@Papers.PaperID@@";
    d2rq:class :Paper;
    d2rq:classDefinitionLabel "paper"@en;
    d2rq:classDefinitionComment "A conference paper."@en;
    d2rq:dataStorage map:Database1;
    .

example2

带有空白节点的classmap实例

map:Topic a d2rq:ClassMap;
    d2rq:bNodeIdColumns "Topics.TopicID";
    d2rq:class :Topic;
    d2rq:classDefinitionLabel "topic"@en;
    d2rq:classDefinitionComment "A topic."@en;
    d2rq:dataStorage map:Database1;
    .

example3

如果想要对一组具有相同属性的类使用同一个ClassMap,那么必须创建带有属性桥(object property bridge)的rdf:type语句而不是d2rq:class

map:PersonsClassMap a d2rq:ClassMap;
    d2rq:uriColumn "Persons.URI";
    d2rq:dataStorage map:Database1;
    .
map:PersonsType a d2rq:PropertyBridge;
    d2rq:property rdf:type;
    d2rq:pattern "http://annotation.semanticweb.org/iswc/iswc.daml#@@Persons.Type@@"; 
    d2rq:belongsToClassMap map:PersonsClassMap
    .

因为篇幅实在太长了,这篇就在这里结束吧,下一篇博客继续

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议