Проверьте, является ли класс 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);
}
Для области свойств данных вам просто нужно переключиться с объекта на свойства данных в примере, для диапазона свойств объекта вы будете искать аксиомы диапазона свойств объекта.