首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jena TDB经过推理,然后更新

Jena TDB经过推理,然后更新
EN

Stack Overflow用户
提问于 2014-07-24 03:34:06
回答 1查看 845关注 0票数 1

我正在使用Jena,我想将新的本体更新到我的tdb中。例如。我的本体中有100行,在我添加一些规则并运行推理器之后,现在有105行了。我需要在我的tdb中更新这5行。我怎么才能完成这件事?

我试着搜索它,我找到了两种方法。一种是使用sparql更新,另一种是截断tdb并将新模型添加到其中。

还有其他更好的解决办法吗?

谢谢你

--

代码

代码语言:javascript
复制
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获取模型的方法。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-19 16:32:54

注意到,从TDBFactory获得的Datset的生存期应该比从TDBFactory获得的Model对象长。如果在该数据集中调用Dataset.close(),则与返回模型的交互可能会突然发生错误。

物化扣减

关于您的问题,如果您想保留推断出的三元组,则需要将它们添加回基础模型中。这可以利用现有的图表,而不是替换任何东西。

代码语言:javascript
复制
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的行接受(前向)演绎的结果,并将它们插入到底层模型中。要获得所有的引渡信息,您可以这样做:

代码语言:javascript
复制
model.add(infModel);

推理者可以/应该考虑新的三元组并尝试进行新的扣减,但是这种尝试推理的结果应该是不可行的。

解释

如果将infModel添加到底层模型,则尝试将原始模型、反向推理和前向推断的结合添加到原始模型中。你在评论中提到了这一点。为了澄清,由于RDF的集合语义,尝试添加已经存在的三元组并不会导致对数据的任何更改。在RDF中,每个四/三(或行,考虑到关系类比)都是唯一的。

如果将infModel.getDeductionsModel()添加到原始模型中,则将将所有前向链接推理插入到图中。一般来说,这至少比添加infModel更有效,但如果依赖于反向链接推理,则不适用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24924684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档