我对 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 在我的程序关闭序列期间抛出了一个异常,但该异常没有正确报告,并且“冻结”是由其他线程未正确终止引起的。感谢您指出错误的交易使用。