0

我有一个充满语句的 Jena 模型,并使用GenericRuleReasoner如下自定义规则字符串(示例直接取自Jena 教程页面

String rules = "[rule1: (?a eg:p ?b) (?b eg:p ?c) -> (?a eg:p ?c)]";
Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(rules));
reasoner.setDerivationLogging(true);
InfModel inf = ModelFactory.createInfModel(reasoner, model);

根据我对 Jena 推理器的理解,新的推理模型inf将包含model规则生成的语句以及新推断的语句。inf两者中的陈述实例是model共享的还是不同的?如果不同,这不会太浪费内存吗?

我遇到的一个问题是将推断的语句重用到model. 遍历inf模型以查找新推断的语句并将它们添加到model似乎是一种幼稚的方法。还有其他更明智的方法吗?

最后,我想知道从model. 我所说的过时陈述的意思可能最好用一个例子来解释。假设在model. 稍后,当插入一个新的语句,例如 (Speaker hasSoundLevel 80) 时,它应该从model. 这可以通过使用规则来实现吗?如果语句在插入后的一定时间后需要过时怎么办?任何有关如何实现这一目标的建议将不胜感激。

谢谢,

4

2 回答 2

0

生成的推断模型包含来自原始本体的语句和来自推理器的推断语句。据我所知,这些语句不是共享的,但是我不相信它会浪费很多内存。要了解更多信息,您可能需要通过邮件列表向实际在 Jena 工作的人员发送电子邮件。

至于删除过时的语句,你不能通过规则直接这样做。但是,您可以为 Jena 规则创建一个自定义内置函数,该规则将删除您通过规则文件提供的语句,或者通过在程序中指定一些底层逻辑条件来使用 OntModel 上的 API 调用。
同样据我所知,Jena 本身并不维护将语句添加到模型中的时间戳,因此在一定时间后不可能使语句无效,尽管您可以添加侦听器并保留日志更改并使用日志时间来确定何时失效。

于 2015-09-15T06:43:56.747 回答
0

inf 和 model 中的语句实例是共享的还是不同的?

它们似乎是共享的。例如,在您创建之后,InfModel您可以直接使用添加一个新的三元组InfModel.add(s,p,o)。然后你会发现原来的也加了triple model。就推断的陈述而言,那些似乎保持不同,即不会出现在model.

于 2018-02-15T00:58:32.400 回答