Я использую OWLAPI для различения guish между подклассами, которые просто заявлены , и теми, которые выведены . Мой код работает нормально, но он действительно медленный:
for(OWLClass clazz : ontology.getClassesInSignature())
{
for(OWLClass child: ontology.getClassesInSignature())
{
if(reasoner.isSatisfiable(child) )
{
NodeSet<OWLClass> subClasses = reasoner.getSubClasses(clazz, true);
OWLSubClassOfAxiom subAxiomTest = myModel.factory.getOWLSubClassOfAxiom(child, clazz);
if(!ontology.containsAxiom(subAxiomTest) && subClasses.containsEntity(child) && !clazz.isTopEntity())
{
//do something
}
}
}
}
Как видите, код медленный, потому что я сравниваю каждый класс со всеми остальными для каждой итерации.
Я не могу найти простой способ, как
NodeSet<OWLClass> subClasses = reasoner.getSubClasses(clazz, true);
, чтобы получить только предполагаемые.
Есть ли более эффективный способ сделать это?
РЕДАКТИРОВАТЬ:
Вот мое решение, которое значительно повышает производительность. Если у кого-то есть такая же проблема, он может попробовать это:
NodeSet<OWLClass> subClassesDerived = reasoner.getSubClasses(clazz, true);
for (OWLClass child : subClassesDerived.getFlattened()) {
if(reasoner.isSatisfiable(child) )
{
//Test axiom
OWLAxiom subAxiomTest = myModel.factory.getOWLSubClassOfAxiom(child, clazz);
if(!ontology.containsAxiom(subAxiomTest) && subClassesDerived.containsEntity(child) && !clazz.isTopEntity())
{
//subclass derived found - DO SOMETHING
}
}
}