private void explainClassHierarchy(final OWLClass cls, final Node<OWLClass> eqClasses, final Set<OWLClass> visited) throws OWLException { if (visited.contains(cls)) { return; } visited.add(cls); visited.addAll(eqClasses.entities().collect(Collectors.toList())); for (final OWLClass eqClass : eqClasses) { _monitor.incrementProgress(); explainEquivalentClass(cls, eqClass); } _reasoner.getInstances(cls, true).entities().forEach(ind -> explainInstance(ind, cls)); final NodeSet<OWLClass> subClasses = _reasoner.getSubClasses(cls, true); final Map<OWLClass, Node<OWLClass>> subClassEqs = new HashMap<>(); for (final Node<OWLClass> equivalenceSet : subClasses) { if (equivalenceSet.isBottomNode()) { continue; } final OWLClass subClass = equivalenceSet.getRepresentativeElement(); subClassEqs.put(subClass, equivalenceSet); explainSubClass(subClass, cls); } for (final Map.Entry<OWLClass, Node<OWLClass>> entry : subClassEqs.entrySet()) { explainClassHierarchy(entry.getKey(), entry.getValue(), visited); } }