Jena TDB的使用简介

Jena总共支持三种内置存储模式,分别是RDB,SDB,和TDB。其中RDB现在几乎不用了,因为速度比较慢。而官方推荐的则是TDB,速度快,操作简单,支持几十亿条记录,且支持几百个并行查询。

本来说要继续写TDB的文章的,但是最近一直没有写成。实在是看不下去这篇短得不能再短的关于TDB的介绍,又获得了大量的点击率,所以,还是认真修改一下。

关于Jena这整个的Project,有一个需要事先声明一下,像ARQ,TDB,SDB这些API里面都包含了Jena的jar文件,所以你下载了任何一个,都可以不需要下载Jena了。之前有一个人写的代码老是报错,然后问我。我在我的电脑上运行的时候,发现没有错。最好发现是她既把TDB的Jar加进去了,又把Jena的Jar加进去了,导致出错。
我不明白Jena的开发者为什么要这样做,搞得挺麻烦的。
首先,要明确一点,Jena所有的东西都是围绕着Model进行的。一个TDB里面可以包含多个的Model,就像一个数据库里面可以包含多个的表,这些Model都有各自的名字,你可以访问各个Model,而不用把其他的Model加载到内存里面。由于测试的时候,大部分数据并不是很大,一般都是用DefaultModel这个Model,下面是简单创建一个TDB并加载RDF文件到TDB里面去的例子:


package TDB教程的例子;
 
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.tdb.TDBFactory;
import com.hp.hpl.jena.util.FileManager;
 
/**
 * 我的邮箱:shahuwang@qq.com
 * 我的博客:www.shahuwang.com
 * 创建时间:2012-5-18
 * @author 王瑞期
 */
public class CreateTDB
{
    public static void main(String [] args)
    {
        Dataset ds = TDBFactory.createDataset("test");//建立了一个test的TDB,如果存储test的TDB,则表示使用这个TDB
        Model model = ds.getDefaultModel();//这里使用TDB的默认Model
        FileManager.get().readModel(model, "RDFFile");//读取RDF文件到指定的model里面
        /*
         * 这里要详细说一下如何读取RDF到Model里面的方法了,其实model就有
         * read方法可以对RDF进行读取,但是上面用FileManager会比较好一点,它会自动
         * 处理许多问题
         */
 
        model.commit();//这里类似于数据库的commint,意思是把现在的操作立刻提交
        model.close();//结束使用的时候,一定要对Model和Dataset进行关闭
        ds.close();
    }
 
}

上面的代码很简单,这样就可以把RDF文件加载到TDB里面了。

现在会面临另一个问题,怎么对TDB进行查询呢?sparql的查询分好几种,最常用的是select查询,还有其他的查询是ASK查询,update查询,以及construct查询,这里只介绍一下select查询和update查询。
package TDB教程的例子;
 
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.update.UpdateAction;
 
/**
 * 我的邮箱:shahuwang@qq.com
 * 我的博客:www.shahuwang.com
 * 创建时间:2012-5-18
 * @author 王瑞期
 */
public class queryTDB
{
    /*
     * 查询的方式有多种,查询的对象也有多种,可以对一个Dataset进行查询
     * 也可以对一个Model进行查询,还可以对一个Graph进行查询,总之Jena
     * 能提供很强大的功能
     */
    public ResultSet SelectQuery(Dataset ds, String queryString)
    {
 
        QueryExecution qexec = QueryExecutionFactory.create(queryString, ds);
        ResultSet resultSet = qexec.execSelect();
        return resultSet;
    }
 
    /**
     * @param model
     * @param queryString
     * @return 返回的是查询的结果,类型为ResultSet类型
     *
     */
    public ResultSet SelectQuery(Model model,String queryString)
    {
        QueryExecution qexec = QueryExecutionFactory.create(queryString, model);
        ResultSet resultSet = qexec.execSelect();
        return resultSet;
    }
 
    public void updateQuery(Dataset ds,String updateFile)
    {
         UpdateAction.readExecute(updateFile, ds);//updateFile是含有更新操作的sparql文件,就是把sparql保存到文件里面去
    }
 
}

国内很多专家们,大多数搞语义网都不是专搞这个,而是因为这个好发论文,评职称什么的好一些,所以很多根本就不关注语义网的发展,比如到现在还有不少的老师,一想到存储,就立刻告诉学生用关系数据库来存储RDF,对于TDB这些Native Repository,根本就不去了解。TDB已经很不错了,相信在Apache基金会的帮助下,会变得更加得强大。
如果有其他的问题,可以问我,尽我所能帮助大家。


文章转载自:http://www.shahuwang.com/2011/11/24/用jena将rdf文件导入tdb.html



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值