Как найти самый специфический класс для человека с пеллетами + совлапи

Я хочу выполнить классификацию с онтологией и пеллетом. Пеллет имеет функцию (а именно, реализацию ()), чтобы найти наиболее конкретную для человека. Я пытался, но это не работает, кто-нибудь может помочь или привести примеры.

<Class rdf:about="http://webmind.dico.unimi.it/CARE/locont.owl#HavingDrink">
    <equivalentClass>
        <Class>
            <intersectionOf rdf:parseType="Collection">
                <rdf:Description rdf:about="http://webmind.dico.unimi.it/CARE/locont.owl#PersonalActivity"/>
                <Restriction>
                    <onProperty rdf:resource="http://webmind.dico.unimi.it/CARE/locont.owl#hasActor"/>
                    <allValuesFrom>
                        <Class>
                            <intersectionOf rdf:parseType="Collection">
                                <rdf:Description rdf:about="http://webmind.dico.unimi.it/CARE/locont.owl#Person"/>
                                <Restriction>
                                    <onProperty rdf:resource="http://webmind.dico.unimi.it/CARE/locont.owl#hasCurrentSymbolicLocation"/>
                                    <someValuesFrom rdf:resource="http://webmind.dico.unimi.it/CARE/locont.owl#Kitchen"/>
                                </Restriction>
                                <Restriction>
                                    <onProperty rdf:resource="http://webmind.dico.unimi.it/CARE/locont.owl#usingArtifact"/>
                                    <someValuesFrom>
                                        <Class>
                                            <unionOf rdf:parseType="Collection">
                                                <rdf:Description rdf:about="http://webmind.dico.unimi.it/CARE/locont.owl#CupsCupboard"/>
                                                <rdf:Description rdf:about="http://webmind.dico.unimi.it/CARE/locont.owl#Fridge"/>
                                            </unionOf>
                                        </Class>
                                    </someValuesFrom>
                                </Restriction>
                            </intersectionOf>
                        </Class>
                    </allValuesFrom>
                </Restriction>
            </intersectionOf>
        </Class>
    </equivalentClass>
    <rdfs:subClassOf rdf:resource="http://webmind.dico.unimi.it/CARE/locont.owl#PersonalActivity"/>
</Class>

Например, HaveDrink является одним из классов активности. Теперь я создаю человека и его ObjectProperty:

    String file = "file:///home/uqjwen/workspace/Owlapi/snapshot.owl#";
    OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
    OWLOntology ont = manager.loadOntology(IRI.create(file));
    OWLDataFactory fac = manager.getOWLDataFactory();

    PrefixManager pm = new DefaultPrefixManager(IRI.create("http://webmind.dico.unimi.it/CARE/locont.owl").toString());


    //////////create hasActor property///////////////////////////////////////
    OWLNamedIndividual currentActivity = fac.getOWLNamedIndividual("#alice_activity", pm);
    OWLNamedIndividual alice = fac.getOWLNamedIndividual("#alice", pm);
    OWLObjectProperty hasActor = fac.getOWLObjectProperty("#hasActor", pm);
    OWLObjectPropertyAssertionAxiom propertyAssertion = fac
            .getOWLObjectPropertyAssertionAxiom(hasActor,currentActivity,alice);
    manager.addAxiom(ont, propertyAssertion);

    ////////////create hasCurrentSymbolicLocation ////////
    OWLNamedIndividual kitchen = fac.getOWLNamedIndividual("#Kitchen", pm);

    OWLObjectProperty hasLocation = fac
            .getOWLObjectProperty("#hasCurrentSymbolicLocation", pm);
    OWLObjectPropertyAssertionAxiom locationAssertion = fac
            .getOWLObjectPropertyAssertionAxiom(hasLocation,alice,kitchen);
    manager.addAxiom(ont, locationAssertion);

    /////////////create using actifact  //////////////
    OWLNamedIndividual cc = fac.getOWLNamedIndividual("#cups_cupboard", pm);
    OWLObjectProperty usingArtifact = fac
            .getOWLObjectProperty("#usingArtifact", pm);
    OWLObjectPropertyAssertionAxiom artifactAssertion =fac
            .getOWLObjectPropertyAssertionAxiom(usingArtifact, alice, cc);
    manager.addAxiom(ont, artifactAssertion);

    OWLNamedIndividual fridge = fac.getOWLNamedIndividual("#fridge", pm);
    artifactAssertion =fac
            .getOWLObjectPropertyAssertionAxiom(usingArtifact, alice, fridge);
    manager.addAxiom(ont, artifactAssertion);


    //////////////reason 
    PelletReasoner reasoner = PelletReasonerFactory.getInstance().createReasoner( ont );
    System.out.println(reasoner.isConsistent());
    reasoner.getKB().classify();
    reasoner.getKB().realize();
    NodeSet<OWLClass> types = reasoner.getTypes(currentActivity, true);

он должен возвращать класс HaveDrink, но это не так.

2 ответа

Решение

Первое, что нужно проверить, это то, что онтология содержит классы и отдельных лиц, которых вы ожидаете, что она будет содержать - вы можете сделать это, сохранив онтологию в System.out в коде, чтобы вы были уверены в том, что загружено:

manager.saveOntology(ont, new SystemOutDocumentTarget());

Затем убедитесь, что IRI, разрешаемые менеджером префиксов, соответствуют IRI в онтологии:

OWLNamedIndividual currentActivity = fac.getOWLNamedIndividual("#alice_activity", pm);
System.put.println("expected individual "+currentActivity.getIRI());

После того, как эти возможные источники ошибок будут устранены, вам необходимо убедиться, что тип, который вы ожидаете, на самом деле выведен из онтологии - мы не можем увидеть остальную часть онтологии, и там может быть важная информация, которая может изменить ожидаемый результат,

Изменить: из онтологии, определение для HavingDrink (в функциональном синтаксисе) это:

EquivalentClasses(:HavingDrink ObjectIntersectionOf( ObjectAllValuesFrom(:hasActor ObjectIntersectionOf(:Person ObjectSomeValuesFrom(:hasCurrentSymbolicLocation :Kitchen) ObjectSomeValuesFrom(:usingArtifact ObjectUnionOf(:Fridge :CupsCupboard))) ) :PersonalActivity))

Для того, чтобы что-то было HavingDrink активность, она должна иметь значение для usingArtifact типа Fridge или же CupsCupboard, для которого я не вижу утверждений в вашей онтологии. Это довольно сложное определение, поэтому я бы начал проверять, alice_activity является экземпляром отдельных частей пересечения, и убедитесь, что каждая из них удовлетворена. Средний срок не удовлетворен, насколько я могу судить.

Благодаря Джошуа и Игнацио, наконец-то я нашел проблему. Когда я сам определил онтологию с протеже, она работала хорошо. Таким образом, я могу сделать вывод, что могут быть проблемы с определением онтологии здесь: webmind.di.unimi.it/care/snapshot.owl.

Другие вопросы по тегам