Проверьте, является ли класс OWL доменом / диапазоном свойства

В примере hasProperty из хранилища owl-api:

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

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

OWLDataFactory dataFactory = manager.getOWLDataFactory();
OWLClassExpression restriction = dataFactory.getOWLObjectSomeValuesFrom(objectProperty, dataFactory.getOWLThing());
OWLClassExpression complement = dataFactory.getOWLObjectComplementOf(restriction);
OWLClassExpression intersection = dataFactory.getOWLObjectIntersectionOf(cls, complement);
boolean hasObjectProperty = !reasoner.isSatisfiable(intersection);

Я хочу знать, как проверить, является ли класс диапазоном свойства объекта и является ли он доменом свойства данных. Могу ли я использовать следующий фрагмент (на основе приведенного выше примера) для проверки доменов свойств данных?

OWLClassExpression restriction = dataFactory.getOWLDataSomeValuesFrom(dataProperty, dataFactory.getOWLThing());
OWLClassExpression complement = dataFactory.getOWLDataComplementOf(restriction);
OWLClassExpression intersection = dataFactory.getOWLDataIntersectionOf(cls, complement);
boolean hasDataProperty = !reasoner.isSatisfiable(intersection);

1 ответ

Решение

Пример не делает то, что вы ищете - он проверяет, нужно ли экземплярам класса иметь утверждение свойства с определенным свойством. Условие, которое вы пытаетесь проверить, является более слабым - независимо от того, определяется ли утверждение класса C как тип для субъекта (или объекта для случая диапазона) утверждения.

Это можно сделать более простым способом (как кодом, так и сложностью), проверяя, является ли домен свойства суперклассом интересующего вас класса, или, если вы хотите проверить, является ли класс C именно доменом, Вы можете проверить, эквивалентны ли эти два класса.

Пример:

OWLOntology o = ... //root ontology for the reasoner
OWLReasoner r = ...
OWLObjectProperty p = ...
for (OWLObjectPropertyDomainAxiom ax: o.getObjectPropertyDomainAxioms(p)) {
    OWLClassExpression c = ax.getDomain();
    NodeSet<OWLClass> allSubClasses = r.getSubClasses(c, false);
    Node<OWLClass> allEquivalentClasses = r.getEquivalentClasses(c);
}

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

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