我正在使用Jena和TDB。我成功存储三元组但需要指定某个属性“isA”是传递的,以便使用TransitiveReasoner进行推理。
以下是我正在使用的一些方法:
private void AddTriple(String arg1, String pred, String arg2) {
Resource r = m.createResource(NS + arg1);
Property p = m.createProperty(NS + pred);
Property p2 = m.createProperty(NS + arg2);
r.addProperty(p, p2);
}
private void addTest() {
AddTriple("cat", "isA", "feline");
AddTriple("feline", "isA", "mammal");
AddTriple("mammal", "isA", "animal");
m.close();
}
我按如下方式加载模型:
Dataset dataset = TDBFactory.createDataset(directory);
m = dataset.getDefaultModel();
addTest();
我正在设置推理器如下:
Reasoner reasoner = ReasonerRegistry.getTransitiveReasoner();
InfModel inference = ModelFactory.createInfModel(reasoner, m);
推理模型包含:
<ModelCom {http://namespace/test#cat @http://namespace/test#isA http://namespace/test#feline; http://namespace/test#feline @http://namespace/test#isA http://namespace/test#mammal; http://namespace/test#mammal @http://namespace/test#isA http://namespace/test#animal} | >
由于“isA”属性未指定为传递属性,因此推理模型包含与原始模型完全相同的三元组。我如何指定“isA”属性是可传递的,所以我可以得到以下三元组:
cat isA mammal
cat isA animal
答案 0 :(得分:2)
“当一个属性P定义为传递属性时,这意味着如果一对(x,y)是P的实例,并且该对(y,z)也是P的实例,那么我们可以推断对(x,z)也是P的一个实例。 从语法上讲,通过使属性成为内置的OWL类owl:TransitiveProperty的实例,将属性定义为可传递的,该属性被定义为owl:ObjectProperty的子类。 - http://www.w3.org/TR/owl-ref/#TransitiveProperty-def
因此,您需要将属性定义为可传递,您可以通过将以下RDF三元组添加到Jena模型来实现:
<http://namespace/test#isA> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#TransitiveProperty>
m.add(ResourceFactory.createResource(NS +“isA”),RDF.type,OWL.TransitiveProperty)
我还建议您阅读Jena网站上有关本体和推理的文档: