知识图谱推理与实践 (2) -- 基于jena实现规则推理
本章,介绍 基于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
说明了如何使用数字