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