我正在使用Jena,我想将新的本体更新到我的tdb中。例如。我的本体中有100行,在我添加一些规则并运行推理器之后,现在有105行了。我需要在我的tdb中更新这5行。我怎么才能完成这件事?
我试着搜索它,我找到了两种方法。一种是使用sparql更新,另一种是截断tdb并将新模型添加到其中。
还有其他更好的解决办法吗?
谢谢你
--
代码
void after_reasoner(Model m) {
String yago = "http://yago-knowledge.org/resource/";
Reasoner reasoner = new GenericRuleReasoner(
Rule.rulesFromURL("file:./rules/act.rule"));
InfModel inf1 = ModelFactory.createInfModel(reasoner, m);
PrintUtil.registerPrefix("yago", "http://yago-knowledge.org/resource/");
}因此,我的问题是如何处理对我的tdb的新"infmodel“。我只想更新新的事实。
这是我从tdb获取模型的方法。
Model tdb_write_return() {
String directory = "./tdb";
Dataset dataset = TDBFactory.createDataset(directory);
dataset.begin(ReadWrite.WRITE);
String ns = "http://www.darrell.com.tw/ontologies/";
Model model = dataset.getNamedModel(ns);
dataset.commit();
dataset.end();
dataset.close();
return model;
}发布于 2014-08-19 16:32:54
注意到,从TDBFactory获得的Datset的生存期应该比从TDBFactory获得的Model对象长。如果在该数据集中调用Dataset.close(),则与返回模型的交互可能会突然发生错误。
物化扣减
关于您的问题,如果您想保留推断出的三元组,则需要将它们添加回基础模型中。这可以利用现有的图表,而不是替换任何东西。
final String directory = "./tdb";
final String ns = "http://www.darrell.com.tw/ontologies/";
final Dataset dataset = TDBFactory.createDataset(directory);
dataset.begin(ReadWrite.WRITE);
try {
Model model = dataset.getNamedModel(ns);
final Reasoner reasoner = new GenericRuleReasoner(Rule.rulesFromURL("file:./rules/act.rule"));
final InfModel infModel = ModelFactory.createInfModel(reasoner, m);
infModel.prepare()
model.add(infModel.getDeductionsModel()); // #1
dataset.commit();
}
catch(final Exception e) {
dataset.abort();
}
finally {
dataset.end();
}在上面的示例中,带有注释#1的行接受(前向)演绎的结果,并将它们插入到底层模型中。要获得所有的引渡信息,您可以这样做:
model.add(infModel);推理者可以/应该考虑新的三元组并尝试进行新的扣减,但是这种尝试推理的结果应该是不可行的。
解释
如果将infModel添加到底层模型,则尝试将原始模型、反向推理和前向推断的结合添加到原始模型中。你在评论中提到了这一点。为了澄清,由于RDF的集合语义,尝试添加已经存在的三元组并不会导致对数据的任何更改。在RDF中,每个四/三(或行,考虑到关系类比)都是唯一的。
如果将infModel.getDeductionsModel()添加到原始模型中,则将将所有前向链接推理插入到图中。一般来说,这至少比添加infModel更有效,但如果依赖于反向链接推理,则不适用。
https://stackoverflow.com/questions/24924684
复制相似问题