我正在使用Jena,我想将新的本体更新到我的tdb中。 例如。 我的本体中有100行,在我添加一些规则并运行推理器后,现在有105行。 我需要在我的tdb中更新这5个额外的行。 我怎么能这样做?
我尝试google它,我找到了两种方法。一个是使用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/");
}
所以,我的问题是如何处理新的" infmodel"到我的tdb。 我想只更新新的事实。
这是我从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;
}
答案 0 :(得分:2)
注意,您从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
更有效,但如果您依赖于向后链接推断则它不适用。