【问题标题】:How to load large nt/rdf dump into a Jena/PostgreSQL model (TDB/RDB?)如何将大型 nt/rdf 转储加载到 Jena/PostgreSQL 模型(TDB/RDB?)
【发布时间】:2011-08-29 20:06:37
【问题描述】:

我在我的项目中使用 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://jena.apache.org/documentation/tdb/),但我不明白我应该用它做什么。

它是与 RDB 接口类似的概念还是什么?我需要在 PostgreSQL 数据库中加载 NT 吗?

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

【问题讨论】:

标签: postgresql import rdf large-files jena


【解决方案1】:

如果你想坚持使用 PostgresQL 作为后端,你应该使用SDB。与旧的 db 驱动程序相比,它是 Jena 模型的关系存储的更新包装器。还有quickstart documentation 与 SDB 合作。

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

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

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

./tdb 中拥有 TDB 映像后,只需按照 documentationModel 加载到您的 Java 程序中:

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

从那里,只需使用 model,就像您通常使用任何 Jena 模型一样。有一个警告:TDB 不提供任何并发支持。如果您的应用需要对存储的并发访问(具体而言,任何写入与一次或多次读取同时进行),您将需要在应用级别处理锁定。

【讨论】:

  • 谢谢!我在这里发布了一个关于 tdbloader 的问题:superuser.com/questions/286388/…
  • 看起来像是路径初始化问题。自从我使用 cygwin 以来已经有一段时间了,但我记得你必须小心 :; 路径分隔符。因为$CLASSPATH 被移交给Windows JVM,所以您必须确保Windows 样式的分号分隔符。您可能需要调整脚本才能做到这一点。很抱歉没有在其他论坛上回复.. 我只是无法应付另一个频道来跟上!随时将这些问题通过电子邮件发送到 Apache 的 jena-users 列表。
  • 应该由 tdbloader 调用的 'make_classpath' 自动处理。
  • TDB 在进程内运行,因此虽然 tdbloader 是推荐的方式,但我还发现编写自己的小导入程序也非常快 - 不到一秒钟就可以将 100k 三元组导入 TDB。另一个需要注意的关键是 32 位架构上的 TDB 将增长到 ~1GB 的 RAM。在 64 位架构上,它使用内存映射文件,这些文件只占用内核定义的可用空闲 RAM。如果您对此不熟悉,您可能会认为您正在泄漏,而实际上您只是在缓存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多