Protege中推理引擎的测试使用

Hermit简介

(以下来自百度翻译)

HermiT是使用Web本体语言(OWL)编写本体的推理机。给定一个OWL文件,HermiT可以确定本体是否一致,识别类之间的包容关系,等等。
HermiT是第一个公开的OWL推理机,它基于一个新的“hypertableau”演算,提供了比任何已知算法更有效的推理。以前需要几分钟或几小时来分类的本体通常可以在几秒钟内被HermiT分类,而HermiT是第一个能够对许多本体进行分类的推理者,这些本体以前被证明过于复杂,任何可用的系统都无法处理。
HermiT使用直接语义,并通过了所有owl2对直接语义推理器的一致性测试。

HermiT是由牛津大学计算机科学数据与知识研究组开发的一款基于OWL的本体推理机。官网位于http://www.hermit-reasoner.com/。你可以通过Protege使用HermiT,这是最简单的方式;也可以使用HermiT提供的Java API来开发你自己的程序。这里主要展示如何在Protege中简单地使用HermiT进行推理。

安装HermiT

在最新版本的Protege中,HermiT是随Protege安装的,不需要手动安装。

创建一个本体

在测试集中,我建立了一个简单的亲属关系本体来进行测试。这个本体描述了几个人之间的亲属关系,以及年龄属性。我希望HermiT能基于规则(Rule)做到:

  1. 推断并填补关系(Object properties),例如B是A的弟弟,A是C的母亲,则B是C的舅舅;
  2. 推断并赋予属性(Data properties),例如B的年龄是43(40-55),则B的年龄段是中年;
    这个本体的视图如下:

SWRL

SWRL(Semantic Web Rule Language)是由以语义的方式呈现规则的一种语言,SWRL的规则部分概念是由RuleML所演变而来,再结合OWL本体论形成。SWRL已经是W3C规范中的一员。SWRL相关的内容在中文网上比较难找到,最完善的学习资料是w3c自己在2004年发布的SWRL语言指导。一段SWRL语言通过简单的“IF-THEN”语句来定义一串规则,其中IF和THEN都是通过Atom组成的,Atom描述了最为简单的一种假设,例如“XX是XX”、“XX的YY是ZZ”等。SWRL提供了七种Atom,分别是:

  1. 描述,对应class;description \'(\’ i-object \’)\’
  2. 数据,dataRange \'(\’ d-object \’)\’
  3. 实体关系,对应Object properties;individualvaluedPropertyID \'(\’ i-object i-object \’)\’
  4. 数据属性,对应Data properties;datavaluedPropertyID \'(\’ i-object d-object \’)\’
  5. 相同,sameAs \'(\’ i-object i-object \’)\’
  6. 相异,differentFrom \'(\’ i-object i-object \’)\’
  7. 其他内建功能,builtIn \'(\’ builtinID { d-object } \’)\’
    内建功能提供了一些针对数字、字符串、日期的基础操作,在SWRL文档的8.1节有详细描述,这里不再赘述。(注意!HermiT不支持builtIn SWRL,所以虽然前面说了用HermiT,其实使用的是Drools一般推理引擎,前面懒得再修改了)

SWRL的格式遵从rule ::= \'Implies(\' [ URIreference ] { annotation } antecedent consequent \')\'的格式,其中atom之间通过‘&’连接,antecedent和consequent之间用‘->’连接。一个例子如下:
hasParent(?x1,?x2) ∧ hasBrother(?x2,?x3) ⇒ hasUncle(?x1,?x3)
他描述了x1有x2作为家长,并且x2有x3作为兄弟,则x1有x3作为uncle(国外的uncle可以代表伯叔舅丈)。

SWRL在Protege中的使用

Protege内建了SWRLtab页面,在window-tab-swrltab中打开即可。

选择new新建一个规则(年龄在40-55之间的年龄段为中年):

依次点击OWL+SRWL->Doorls,Run Doorls,Drools->OWL。分别执行了解析SRWL语言、推断和将知识保存到原来的知识图谱中。在知识图谱中,可以看到成功推断出王德法的年龄段是中年,作为男人也是人,龙傲天是小明的舅舅(同时也是亲属)等等。


在下一篇随笔里,我会尝试直接调用Java API做到这一点。

版权声明:本文为OverloadBachPunk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/OverloadBachPunk/p/14380962.html