[英]Jena; Domains and Ranges for a property differs upon selected Reasoner
使用Jena,我試圖獲取屬性的域和范圍。
讓我們考慮以下本體論
@prefix : <http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82> .
<http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82> rdf:type owl:Ontology .
:P rdf:type owl:ObjectProperty ;
rdfs:domain :A1 ;
rdfs:range :B1 .
:A rdf:type owl:Class .
:A1 rdf:type owl:Class ;
rdfs:subClassOf :A .
:A2 rdf:type owl:Class ;
rdfs:subClassOf :A1 .
:B rdf:type owl:Class .
:B1 rdf:type owl:Class ;
rdfs:subClassOf :B .
:B2 rdf:type owl:Class ;
rdfs:subClassOf :B1 .
我們可以看到,A1是P的域,B1是它的范圍。 據OWL語義我們可以推斷,A也是對於P域和B也是一個范圍,它在這里看到 。
但是,使用帶有推理器的Jena並不總能給出預期的行為。 讓我們區分兩種情況,第一種是使用Pellet推理器,第二種是使用OWL_DL_MEM_RULE_INF
碼
import org.mindswap.pellet.jena.PelletReasonerFactory;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntProperty;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
public class Test{
public static void main (String [] args)
{
OntModel ontModel = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC);
/*OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF);*/
ontModel.read("path_to_ontology", "RDF/XML");
ontModel.setStrictMode(false);
String myNS = ontModel.getNsPrefixURI("");
Resource r = ontModel.getResource(myNS + "P" );
OntProperty prop = (OntProperty) r.as( OntProperty.class);
ExtendedIterator <OntClass> opDomains = (ExtendedIterator <OntClass>) prop.listDomain();
while(opDomains.hasNext()){
OntClass domain = opDomains.next();
System.out.println("DOMAIN: " + domain.getURI());
}
ExtendedIterator <OntClass> opRanges = (ExtendedIterator <OntClass>) prop.listRange();
while(opRanges.hasNext()){
OntClass ran = opRanges.next();
System.out.println("RANGE: " + ran.getURI());
}
}
}
使用Pellet:這給出了以下輸出:
DOMAIN: http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#A1
RANGE: http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#B1
使用OWL_DL_MEM_RULE_INF:這給出了以下輸出:
DOMAIN: http://www.w3.org/2002/07/owl#Thing
DOMAIN: http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#A1
DOMAIN: http://www.w3.org/2000/01/rdf-schema#Resource
DOMAIN: http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#A
RANGE: http://www.w3.org/2002/07/owl#Thing
RANGE: http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#B1
RANGE: http://www.w3.org/2000/01/rdf-schema#Resource
RANGE: http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#B
題:
1-為什么會出現這種差異?
2-正確的結論是什么?
3-是否有某種方法可以強制Pellet提供類似於OWL_DL_MEM_RULE_INF的結果?
而不是枚舉域和范圍嘗試詢問屬性是否具有給定的域或范圍:
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
...
Collection<Resource> classes = Arrays.asList(
createResource("http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#A"),
createResource("http://www.semanticweb.org/eng.medianhilal/ontologies/2015/2/untitled-ontology-82#B")
);
...
for (Resource theClass: classes) {
if (prop.hasRange(theClass) System.out.printf("RANGE: %s\n", theClass);
if (prop.hasDomain(theClass) System.out.printf("DOMAIN: %s\n", theClass);
}
我認為你會發現,pellet將按預期報告范圍和域。 這是reasoners工作方式的不同之處:jena的內置推理器是一個在rdf上工作的混合規則引擎,而pellet是一個OWL推理器。 在實踐中,這意味着推斷的三元組顯然不存在。
Pellet有一個常見問題解答 ,解釋了一些差異,以及如何提取所有推論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.