我使用的耶拿,我想更新新的本体论到我的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/");
}
如此反复,我的问题是如何应对新的“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;
}
注意的寿命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
把你的(前)扣除的结果,将它们插入回底层模型。 要获得所有dedudctions,你可以这样做:
model.add(infModel);
该推理可以/应该考虑新的三元组,并试图作出新的扣减,但推理未遂的结果应是一个空操作。
说明
如果添加infModel
到底层模型,您尝试你的原始模型的结合,向后推理,和前推断,全部添加到原来的模式。 您在您的评论叫了这一点。 为了澄清,由于RDF的语义集,尝试添加已经存在不会导致任何更改数据的三倍。 在RDF中,每四/三(或行,考虑关系的比喻),是独一无二的。
如果添加infModel.getDeductionsModel()
原来的模型中,所有正向链推论再次插入图形。 这应该是一般至少有一点更有效比增加infModel
,但如果你依赖于向后链接的推论是不适用的。