【问题标题】:Jena TDB after reason then updateJena TDB 原因后更新
【发布时间】:2014-07-24 03:34:06
【问题描述】:

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

【问题讨论】:

  • 你能澄清一下你实际上在做什么吗? TDB 是一个 RDF 三元组存储,所以我假设当您说“行”时,您的意思是三元组。如果您不在 Java 代码范围内,那么使用 SPARQL 是更新三元组存储的最自然方法,但如果您正在编写 Java 代码,那么您可以轻松地检索数据集中命名图的模型并向它们添加语句与耶拿。
  • 是的,你有我的问题。但问题是,在使用了推理器之后。我得到了一个包含旧模型和新三元组的 Infmodel。我对如何将 Infmodel 放入 tdb 和更新感到困惑,因为它包含我的旧模型。不只是新海龟。谢谢你。
  • 请显示一些代码。到目前为止你做了什么?什么没有按您预期的方式工作?一个 TDB 数据集可以包含多个图,不清楚您是要覆盖一个,还是只是添加到它,或者是什么。请说明您目前在做什么,以及哪些方面不起作用。
  • 只需更新代码,感谢您的回复

标签: sparql jena tdb jena-rules


【解决方案1】:

注意,您从TDBFactory 获得的Datset 的生命周期应该比您从它获得的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 更有效,但如果您依赖反向链接推理,则不适用。

【讨论】:

  • 谢谢!在谈到前向推理时,这里有一个小问题。是不是这样 x -> y 和反向链接推理就像 x
  • 没错。前者是根据基础模型的内容以及其他规则的结果进行热切评估的。后者在执行查询时进行评估(或者当您要求模型列出语句时)。混合规则 (x -> (y
  • 另一个问题,infModel.getDeductionsModel() 适用于 genericRule。但是 owlReasoner 很奇怪。猫头鹰推理器有没有更好的解决方案并获得模型的新部分?
  • 您使用的是正向链接的 OWL 推理器/规则集吗?默认的 OWL 推理器是一个混合推理器(所以getDeductionsModel 只会给你规则集的前向部分)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多