Йена; Домены и диапазоны для свойства различаются в зависимости от выбранного 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 Reasoner, а вторая использует 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());
    }
}
}

Использование гранул: это дает следующий результат:

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?


person Median Hilal    schedule 04.03.2015    source источник


Ответы (1)


Вместо того, чтобы перечислять домен и диапазон, попробуйте спросить, имеет ли свойство заданный домен или диапазон:

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);
}

Я думаю, вы обнаружите, что пеллет будет сообщать диапазоны и домены, как и ожидалось. Это разница в том, как работают логики: встроенная логика jena представляет собой гибридный механизм правил, работающий поверх rdf, тогда как лепешка — логика OWL. На практике это означает, что предполагаемые тройки не присутствуют явно.

У Pellet есть часто задаваемые вопросы, в которых объясняются некоторые различия и способы извлечения все умозаключения.

person user205512    schedule 05.03.2015
comment
Моя онтология — чистый OWL, в ней нет троек (нет ABox). Итак, судя по тому, что вы говорите, Pellet должен сообщать домены и диапазоны, как и ожидалось! - person Median Hilal; 06.03.2015