Jena TDB的使用简介

Jena总共支持三种内置存储模式,分别是RDB,SDB,和TDB。其中RDB现在几乎不用了,因为速度比较慢。而官方推荐的则是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;
 
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;

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保存到文件里面去
     }
 
}

你可能感兴趣的:(数据库)