第二步 在D2RQ平台上配置jena环境
2013年10月16日 9:48:53
搞了这么长时间语义,只用过protege这样的工具,一直没有落实到实际代码上。jena也看过好久了,总认为是hp公司的东西算不上标准,现在看来,jena已经是语义应用开发中最主流的工具了,我就此选择jena进行语义应用的开发了。
 
 
Getting started with Apache Jena

Apache Jena (or Jena in short) 是免费开源的java框架用于构建语义网应用和关联数据应用。这个框架包括不同的处理RDF数据的API接口。如果你是菜鸟,你可以选择从下面的教程中开始,你也可以浏览感兴趣的主题文档。
 
Tutorials
竟然发现有大牛已经做过翻译了,好吧,我转载在这里,我郑重声明转载了“april 1019”这位大牛的工作,

Jena文档《An Introduction to RDF and the Jena RDF API》的译文

文档里包含的内容很多,还是回到具体的配置上来。

 
Using the D2RQ Engine with Jena

 1. Jena Versions
    由于D2RQ内部嵌入了jena和SPARQL查询引擎,所以对jena和ARQ是敏感的。D2RQ只在相应的jena版本下工作。检索/lib/arq-X.Y目录下各包的版本,以下载合适的jena包。
    我下载的D2RQ是0.8.1,其/lib里面的jena的jar是2.7.0,所以从http://archive.apache.org/dist/jena/binaries/这里下载了apache-jena-2.7.0-incubating.tar.gz。还是解压到/opt文件夹下。
 
2. 配置路径
    新建一个eclipse工程jena_test,然后右键-Build Path-Add Library-User Library,再把/opt/D2RServer/d2rq-0.8.1/lib下的d2rq-0.8.1.jar,添加入项目中。类似再添加commons-logging-1.1.jar和slf4j-api-1.6.4.jar到项目中,然后把/lib/db-drivers下的JDBC也加进来。
    D2RQ下载时会忽略一些Jena/ARQ jar,但这些jar也有可以会用到。可以把下载的放到这个lib中去。
 
3. Logging
    D2RQ通过Apache Commons Logging的API记录日志信息。D2RQ搭载了Apache log4j(见注1),但你也可以使用不同的前端日志。
为了获取D2RQ的调试信息,设置日志记录器的级别从de.fuberlin.wiwiss.d2rq改为ALL.简单的方法即是把/lib/logging的目录添加到构建路径中,新建一个文件log4j.properties,包括以下内容:
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %-5p %-20c{1} :: %m%n
log4j.logger.de.fuberlin.wiwiss.d2rq=ALL
我在/lib/logging下新建了log4j.properties文件,复制了上面的内容,并把它也加到了项目中。
 
4. 通过jena模型的API使用D2RQ
ModelD2RQ类为D2RQ映射数据库中的数据提供了一个Jena的模型视图。
下面的例子通过使用一个预先创建的映射文件介绍ModelD2RQ是如何创建的,也介绍了如何用Jena API从模型中提取论文及作者信息。
// Set up the ModelD2RQ using a mapping file
Model m = new ModelD2RQ("file:doc/example/mapping-iswc.ttl");
 
// Find anything with an rdf:type of iswc:InProceedings
StmtIterator paperIt = m.listStatements(null, RDF.type, ISWC.InProceedings);
 
// List found papers and print their titles
while (paperIt.hasNext()) {
    Resource paper = paperIt.nextStatement().getSubject();
    System.out.println("Paper: " + paper.getProperty(DC.title).getString());
 
    // List authors of the paper and print their names
    StmtIterator authorIt = paper.listProperties(DC.creator);
    while (authorIt.hasNext()) {
        Resource author = authorIt.nextStatement().getResource();
        System.out.println("Author: " + author.getProperty(FOAF.name).getString());
    }
    System.out.println();
}
m.close();
其中ISWC和FOAF类在Jena的schemagen工具中创建了, DC and RDF类也是Jena的一部分。
 
5. 通过jena图的API使用D2RQ
    在一些情况中,最好用低水平的Jena图的API,而不是模型API,D2RQ提供图的接口的实现,即GraphD2RQ.
下面的例子是介绍图API来查找2003年发表的所有论文。
// Load mapping file
Model mapModel = FileManager.get().loadModel("doc/example/mapping-iswc.ttl");
 
// Parse mapping file
MapParser parser = new MapParser(mapModel, "http://localhost:2020/");
Mapping mapping = parser.parse();
 
// Set up the GraphD2RQ
GraphD2RQ g = new GraphD2RQ(mapping);
 
// Create a find(spo) pattern
Node subject = Node.ANY;
Node predicate = DC.date.asNode();
Node object = Node.createLiteral("2003", null, XSDDatatype.XSDgYear);
Triple pattern = new Triple(subject, predicate, object);
 
// Query the graph
Iterator<Triple> it = g.find(pattern);
 
// Output query results
while (it.hasNext()) {
    Triple t = (Triple) it.next();
    System.out.println("Published in 2003: " + t.getSubject());
};
g.close();
 
5.1 还有一个CachingGraphD2RQ
除了CachingGraphD2RQ,还有一个CachingGraphD2RQ能够提供相同的API,使用LRU(最近最少使用算法)
缓存记忆最近几个查询的结果。这会改进重复查询的效果,如果数据库在CachingGraphD2RQ类的使用期间发生改变的话,会报出数据的不一致性。
 
6. Executing SPARQL queries against a ModelD2RQ
D2RQ可以通过D2RQ模型响应SPARQL查询,下面的例子介绍D2RQ模型是如何创建的,以及SPARQL查询是如何执行的、结果是如何写入控制台的。
ModelD2RQ m = new ModelD2RQ("file:doc/example/mapping-iswc.ttl");
String sparql =
    "PREFIX dc: <http://purl.org/dc/elements/1.1/>" +
    "PREFIX foaf: <http://xmlns.com/foaf/0.1/>" +
    "SELECT ?paperTitle ?authorName WHERE {" +
    "    ?paper dc:title ?paperTitle . " +
    "    ?paper dc:creator ?author ." +
    "    ?author foaf:name ?authorName ." +
    "}";
Query q = QueryFactory.create(sparql);
ResultSet rs = QueryExecutionFactory.create(q, m).execSelect();
while (rs.hasNext()) {
    QuerySolution row = rs.nextSolution();
    System.out.println("Title: " + row.getLiteral("paperTitle").getString());
    System.out.println("Author: " + row.getLiteral("authorName").getString());
};
m.close();
 
7. The D2RQ Assembler
D2RQ自带Jena编译器,Jena编译器的规格是RDF的配置文件,文件描述了如何构建一个Jena模型。更多的Jena编译器的信息,请看 Jena Assembler quickstart page.
下面的例子介绍了D2RQ模型的编译规格
@prefix : <#> .
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> .
 
<> ja:imports d2rq: .
 
:myModel
    a d2rq:D2RQModel;
    d2rq:mappingFile <mapping-iswc.ttl>;
    d2rq:resourceBaseURI <http://localhost:2020/>;
    .
D2RQ模型规格支持下面两种特性:
d2rq:mappingFile:必要的,使用D2RQ的映射文件的URI来构建模型。
d2rq:resourceBaseURI:设置基础URI来代替相对URI模型,转变为全URI。如果不特指的话,D2RQ会特选择一个适当的基础URI。
下面的这种惯例用法,将从一个模型规范中创建一个D2RQ模型,并把它写入控制台。
// Load assembler specification from file
Model assemblerSpec = FileManager.get().loadModel("doc/example/assembler.ttl");
 
// Get the model resource
Resource modelSpec = assemblerSpec.createResource(assemblerSpec.expandPrefix(":myModel"));
 
// Assemble a model
Model m = Assembler.general.openModel(modelSpec);
 
// Write it to System.out
m.write(System.out);
 
m.close();
 
8. Javadoc API documentation
    Javadoc API documentation for the latest releaseis available.
 
 
注1:Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
 
 
第二步就写到这里,供大家参考。有需要交流的可以加QQ: 1q7q1q5q3q6q0q1q8(去掉中间的q)。
 
 
 

第二步 在D2RQ平台上配置jena环境的更多相关文章

  1. eclipse弃坑记第一篇之在idea上配置Tomcat环境并创建Javaweb项目的详细步骤原创

    IntelliJ IDEA是一款功能强大的开发工具,在代码自动提示.重构.J2EE支持.各类版本工具(如git.svn.github).maven等方面都有很好的应用. IntelliJ IDEA有免 ...

  2. Mac上配置GTK环境

    Mac上配置GTK环境 安装command line工具, 如果安装了Xcode, 就直接跳过该步骤 安装Homebrew 使用brew install pkg-config 使用brew insta ...

  3. Eclipse/MyEclipse上配置Spring环境

    在MyEclipse上配置Spring环境 myeclipse其实已经集成Spring的开发环境,我们只需在新建的项目上添加spring的配置环境就可以 新建一个java项目 选中创建好的项目之后,在 ...

  4. [eShopOnContainers 学习系列] - 03 - 在远程 Ubuntu 16.04 上配置开发环境

    直接把 md 粘出来了,博客园的富文本编辑器换成 markdown,没啥效果呀 ,先凑合吧.实在不行换地方   # 在远程 Ubuntu 16.04 上配置开发环境 ## 零.因 为什么要用这么麻烦的 ...

  5. mac上配置react-native环境run-ios/run-android命令遇到的问题

    新报错(rn版本:0.53.3)2018.3.6 今天在搞react-native环境时,遇到了一些坑,这里记录一下. 首先最重要的一点是一定要按官网一步一步来,不然可能会出现一些奇奇怪怪的问题! 官 ...

  6. VMware上配置DPDK环境并运行实例程序

    1. 在虚拟机VMware上配置环境 VMware安装:http://www.zdfans.com/html/5928.html Ubuntu:https://www.ubuntu.com/downl ...

  7. 在linux上配置Maven环境变量

    1.首先下载maven ,这里我使用的是3.8.1 Maven – Download Apache Maven 2.在linux环境中,将maven上传至 /usr/local/目录中 这里我将mav ...

  8. 教你在mac上配置adb环境变量

    1.打开终端,一次输入如下命令 cd ~ touch .bash_profile open -e .bash_profile 2.这时候会在TextEdit中打开一个空白文档,输入下面的语句 a. 输 ...

  9. 1-如何自己在eclipse上配置Andriod环境

    转载:http://blog.csdn.net/dr_neo/article/details/49870587 最新鲜最详细的Android SDK下载安装及配置教程 2015年11月16日 19:2 ...

随机推荐

  1. 看看baidu是如何AJAX跨域的[转]

    看看baidu是如何AJAX跨域的 最近做个人网站遇到AJAX跨子域名的问题. 偶尔看到baidu的通行证处理都是在二级域名passport.baidu.com中处理的, 但是baidu很多地方登录都 ...

  2. PYTHON多进程样码

    敲了一晚上,留个念想. 发现它和LINUX的C编程差不多,就是作了PYTHON化的语法封装. 以后希望有机会能用上.. A,多进程函数化实现 import multiprocessing import ...

  3. JavaWeb学习总结(三十五)——使用JDBC处理Oracle大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  4. Protel封装库

    一.目录下面的一些封装库中,根据元件的不同封装我们将其封装分为二大类:一类是分立元件的封装,一类是集成电路元件的封装 1.分立元件类: 电容:电容分普通电容和贴片电容: 普通电容在Miscellane ...

  5. app与server联系

    --- /frameworks/base/services/java/com/android/server目录下SystemServer.java 在ServerThread的run函数中增加加载Rf ...

  6. mplayer windows configure修改

    相信大家在编译mplayer的时候,都会遇到一个问题,就是那个折腾人的mplayer会检测当面目录下有没有ffmpeg的文件夹. 没有的话,mplayer会启动git进行漫长的下载ffmpeg源码.其 ...

  7. bzoj1324

    经典例题 在<最小割模型在信息学竞赛中的应用>有详细的解答就不赘述了 主要想说,其实这题的几个结论其实是很好猜出来的: 当摸不清题目本质的时候,不妨多找几种情况,猜测一下 顺便推广一下几个 ...

  8. EF多数据库预热

    使用EF第一次加载程序会很慢,因为EF第一次会生成实体类和数据库的对应关系并做缓存,怎么解决这个问题呢?站在巨人的肩膀上将会省力很多,博客园的dudu已经给出了个解决方案(EF版本6.0以上) htt ...

  9. JS頁面值傳遞

    <script type="text/javascript"> function GetValue() { var url=location.search; var R ...

  10. 让人爱不释手的13套精美 Web 应用程序图标素材(转)

    图标用于向用户传递信息,不管是在网页还是 Web 应用程序中都非常需要.这些小小的图标元素能够告诉用户怎么到下一页,如何添加.删除和取消等等各种操作.设计精美的图标不仅能增加界面的美观,也能够让应用程 ...