本章,介绍 基于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_
_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.
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)
[max1: (?A rdf:type max(?P, 1)), (?A ?P ?B), (?A ?P ?C)
-> (?B owl:sameAs ?C) ]
Rule allID说明了functor用于将OWL限制的组件