【问题标题】:How to use Jena TDB to store local version of Linked Movie Database如何使用 Jena TDB 存储链接电影数据库的本地版本
【发布时间】:2011-04-11 14:36:00
【问题描述】:

我有一个本地版本的 N-Triples 格式的 LinkedMDB,我想查询它。现在,我想使用Jena TDB,它可以存储可以用于以后查询的数据。我检查了documentation for TDB Java API,但无法加载 N-Triples 文件,然后使用 SPARQL 进行查询。我使用了以下代码:

String directory = "E:\\Applications\\tdb-0.8.9\\TDB-0.8.9\\bin\\tdb";
        Dataset dataset = TDBFactory.createDataset(directory);

        // assume we want the default model, or we could get a named model here
        Model tdb = dataset.getDefaultModel();

        // read the input file - only needs to be done once
        String source = "E:\\Applications\\linkedmdb-18-05-2009-dump.nt";
        FileManager.get().readModel( tdb, source, "N-TRIPLES" );

并得到以下异常

Exception in thread "main" com.hp.hpl.jena.tdb.base.file.FileException: Not a directory: E:\Applications\tdb-0.8.9\TDB-0.8.9\bin\tdb
    at com.hp.hpl.jena.tdb.base.file.Location.<init>(Location.java:83)
    at com.hp.hpl.jena.tdb.TDBFactory.createDataset(TDBFactory.java:79)
    at tutorial.Temp.main(Temp.java:14)

【问题讨论】:

  • 如果目录E:\Applications\tdb-0.8.9\TDB-0.8.9\bin\tdb 尚不存在,您必须先创建它。但是,您可能应该将数据存储在您安装 TDB 的位置以外的目录中(即特定于您的应用程序的目录)。例如,考虑下载 TDB 的未来版本时会发生什么。

标签: java jena linkedmdb


【解决方案1】:

从 Java 读取 TDB 支持的 Model 非常简单,请参阅 the TDB wiki 了解详细信息。例如,您可以:

// open TDB dataset
String directory = "./tdb";
Dataset dataset = TDBFactory.createDataset(directory);

// assume we want the default model, or we could get a named model here
Model tdb = dataset.getDefaultModel();

// read the input file - only needs to be done once
String source = "path/to/input.nt";
FileManager.get().readModel( tdb, source, "N-TRIPLES" );

// run a query
String q = "select * where {?s ?p ?o} limit 10";
Query query = QueryFactory.create(q);
QueryExecution qexec = QueryExecutionFactory.create(query, tdb);
ResultSet results = qexec.execSelect();
... etc ...

正如 user205512 所提到的,您可以在 Linux 或 Mac 上的命令行中使用 tdbloader2,这对于大型 RDF 文件会更快。创建 TDB 索引后,您可以将文件复制到其他机器。因此,您可以在 Linux 服务器上加载数据,然后将 tdb 目录中的所有文件传送到您的 Windows 机器上以继续开发。

要在 Windows 机器上从命令行运行 tdbloader,您需要类似 cygwin 的东西来允许您运行 Unix 风格的脚本。您还需要设置环境变量TDBROOT

【讨论】:

  • 所以,首先我需要使用 tdbloader2 加载文件,然后使用您提供的代码来查询它
  • 使用 tdbloader/tdbloader2 是上述代码示例中“读取输入文件”步骤的替代方法。无论哪种方式,您都可以这样做;你不必两者都做。
  • 线程“主”java.lang.OutOfMemoryError 中的异常:java.nio.HeapByteBuffer 处的 Java 堆空间。(未知源)在 java.nio.ByteBuffer.allocate(未知源)i得到以下异常:
  • 您需要针对这个新主题开始一个新问题,或者,我建议这样做会更好,向 Jena 用户列表发送电子邮件(有关如何订阅的信息,请参阅 incubator.apache.org/jena/contributing.html )。无论哪种方式,您都必须显示您的代码:否则无法诊断该异常(近端原因很清楚:您的堆空间不足,但根本原因 - 为什么堆空间不足需要更多信息来诊断)。
  • 我认为这是因为 inkedmdb-18-05-2009-dump.nt 文件大小为 450mb
【解决方案2】:

您不需要任何 java 代码来执行此操作(tdbloader2 更快):

bin/tdbloader2 --loc /path/to/tdb/store imdb.nt

将加载到 n-triple 文件中。您可以使用以下方式查询它:

bin/tdbquery --loc /path/to/tdb/store "select ...."

更多关于 tdb 命令行工具的信息here

【讨论】:

  • 我正在构建一个查询 nt 文件的应用程序。是否有任何 java 代码来实现这个。我不能一直从命令行执行此操作
  • 当我尝试 tdbloader 时,我得到:'tdbloader' 不是内部或外部命令、可运行程序或批处理文件
【解决方案3】:

假设“nt 格式”确实是“N-Triple”,那么如果 lang"N-Triple",则 Jena Model.read(is, base, lang) 方法将加载 N-Triple 格式。

更多详情,请参考Jena tutorial document

【讨论】:

  • 我知道这一点,但问题是文件大小为 850 mb,导致堆溢出异常。所以,我想将文件数据存储在 tdb 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
相关资源
最近更新 更多