我遇到了Apache Jena TDB的问题。基本上我创建了一个新的数据集,将数据从RDF / XML文件加载到名为“http://example.com/model/filename”的命名模型中,其中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 64位,Oracle Java 1.7.0_09,Jena 2.7.4(包括TDB 0.9.4)
提前感谢您的帮助!
编辑:修复了代码片段中的错误
Edit2:解决方案(我对AndyS的最后评论回答)
好的,我完成了整个程序,并添加了所有丢失的交易。不是它按预期工作。我怀疑Jena在我的程序的关闭序列期间抛出异常,但是没有正确报告异常并且“冻结”是由其他未正确终止的线程引起的。感谢您指出错误的交易使用情况。
答案 0 :(得分:1)
您可以将其转换为测试用例并将其发送到jena用户邮件列表吗?
你应该在交易中获得默认模型 - 你在外面得到它。
此外,如果您以事务方式使用数据集,则不能像在ds.listNames
那样非交易使用它。它不应该冻结 - 你应该得到某种警告。