耶拿TDB理智后再更新

时间:2014-07-24 03:34:07

标签: sparql jena tdb jena-rules

我正在使用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;
}

1 个答案:

答案 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更有效,但如果您依赖于向后链接推断则它不适用。