1

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

1 回答 1

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()到原始模型,所有前向链接推理都将插入回图中。这通常至少比 add 效率高一点infModel,但如果您依赖反向链接推理,则它不适用。

于 2014-08-19T16:32:54.963 回答