Как проверить консистенцию ABOX с помощью Hermit Reasoner

Я пытаюсь научиться правильно использовать OWLAPI, но у меня возникают некоторые проблемы: у меня есть онтология, которая структурирует деятельность (например, индивидуальную и социальную деятельность); моя цель — создать простой пример несоответствия, чтобы привыкнуть к этому API: я хочу заявить, что футбол — это отдельная деятельность. IndividualActivity определяется в Protegè как Equivalent to (Activity and (hasActor exactly 1 Person)).

/// PIECE OF CODE ///

    OWLDataFactory df = Singleton_Ontologia.getFactory();

    IRI soccerIRI=IRI.create(Singleton_Ontologia.getIribase(),"Soccer");
    IRI paoloIRI = IRI.create(Singleton_Ontologia.getIribase(),"Paolo");
    IRI marcoIRI = IRI.create(Singleton_Ontologia.getIribase(),"Marco");

    OWLNamedIndividual soccer = df.getOWLNamedIndividual(soccerIRI);
    OWLNamedIndividual paolo = df.getOWLNamedIndividual(paoloIRI);
    OWLNamedIndividual marco = df.getOWLNamedIndividual(marcoIRI);

    OWLClass person = df.getOWLClass(
            IRI.create(Singleton_Ontologia.getIribase()+"Person"));

    OWLClass individual_activity = df.getOWLClass(
            IRI.create(Singleton_Ontologia.getIribase()+"IndividualActivity"));

    OWLObjectProperty hasActor = df.getOWLObjectProperty(
            IRI.create(Singleton_Ontologia.getIribase()+"hasActor"));

    OWLClassAssertionAxiom assertionAxiom = df.getOWLClassAssertionAxiom(individual_activity, soccer);
    OWLClassAssertionAxiom assertionAxiom2 = df.getOWLClassAssertionAxiom(person, paolo);
    OWLClassAssertionAxiom assertionAxiom3 = df.getOWLClassAssertionAxiom(person, marco);
    OWLObjectPropertyAssertionAxiom assertionAxiom4 = df.getOWLObjectPropertyAssertionAxiom(hasActor, soccer, paolo);
    OWLObjectPropertyAssertionAxiom assertionAxiom5 = df.getOWLObjectPropertyAssertionAxiom(hasActor, soccer, marco);

    Singleton_Ontologia.getManager().addAxiom(ontologiaattuale,assertionAxiom);
    Singleton_Ontologia.getManager().addAxiom(ontologiaattuale,assertionAxiom2);
    Singleton_Ontologia.getManager().addAxiom(ontologiaattuale,assertionAxiom3);
    Singleton_Ontologia.getManager().addAxiom(ontologiaattuale,assertionAxiom4);
    Singleton_Ontologia.getManager().addAxiom(ontologiaattuale,assertionAxiom5);

/// CONSISTENCY CHECK ///

System.out.println("Consistency:"+Singleton_Ontologia.getReasoner().isConsistent());

а вот конфигурация резонера-отшельника:

public static void configReasoner() {
    iribase = "http://webmind.dico.unimi.it/CARE/locont.owl#";
    Configuration config=new Configuration();
    config.ignoreUnsupportedDatatypes=true; 
    factory = manager.getOWLDataFactory();
    reasonerFactory = new ReasonerFactory();
    reasoner = reasonerFactory.createReasoner(ont,config);
}

Я создал людей Паоло и Марко, чтобы создать более 1 Person, являющихся Actors из Soccer, но метод isConsistent() по-прежнему возвращает значение true, в то время как я ожидал ложного значения. Кроме того, я распечатал содержимое ABOX:

___________ABOX___________


/////////////////////// OBJECT number 1 ///////////////////////
ClassAssertion(<http://webmind.dico.unimi.it/CARE/locont.owl#IndividualActivity> <http://webmind.dico.unimi.it/CARE/locont.owl#Soccer>)

/////////////////////// OBJECT number 2 ///////////////////////
ClassAssertion(<http://webmind.dico.unimi.it/CARE/locont.owl#Person> <http://webmind.dico.unimi.it/CARE/locont.owl#Paolo>)

/////////////////////// OBJECT number 3 ///////////////////////
ObjectPropertyAssertion(<http://webmind.dico.unimi.it/CARE/locont.owl#hasActor> <http://webmind.dico.unimi.it/CARE/locont.owl#Soccer> <http://webmind.dico.unimi.it/CARE/locont.owl#Paolo>)

/////////////////////// OBJECT number 4 ///////////////////////
ObjectPropertyAssertion(<http://webmind.dico.unimi.it/CARE/locont.owl#hasActor > <http://webmind.dico.unimi.it/CARE/locont.owl#Soccer> <http://webmind.dico.unimi.it/CARE/locont.owl#Marco>)

/////////////////////// OBJECT number 5 ///////////////////////
ClassAssertion(<http://webmind.dico.unimi.it/CARE/locont.owl#Person> <http://webmind.dico.unimi.it/CARE/locont.owl#Marco>)

___________END_ABOX___________

Честно говоря, я не могу понять, где моя ошибка, может ли кто-нибудь мне помочь?


person Giovanni Laganà    schedule 07.02.2018    source источник
comment
Предположение об открытом мире. Индивидуумы должны быть объявлены разными, иначе всегда будет модель, в которой все ваши индивидуумы sameAs друг друга, и ограничение exactly 1 будет выполняться.   -  person Ignazio    schedule 08.02.2018
comment
Кажется, что OWLDifferentIndividualsAxiom недостаточно для решения проблемы   -  person Giovanni Laganà    schedule 08.02.2018
comment
Обновление: я воссоздал ту же проблему на Protegè, и она сработала, я имею в виду, что она несовместима, как я и ожидал; значит проблема в джаве, может я что-то еще не так делаю?   -  person Giovanni Laganà    schedule 08.02.2018
comment
В коде вы вносите изменения в онтологию после создания аргумента. После внесения изменений вам нужно сбросить файл Reasoner, иначе он не увидит обновлений.   -  person Ignazio    schedule 08.02.2018
comment
В порядке! Наконец-то это сработало! Иньяцио, большое спасибо за помощь!   -  person Giovanni Laganà    schedule 08.02.2018


Ответы (1)


Вам нужно указать, что Марко и Паоло — разные личности. Без этой аксиомы ничто не мешает им быть одним и тем же и сохранять непротиворечивость онтологии.

person Dmitry Tsarkov    schedule 07.02.2018
comment
я сделал то, что вы сказали через OWLDifferentIndividualsAxiom, но он говорит, что все еще соответствует... - person Giovanni Laganà; 08.02.2018
comment
Смотрите мой другой комментарий. - person Ignazio; 08.02.2018