【问题标题】:Backward chaining Jena reasoner反向链接 Jena 推理器
【发布时间】:2013-05-26 09:23:45
【问题描述】:

我一直在阅读 Jena 文档,以尝试创建一个简单的纯反向链接推理器。我有一个简单的反向链接规则,我将其应用于一个小型本体。 我想知道是否无论如何都要在每个查询的基础上进行反向链接,这样当我得到我的 InfModel 时,并不是所有的蕴涵都被计算出来:

Modelfactory.createInfModel(reasoner,model) 

但仅当他们被请求时。所以,对于下面的规则:

[rule2: (?x rdfs:type ?z)<-(?x ?rdf:type ?y),(?y rdfs:subClassOf ?z)]

我可以注册一个查询来查找特定类的所有类型,然后触发上述规则吗?

【问题讨论】:

  • 你在这方面有什么进展吗?
  • 抱歉回复晚了。是的,我对得到的答案很满意,但我认为我的问题有点离题。我知道 Jena 允许您完全向后运行推理器,但这样做并不是很明显,因为当您写出推理模型时,它会返回原始 + 扣除图。对我来说,这似乎是在做一些前向链接推理,但如果你在推理图上调用 .size() ,你实际上会看到它的大小与原始图相关。所以实际上在 write 命令之前没有进行任何推理,这一定意味着 write 算作一个查询。
  • Write 本质上必须要求所有三元组,这就像要求模型列出与 (null,null,null) 匹配的语句,所以不仅仅是 write 算作查询,而且 write 必须在为了得到它需要写的三元组。 Model.size() 上的文档说“对于虚拟化模型,例如由推理引擎创建的模型,它将返回模型中语句数量的估计下限,但对于此类模型的后续 listStatements 是可能的发现比 size() 指示的更多的语句,”这是您所看到的行为。
  • 如果你想只写出已经推断出的三元组,你可以使用 InfModel.getDeductionsModel,这个返回的模型你应该可以在没有额外查询的情况下写出。

标签: rdf jena jena-rules


【解决方案1】:

根据documentation on the backward chaining engine,你想要的行为已经是反向链接引擎提供的:

如果规则推理器以反向链接模式运行,它使用逻辑编程 (LP) 引擎,其执行策略与 Prolog 引擎相似。 当推理模型被查询时,查询被转换成一个目标,引擎尝试通过匹配任何存储的三元组和目标解析来满足该目标。 [强调]

如果您使用您提供的规则定义推理器,那么当您请求 x rdf:type z 形式的三元组时,推理器将在那时触发该规则。

【讨论】:

  • 是的,我读过这个,但这让我很困惑。你知道他们在说什么类型的查询吗?它只是在模型上执行一个简单的 get(triple)。当我使用 getInfGraph 计算推理模型时,所有蕴涵似乎都是在我执行任何查询之前计算的。我觉得很奇怪。
  • @user2370200 嗯……是的,我现在正在玩一些反向规则集,我看到了你在谈论的行为。似乎 Jena 正在确定使用哪些值来实例化规则的头部,然后运行查询。我不确定这里到底发生了什么,但我会继续调查。
  • 我想我已经取得了进步。我在我的 infgraph 上调用了 .size ,发现当我的推理器绑定到模型时,大小表明没有派生任何蕴涵,这让我相信,当我调用 .write 方法时,这被视为一个查询。
  • @user2370200 (我删除了之前的评论;它没有经过深思熟虑,并且具有误导性。)在 Prolog 中,可以询问包含变量的查询,并返回与系统一样多的答案可以计算。正如文档所描述的,反向链接规则中的三元组可以被认为是使用隐式的triple 谓词,其中(?s ?p ?o) 实际上是triple(?s,?p,?o)。询问所有陈述(write 必须这样做)就像询问triple(S,P,O),当然规则的头部会匹配,你会得到推理的结束。
猜你喜欢
  • 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
相关资源
最近更新 更多