摘要: 本文介绍了 Jena 的推理子系统,并构建了一个简略的 RDF 图。基于该 RDF 图,咱们搭建了一个 Jena 推理引擎,并进行自动化推理。
本文分享自华为云社区《常识推理之基于 jena 的常识推理(三)》,作者:北纬 30 度。
Jena 推理子系统旨在容许将一系列推理引擎或推理器插入 Jena。这些引擎用于派生从一些根本 RDF 以及任何可选的本体信息中取得 RDF 断言,以及与推理器关联的公理和规定。此机制的主要用途是反对应用 RDFS 和 OWL 等语言,这些语言容许从实例数据和类形容中推断出额定的事实。该机制的设计非常通用,它包含一个通用规定引擎,可用于许多 RDF 解决或转换工作。
应用程序通常通过应用 ModelFactory 将数据集与某个推理器关联以创立新模型来拜访推理机。对创立的模型的查问不仅将返回原始数据中存在的语句,而且还将返回应用推理器实现的规定或其余推理机制从数据中导出的其余语句。
可用的推理 Jena 散布中包含许多预约义的推理:
传递推理器: 提供存储和遍历类和属性情的反对。这仅实现了 rdfs:subPropertyOf 和 rdfs:subClassOf 的传递和反身属性。
RDFS 规定推理器: 实现 RDFS 要求的可配置子集。
OWL、OWL Mini、OWL 微推理器: 一组有用但不残缺的 OWL/Full language 的 OWL/Lite 子集的实现。
通用规定推理器: 基于规定的推理器,反对用户定义的规定。反对正向链接、表反向链接和混合执行策略。
构建 RDF 图
jena 的 org.apache.jena.rdf.model 包用于创立和操作 RDF 图的类和接口。其中 ModelFactory 提供了创立规范 RDF Model 的办法。
上面的例子展现了如何构建一个 RDF 图
Model onlineModel = ModelFactory.createDefaultModel();
String prefix = "http://www.example.org/mingjiao#";
Resource mingjiao = onlineModel.createResource(prefix + "mingjiao");
Resource zhangwuji = onlineModel.createResource(prefix + "zhangwuji");
Resource weifuwang = onlineModel.createResource(prefix + "weifuwang");
Resource baimeiyingwang = onlineModel.createResource(prefix + "baimeiyingwang");
Property zhizhang = onlineModel.createProperty(prefix + "zhizhang");
Property leader = onlineModel.createProperty(prefix + "leader");
Property shuyu = onlineModel.createProperty(prefix + "shuyu");
onlineModel.add(zhangwuji, zhizhang, mingjiao);
onlineModel.add(zhangwuji, shuyu, mingjiao);
onlineModel.add(weifuwang, leader, zhangwuji);
PrintUtil.registerPrefix("", prefix);
StmtIterator i = onlineModel.listStatements(null, null, (RDFNode)null);
System.out.println("推理前");
while (i.hasNext()) {System.out.println('-' + PrintUtil.print(i.nextStatement()));
}
output:
-(:baimeiyingwang :leader :zhangwuji)
-(:zhangwuji :zhizhang :mingjiao)
-(:weifuwang :leader :zhangwuji)
首先,通过 ModelFactory 创立规范 RDF Model。
其次,利用 Resource、Property 别离创立 RDF 图中的资源,和属性。这里咱们创立了明教、张无忌、韦幅王、白眉鹰王四个资源,以及执掌、上级领导、属于三个属性。
最初,将资源和属性组成三元组增加到 RDF 图中。如 < 张无忌,执掌,明教 >。
搭建 jena 推理引擎
jena 蕴含一个通用规定引擎,它的 inference 子系统用于实现推理的性能。用户能够基于 jena 推理引擎实现简略规定推理,也能够自定义推理规定。jena 推理引擎能够从已有的数据信息和类形容中推理出额定的事实。上面是基于 RDF 图的推理例程:
String rules = "[rule: (?p :zhizhang ?c)(?a :leader ?p) -> (?a :shuyu ?c)]";
Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(rules));
InfModel inf = ModelFactory.createInfModel(reasoner, onlineModel);
Iterator list = inf.listStatements(null, null, (RDFNode)null);
System.out.println("推理后");
while (list.hasNext()) {System.out.println("-" + PrintUtil.print(list.next()));
}
output:
- (:baimeiyingwang :shuyu :mingjiao)
- (:weifuwang :shuyu :mingjiao)
- (:baimeiyingwang :leader :zhangwuji)
- (:zhangwuji :zhizhang :mingjiao)
- (:weifuwang :leader :zhangwuji)
咱们基于构建的 RDF 图定义了一条规定:”[rule: (?p :zhizhang ?c)(?a :leader ?p) -> (?a :shuyu ?c)]” 其含意是若 A 执掌明教,且他是 B 的领导,那么 B 属于明教。有了 RDF 图模型和规定,咱们通过创立 InfModel 将二者绑定在一起,InfModel 会根据咱们定义的规定,利用 RDF 图中已有的资源和属性进行推理,进而失去新的事实。如上例中,通过推理失去了 < 韦幅王,属于,明教 > 和 < 白眉鹰王,属于,明教 > 两个新的事实。
点击关注,第一工夫理解华为云陈腐技术~