本章,介绍 基于jena的规则引擎实现推理,并通过两个例子介绍如何coding实现。

规则引擎概述

jena包含了一个通用的规则推理机,可以在RDFS和OWL推理机使用,也可以单独使用。

推理机支持在RDF图上推理,提供前向链、后向链和二者混合执行模式。包含RETE engine 和 one tabled datalog engine。可以通过GenericRuleReasoner来进行配置参数,使用各种推理引擎。要使用 GenericRuleReasoner,需要一个规则集来定义其行为.

Rule的语法与结构

规则通过 Rule对象来进行定义,包含 body terms列表 (premises),head terms列表 (conclusions) 和可选的 name 和可选的direction。

An informal description of the simplified text rule syntax is:

_Rule_      :=   _bare-rule_ .           or   [ _bare-rule_ ]        or   [ ruleName : _bare-rule_ ]  _bare-rule_ :=   _term_, ... _term_ -> _hterm_, ... _hterm_    // forward rule           or   _bhterm_ <- _term_, ... _term   _ // backward rule  _hterm     :=   term _ or   [ _bare-rule_ ]  _term_      :=   (_node_, _node_, _node_)           // triple pattern           or   (_node_, _node_, _functor_)        // extended triple pattern           or   builtin(_node_, ... _node_)      // invoke procedural primitive  _bhterm_      :=   (_node_, _node_, _node_)           // triple pattern  _functor_   :=   functorName(_node_, ... _node_)  // structured literal  _node_      :=   _uri-ref_                   // e.g. http://foo.com/eg           or   prefix:localname          // e.g. rdf:type           or   <_uri-ref_>          // e.g. <myscheme:myuri>           or   ?_varname_ // variable           or   'a literal'                 // a plain string literal           or   'lex'^^typeURI              // a typed literal, xsd:* type names supported           or   number                      // e.g. 42 or 25.5 

逗号 "," 分隔符是可选的.

前向和后向规则语法之间的区别仅与混合执行策略相关,请参见下文。

_functor_ 是一个扩展的三元组,用于创建和访问文本值。functorName可以是任何简单的标识符。

为保障rules的可读性URI引用支持qname语法。可以使用在 PrintUtil对象中注册的前缀。

下面是一些规则示例:

[allID: (?C rdf:type owl:Restriction), (?C owl:onProperty ?P),      (?C owl:allValuesFrom ?D)  -> (?C owl:equivalentClass all(?P, ?D)) ]  [all2: (?C rdfs:subClassOf all(?P, ?D)) -> print('Rule for ', ?C)     [all1b: (?Y rdf:type ?D) <- (?X ?P ?Y), (?X rdf:type ?C) ] ]  [max1: (?A rdf:type max(?P, 1)), (?A ?P ?B), (?A ?P ?C)       -> (?B owl:sameAs ?C) ] 
  • Rule allID说明了functor用于将OWL限制的组件收集到单个数据结构中,然后可以触发进一步的规则
  • Rule all2 表示一个前向规则,它创建了一个新的后向规则,并且还调用了print.
  • Rule max1 说明了如何使用数字