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