【问题标题】:OWL API: Good substitution for isSubclassOf methodOWL API:isSubclassOf 方法的良好替代
【发布时间】:2017-12-11 19:24:12
【问题描述】:

你好,

我正在使用 Java OWL API(版本 5)并想检查一个类是否是另一个类的子类。现在我通过获取预期子类的所有超类并检查该列表是否包含预期的超类来做到这一点。这种方法有效,但如果类和我的本体变得更大,我需要这样做很多,它并不是很有效。

在 OWL API 的早期版本中,OWLClassReasoner 中似乎有一个 isSubclassOf(.., ..) 方法。但在当前版本中,两者都不再存在。

我是否忽略了某些东西,如果没有,是否有更有效的方法来完成这项任务?

【问题讨论】:

  • 我不知道 'isSubClassOf()' 但有 'getSubClasses()' 和 'getSuperClasses()' 应该可以完成这项工作。注意,现在你的方法还不完整,因为它使用了 owl2 表达性的子部分;如果这是您想要的,那么在您的特定情况下,可能会有比 DL 推理器更快的东西。你真正需要什么?
  • 正确且常用的方法是使用 OWLReasoner::isEntailed() 方法和相应的公理作为参数,即在您的情况下是 SubClassOf 公理。
  • @AKSW 谢谢,这就是我的意思。这是OWLSubClassOfAxiom subClassOfAxiom = dataFactory.getOWLSubClassOfAxiom(subClass, superClass); reasoner.isEntailed(subClassOfAxiom); 的正确方法还是我可以创建公理?
  • 不,这是正确的方法。

标签: java owl owl-api


【解决方案1】:

OWLClassReasoner 是一个 OWLAPI 2 类 - 我相信 OWLAPI 2 的最后一个版本是在 2009 年左右,所以可以说代码已经过时了。

使用真正的推理器(即,用于 OWLAPI 5 的 HermiT 或 Openllet 之一 - 它们可以在 Maven Central 上找到),您可以使用以下代码:

OWLReasoner reasoner = ...
OWLClass a = ...
OWLClass b = ...
boolean bIsSuperclass = reasoner.getSuperClasses(a, false).containsEntity(b);

【讨论】:

  • 谢谢,这正是我现在正在做的。我只是认为使用推理器可以更有效地做到这一点。
  • “更高效”是什么意思?计算类层次结构由推理器完成一次,最迟在调用需要推断层次结构健全和完整的查询时完成。否则,请使用我建议的蕴涵检查。如果您在谈论方便,请随意编写自己的方法来包装代码。
  • 我搜索了一种更有效的方法,因为我认为我的解决方案效率不高。我得到一个类的所有超类(根据本体,可能很大),将它们放在一个列表中并检查该列表是否包含应该是超类的类。 isSubClassOf(.., ..) 方法正是我需要的,但它已经过时了。所以我想知道是否有合适的替代品。您提到您建议的方法是正确的方法,所以我认为这是我正在寻找的替代方法。再次感谢您!
  • 那么什么属于“推理”,什么不属于? reasoner.getSuperClasses(a, false)不是也在推理吗?是的,您的方法对于少数类来说可能是最小的努力,但是对于少数类来说,这两种方法都相对较快。问题是,哪种方法更适合大量类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2023-03-12
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
相关资源
最近更新 更多