Как проверить, существует ли OWLObjectPropertyExpression между классами?
Предполагая два типа классов, один (A) "isManagedBy" другим (B). Следующая прорезанная сова иллюстрирует этот сценарий. Существует несколько классов типа A (которые "управляются" другими классами) и несколько классов B. Фактически, существует также иерархия между классами ботов типа A и B.
<owl:ObjectProperty rdf:about="#isManagedBy"/>
<owl:Class rdf:about="#FunctionManagement">
<rdfs:subClassOf rdf:resource="..."/>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#isManagedBy"/>
<owl:someValuesFrom rdf:resource="#SymposiumPlanner2013"/>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
<owl:Class rdf:about="#SymposiumPlanner2013"/>
...
Задача: получить все классы типа B, заданные произвольным классом A.
Идея: переберите все классы типа B. Для каждого класса B проверьте, имеет ли данный объект ObjectProperty "isManagedBy" (напрямую или унаследовано) для класса B, используя метод isSatisfiable() Reasoner's.
OWLObjectProperty objProp = df.getOWLObjectProperty(IRI.create("#isManagedBy"));
OWLClassExpression expression;
for (OWLClass B : SetOfAllBs) {
expression = df.getOWLObjectIntersectionOf(A, df.getOWLObjectSomeValuesFrom(objProp, B));
if (reasoner.isSatisfiable(expression)) {
// do something
}
}
К сожалению, рассуждатель возвращает удовлетворительное для всех классов типа B.
Вопрос: как решить эту проблему?
2 ответа
Я могу предложить два решения вашей проблемы:
Пройдите все B, но вместо этого проверьте выполнимость
A and (isManagedBy only (not B))
, Если это выражение неудовлетворительно для некоторого B, то такой B должен быть связан с данным A черезisManagedBy
,Если вы используете FaCT++ для рассуждений, вы можете использовать
OWLKnowledgeExplorerReasoner
интерфейс для исследования моделей, созданных в ходе проверки выполнимости класса A. Идея состоит в том, что если такой B присутствует в модели, то он должен быть связан с A. Существуют некоторые ограничения (он может не работать для B, определенных с помощью EquivalentClasses(B,...), это не всегда верно для недетерминированных меток (см. Флаг true в вызове getObjectLabel()), но есть идея. Код может выглядеть следующим образом:OWLReasoner factplusplus = new FactPlusPluReasonerFactore().createReasoner(o); OWLKnowledgeExplorerReasoner ke = (OWLKnowledgeExplorerReasoner) factplusplus; RootNode nodeForA = ke.getRoot(A); for (RootNode filler: ke.getObjectNeighbours(nodeForA, isManagedBy)) for (OWLClassExpression cls: ke.getObjectLabel(filler,true) if ( SetAllBs.contains(cls) ) /* cls is what you are looking for */
Вы не хотите проверять на удовлетворенность здесь, поскольку это только говорит вам, если вы сможете иметь экземпляр этого класса. То, что вы ищете, являются фактическими примерами этого. Поскольку может существовать иерархия классов, вы хотите использовать:
reasoner.getInstances(expression, false)
что даст вам прямые и косвенные случаи.
Изменить: из комментариев, похоже, что вы находитесь после подклассов A, которые находятся в домене isManagedBy, или для которых ограничения по isManagedBy имеют подклассы B в качестве диапазона.
Что-то вроде reasoner.getSubClasses(expression, false)
может быть ближе к тому, что вы ожидаете увидеть.