耶拿TDB原因之后再更新(Jena TDB after reason then update)

2019-10-20 13:02发布

我使用的耶拿,我想更新新的本体论到我的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;
}

Answer 1:

注意的寿命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 ,但如果你依赖于向后链接的推论是不适用的。



文章来源: Jena TDB after reason then update