OWLApi: не удалось создать экземпляр отшельника

Доброе утро, я пытаюсь написать класс Java, который мог бы управлять онтологией, в частности, я хочу найти все свойства (имя, подклассы, суперклассы и т. д.) одного OWLClass, но мне не удается экземпляр Hermit и я не могу понять почему. Я использую Eclipse с проектом Maven, зависимости, записанные в файле pom, скопированы из примеров отшельника, то же самое для зависимостей OWLapi.

Ошибка в java-консоли:

Exception in thread "main" java.lang.NullPointerException
    at org.semanticweb.HermiT.Reasoner.<init>(Reasoner.java:210)
    at org.semanticweb.HermiT.Reasoner.<init>(Reasoner.java:187)
    at OntologyManager.retrieve_property_class(OntologyManager.java:105)

В частности, строка, которая не выполняется:

Reasoner hermit = new Reasoner(null, ontologia);

Это код из метода, который не работает, я уже проверил документацию отшельника и различные примеры, но не помогло.

public void retrieve_property_class(OWLOntology ontology) {
        //creo il reasoner per svolgere recupero informazioni
        Reasoner hermit = new Reasoner(null, ontologia);

        //richiesta del nome della classe di cui si vogliono le proprietà
        String classe;
        System.out.print("Inserire il nome della classe di cui si vogliono le proprietà: ");
        classe = scannerNome.nextLine();

        //check per vedere se la classe esiste
        Set<OWLClass> classi = ontology.getClassesInSignature();
        for (OWLClass e : classi) { //scorro le classe OWL del set comparandone l'IRI con il nome della classe desiderata
            if(e.getIRI().getFragment().equals(classe)) { //se una classe soddisfa l'uguaglianza ne vengono stampate le proprietà
                System.out.println("Le informazioni della classe sono le seguenti: ");
                //nome classe
                System.out.println("Nome classe: \n"
                        + "\t"+ classe);
                //display superclassi
                System.out.println("Superclassi:");
                for(Node<OWLClass> superclasse: hermit.getSuperClasses(e)) {
                    System.out.println("\t"+ superclasse.getRepresentativeElement().getIRI().getFragment());
                }
                //display sottoclassi
                System.out.println("Sottoclassi:");
                for(Node<OWLClass> sottoclasse : hermit.getSubClasses(e)) {
                    System.out.println("\t"+ sottoclasse.getRepresentativeElement().getIRI().getFragment());
                }
                //display classi disgiunte
                System.out.println("Classi disgiunte:");
                for(Node<OWLClass> disgiunta : hermit.getDisjointClasses(e)) {
                    System.out.println("\t"+ disgiunta.getRepresentativeElement().getIRI().getFragment());
                }
                //display istanze della classe
                System.out.println("Istanze:");
                for(Node<OWLNamedIndividual> individuo : hermit.getInstances(e)) {
                    System.out.println("\t"+ individuo);
                }
            }
        }
        hermit.dispose();
    }

person DiegLuthor    schedule 02.12.2018    source источник
comment
Привет, объект конфигурации, переданный в качестве первого параметра, не может быть нулевым. Легче создавать объекты Reasoner через класс ReasonerFactory.   -  person Ignazio    schedule 05.12.2018


Ответы (1)


Вы должны использовать ReasonerFactory, т.е. для HermiT вы должны импортировать следующее:

import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
import org.semanticweb.HermiT.ReasonerFactory;

Следующий код создаст резонер HermiT.

OWLReasonerFactory reasonerFactory = new ReasonerFactory();
OWLReasoner reasoner = reasonerFactory.createReasoner(ontology);

Ваш pom.xml должен включать:

<dependency>
    <groupId>net.sourceforge.owlapi</groupId>
    <artifactId>owlapi-distribution</artifactId>
    <version>5.1.8</version>
</dependency>

<dependency>
    <groupId>net.sourceforge.owlapi</groupId>
    <artifactId>org.semanticweb.hermit</artifactId>
    <version>1.4.3.517</version>
</dependency>
person Henriette Harmse    schedule 03.12.2018
comment
Предложенные вами строки не сработали: OWLReasonerFactory ReasonerFactory = new ReasonerFactory(); попросить создать класс ReasonerFactory. Если я изменяю ReasonerFactory на OWLReasonerFactory, это показывает, что ошибка не может создать экземпляр класса - person DiegLuthor; 03.12.2018
comment
Опубликуйте точные зависимости, которые вы добавили в свой 'pom.xml' для HermiT и OWL API. Спасибо - person Henriette Harmse; 03.12.2018
comment
hermiT зависимость: ‹dependency› ‹groupId›com.hermit-reasoner‹/groupId› ‹artifactId›org.semanticweb.hermit‹/artifactId› ‹version›1.3.8.4‹/version› ‹/dependency› OWLApi зависимость: ‹dependency› ‹groupId›net.sourceforge.owlapi‹/groupId› ‹artifactId›owlapi-distribution‹/artifactId› ‹version›5.0.0‹/version› ‹/dependency› - person DiegLuthor; 03.12.2018
comment
Обновленный ответ с обязательным импортом и правильными зависимостями pom.xml. - person Henriette Harmse; 03.12.2018
comment
Я бы рекомендовал HermiT 1.4.3.517, так как вы предлагаете OWLAPI 5.1.8. Это самый последний выпуск, совместимый с самым последним выпуском OWLAPI. - person Ignazio; 05.12.2018
comment
@ Игнацио, я не знал! Спасибо что подметил это! Я изменил свой ответ, чтобы отразить это. - person Henriette Harmse; 05.12.2018