关于 Apache 推理 API
首先
继上一篇关于Ontology API的文章之后,现在我们来解释一下Inference API。Jena库的特点是它将模型处理和推理(Inference, Reasoning)功能分别提供在不同的模块中。据说在Jena中可以使用的Reasoner如下所示。除此之外,Pellet是一个很有名的Reasoner,在论文中也被提及过,不过似乎已经被Stardog产品吸收了。
-
- 变换推理器:只接受传递/反射属性。具体来说,是rdfs:subPropertyOf和rdfs:subClassOf。
RDFS规则推理器:包括可配置的RDFS子集。
OWL、OWL Mini、OWL Micro推理器:顾名思义,它们是OWL的子集等。
通用规则推理器:是用户可以自行实现的基于规则的推理器。一般不太常用。
推理者
进行推理的是被称为Reasoner的组件。通过使用Reasoner和推理模型(InfModel),进行推理操作是基本流程。
通常,Reasonerはファクトリーメソッドを通じて生成されます。Ontology APIを使用している場合は、予め生成されたOntModelSpecが適切なReasonerを適用してくれます。たとえば、RDFSを使用して推論する簡単なRDFモデルの場合、ModelFactory.createRDFSModelが使用されます。以下はそのような例です。
String NS = "urn:x-hp-jena:eg/";
// 適当なモデルを作る
Model rdfsExample = ModelFactory.createDefaultModel();
Property p = rdfsExample.createProperty(NS, "p");
Property q = rdfsExample.createProperty(NS, "q");
rdfsExample.add(p, org.apache.jena.vocabulary.RDFS.subPropertyOf, q);
rdfsExample.createResource(NS+"a").addProperty(p, "foo");
// RDFSを使ったReasonerによるInfModel
InfModel inf = ModelFactory.createRDFSModel(rdfsExample);
在上述中,我們使用rdfs:subPropertyOf這個述詞來描述屬性p,並將其對象設定為q。這樣一來,推論就能夠讓我們在引用屬性q時獲取到p的內容(即foo)。
Resource a = inf.getResource(NS+"a");
System.out.println("Statement: " + a.getProperty(q));
如果您希望在Reasoner之外以不同的方式进行各种设置,则还可以通过将Reasoner拆分为InfModel来预先进行设置,如以下所示。
Reasoner reasoner = RDFSRuleReasonerFactory.theInstance().create(null);
InfModel inf = ModelFactory.createInfModel(reasoner, rdfsExample);
各种不同的推理者 (Sè Reasoner)
RDFS规则推理器(RDFSRuleReasoner)
在Jena中,有一个默认的推理器可以支持RDFS。它有三个匹配级别,并且可以在设置时进行指定。下面的例子中,我们指定了ReasonerVocabulary.PROPsetRDFSLevel。
Resource config = ModelFactory.createDefaultModel()
.createResource()
.addProperty(ReasonerVocabulary.PROPsetRDFSLevel, "simple");
Reasoner reasoner = RDFSRuleReasonerFactory.theInstance()Create(config);
-
- 完整:包括所有公理和规则等。
默认:排除了高负载的检查。虽然不太清楚,但似乎没有“everything is a resource(一切都是资源)”和“everything used as a property is one(一切都是属性)”这两个规则,在实际应用中几乎没有问题。
简单:只包含传递关系如subPropertyOf(子属性关系)、subClassOf(子类关系)以及范围描述如domain(域)和range(范围)等,不包含公理。看起来最方便,但由于实现不完全,不成为默认选项。
OWL推理机
在Jena中提供的是OWL/Lite的实现,它是OWL/full的一个子集。目前可以通过设置选择默认模式或更快/更小的两种模式。他们的目标不是实现完全的OWL/Full,而是建议使用不同的引擎,如Pellet、Racer、FaCT。使用方法如下:读取用OWL描述的本体(模式),将其绑定到推理器,然后创建InfModel。
Model schema = FileManager.get().loadModel("file:data/owlDemoSchema.owl");
Model data = FileManager.get().loadModel("file:data/owlDemoData.rdf");
Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
reasoner = reasoner.bindSchema(schema);
InfModel infmodel = ModelFactory.createInfModel(reasoner, data);
今天就到这里吧。
只要有这么多的信息,可能可以先用本体论推理来制作一个应用程序…
以下内容给出了一个选项:
请参阅
-
- Reasoners and rule engines: Jena inference support
-
- Extracting knowledge from Ontology using Jena for Semantic Web
- Reasoning in Semantic Web Using Jena