【发布时间】: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