2

我对 Apache Jena TDB 有疑问。基本上,我创建了一个新的数据集,将数据从 RDF/XML 文件加载到名为“http://example.com/model/filename”的命名模型中,其中文件名是 XML/RDF 文件的名称。加载数据后,命名模型中的所有语句都插入到默认模型中。出于备份原因,命名模型保留在数据集中。

当我现在尝试查询数据集中的命名模型时,TDB 冻结并且应用程序似乎在无限循环中运行,因此它没有终止,也没有引发异常。

是什么导致了冻结,我该如何预防?

示例代码:

Dataset ds = TDBFactory.createDataset("tdb");
Model mod = ds.getDefaultModel();

File f = new File("example.rdf");
FileInputStream fis = new FileInputStream(f);

ds.begin(ReadWrite.WRITE);

// Get a new named model to load the data into
Model nm = ds.getNamedModel("http://example.com/model/example.rdf");
nm.read(fis, null);

// Do some queries on the Model using the utility methods of Model, no SPARQL used

// Add all statements from the named model to the default model
mod.add(nm);

ds.commit();
ds.end();

// So far everything works as expected, but the following line causes the freeze
Iterator<String> it = ds.listNames();

任何访问现有命名模型的方法调用都会导致相同的冻结反应,getNamedModel("http://example.com/model/example.rdf");例如,这也是相同的。通过调用添加新的命名模型getNamedModel("http://example.com/model/example123.rdf");可以正常工作,因此只能访问现有模型。

使用环境:Linux 64bit, Oracle Java 1.7.0_09, Jena 2.7.4 (incl. TDB 0.9.4)

提前感谢您的帮助!

编辑:修复了代码片段中的错误

Edit2:解决方案(我对 AndyS 答案的最后评论)

好的,我浏览了整个程序并添加了所有丢失的交易。不是它按预期工作。我怀疑 Jena 在我的程序关闭序列期间抛出了一个异常,但该异常没有正确报告,并且“冻结”是由其他线程未正确终止引起的。感谢您指出错误的交易使用。

4

1 回答 1

1

你能把它变成一个测试用例并发送给jena用户的邮件列表吗?

您应该在事务内部获得默认模型 - 您在外部获得它。

此外,如果您以事务方式使用数据集,则不能像在ds.listNames. 它不应该冻结 - 你应该得到某种警告。

于 2012-12-22T18:17:58.030 回答