如何将大型nt / rdf转储加载到Jena / postgresql模型(TDB / RDB?)

时间:2011-05-20 17:02:18

标签: postgresql import rdf large-files jena

我在我的项目中使用DBpedia。 到目前为止,我一直在使用SPARQL客户端,但性能远远不能被接受(更不用说终点的频繁停机)。

所以我想在本地dbms中加载http://wiki.dbpedia.org/Downloads36处可用的大NT文件(我有一个带Postgresql的服务器)。

在我的应用程序中(基于Java和Groovy构建)我使用Jena持久图打开一个连接:

def jenaConnection = new DBConnection( ... )
def maker = ModelFactory.createModelRDBMaker( jenaConnection )
def globalModel = maker.openModel( "my_big_fat_model" )

这对于几千个三元组是可以的,但是当我尝试使用阅读器加载大型NT文件时

RDFReader r = m.getReader( "N-TRIPLE")
r.read( inputStreamFromBigFile ... ) 

性能很好。它每分钟加载大约2-3K三元组,这意味着整个DBpedia数据集(数百万三元组)可能需要数天才能加载。使用JENA和大型数据集的其他人似乎没有这个问题。

我读到我应该将TDB用于大型数据集(http://openjena.org/wiki/TDBhttp://openjena.org/TDB),但我不明白我该怎么做。

它是与RDB界面类似的概念还是什么?我是否需要在postgresql DB中加载NT?

JENA文件在这一点上似乎不是很清楚。

感谢任何提示, Mulone

1 个答案:

答案 0 :(得分:2)

如果您希望坚持使用PostgresQL作为后端,则应使用SDB。对于Jena模型的关系存储而言,这是一个比旧数据库驱动程序更新的包装器。 SDB还有quickstart documentation

TDB是一个持久性存储,它提供了使用关系数据库作为后端三元组的替代方法。 TDB在磁盘上构建自己的b树索引,并为您管理缓存。在其他方面,程序员看起来就像普通的耶拿Model。 TDB具有帮助加载过程的命令行工具,尽管它们是bash脚本,它们需要Linux或cygwin。要加载dbpedia,这就是我过去所做的:

$> tdbloader2 --loc ./tdb ./source/*.nt

其中./source是我从dpbedia下载各种.nt文件的目录。在合理的机器上需要几个小时,但肯定不是几天。

./tdb中获得TDB图像后,只需按照documentation在Java程序中加载Model

String directory = "./tdb" ;
Model model = TDBFactory.createModel(directory) ;
...
model.close() ;

从那里开始,只需使用model,因为您通常会使用任何Jena模型。有一点需要注意:TDB不提供任何并发支持。如果您的应用需要并发访问商店(特别是与一个或多个读取并发的任何写入),您将需要在应用级别处理锁定。