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