我在我的项目中使用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/TDB和http://openjena.org/TDB),但我不明白我该怎么做。
它是与RDB界面类似的概念还是什么?我是否需要在postgresql DB中加载NT?
JENA文件在这一点上似乎不是很清楚。
感谢任何提示, Mulone
答案 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不提供任何并发支持。如果您的应用需要并发访问商店(特别是与一个或多个读取并发的任何写入),您将需要在应用级别处理锁定。