Apache Jena偷吃步

Inference API

Inference API被用來對本體論中的知識進行推理

假設我們今天的本體論長成這樣

主要分為動物和植物兩大類別,動物又分成肉食動物與草食動物

已知老虎是肉食動物的其中一種、牛是草食動物的其中一種、草是植物的其中一種

而且牛會吃草

我們知道身為肉食動物的老虎會狩獵草食動物,但是本體論中沒有描述,那我們要如何去推斷出來呢?

這就是我們以下將探討的部分

匯入本體論

將你本體論的檔案匯入程式中

OntModel model = ModelFactory.createOntologyModel();
InputStream in = FileManager.get().open("your ontology file path");
if (in == null) {
    throw new IllegalArgumentException("File: not found");
}
model.read(in, null);

建立推理規則

建立一個格式為.rules的檔案,如inference.rules

接下來我們將「肉食動物會狩獵草食動物」進行規則的創建

在推理規則檔案中加入以下的內容

# prefix請設定為你自己的namespace與本體論
@prefix NS: <http://www.example.com/your_ontology.owl#>.
@include <RDFS>.

#如果某h為草食動物的一種,而且某c為肉食動物的一種,那某c就會狩獵某h
[rule1: (?h rdf:type NS:herbivore)(?c rdf:type NS:carnivore) -> (?c NS:hunt ?h)]

將推理規則導入本體論

接下來jena將延伸一出一個新的Inference Model,裡面包括了導入推理規則後所獲得的結果

List<Rule> rules = Rule.rulesFromURL("your rule file path");
Reasoner reasoner = new GenericRuleReasoner(rules);
reasoner.setDerivationLogging(true);
InfModel inf = ModelFactory.createInfModel(reasoner, model);

現在的本體論變成這樣子了