elk-reasoner/src/main/java/org/semanticweb/elk/reasoner/stages/ClassExpressionQueryState.java
Set<? extends Node<ElkClass>> getDirectSubClasses(
			final ElkClassExpression classExpression,
			final Taxonomy<ElkClass> taxonomy) throws ElkQueryException {

		final QueryState state = checkComputed(classExpression);
		if (state.node == null) {
			return null;
		}
		// else

		final Iterator<ElkClass> iter = state.node.iterator();
		if (iter.hasNext()) {
			final ElkClass cls = iter.next();
			return taxonomy.getNode(cls).getDirectSubNodes();
		}
		/*
		 * Else, if classExpression is not equivalent to any atomic class,
		 * direct atomic sub-classes of classExpression are atomic classes that
		 * have classExpression among their subsumers, but no other of their
		 * strict subsumers have classExpression among its subsumers.
		 */

		final Collection<? extends IndexedClass> allClasses = saturationState_
				.getOntologyIndex().getClasses();
		final Set<IndexedClass> strictSubclasses = new ArrayHashSet<IndexedClass>(
				allClasses.size());

		for (final IndexedClass ic : allClasses) {
			final Set<IndexedClassExpression> subsumers = ic.getContext()
					.getComposedSubsumers();
			if (subsumers.contains(state.indexed) && state.indexed.getContext()
					.getComposedSubsumers().size() != subsumers.size()) {
				// is subclass, but not equivalent
				strictSubclasses.add(ic);
			}
		}

		final Set<TaxonomyNode<ElkClass>> result = new ArrayHashSet<TaxonomyNode<ElkClass>>();

		for (final IndexedClass strictSubclass : strictSubclasses) {
			/*
			 * If some strict superclass of strictSubclass is a strict subclass
			 * of classExpression, strictSubclass is not direct.
			 * 
			 * It is sufficient to check only direct superclasses of
			 * strictSubclass.
			 */
			boolean isDirect = true;
			for (final TaxonomyNode<ElkClass> superNode : taxonomy
					.getNode(strictSubclass.getElkEntity())
					.getDirectSuperNodes()) {
				final IndexedClassExpression superClass = superNode
						.getCanonicalMember()
						.accept(resolvingExpressionConverter_);
				if (strictSubclasses.contains(superClass)) {
					isDirect = false;
					break;
				}
			}

			if (isDirect) {
				result.add(taxonomy.getNode(strictSubclass.getElkEntity()));
			}
		}

		if (result.isEmpty()) {
			/*
			 * No indexed class has classExpression among its subsumers and
			 * classExpression is not equivalent to any atomic class, so the
			 * only subclass of classExpression is Nothing and it is direct.
			 */
			result.add(taxonomy.getBottomNode());
		}
		return Collections.unmodifiableSet(result);
	}
Set<? extends Node<ElkClass>> getDirectSubClasses(
			final ElkClassExpression classExpression,
			final Taxonomy<ElkClass> taxonomy) throws ElkQueryException {

		final QueryState state = checkComputed(classExpression);
		if (state.node == null) {
			return null;
		}
		// else

		final Iterator<ElkClass> iter = state.node.iterator();
		if (iter.hasNext()) {
			final ElkClass cls = iter.next();
			return taxonomy.getNode(cls).getDirectSubNodes();
		}
		/*
		 * Else, if classExpression is not equivalent to any atomic class,
		 * direct atomic sub-classes of classExpression are atomic classes that
		 * have classExpression among their subsumers, but no other of their
		 * strict subsumers have classExpression among its subsumers.
		 */

		final Collection<? extends IndexedClass> allClasses = saturationState_
				.getOntologyIndex().getClasses();
		final Set<IndexedClass> strictSubclasses = new ArrayHashSet<IndexedClass>(
				allClasses.size());

		for (final IndexedClass ic : allClasses) {
			final Set<IndexedClassExpression> subsumers = ic.getContext()
					.getComposedSubsumers();
			if (subsumers.contains(state.indexed) && state.indexed.getContext()
					.getComposedSubsumers().size() != subsumers.size()) {
				// is subclass, but not equivalent
				strictSubclasses.add(ic);
			}
		}

		final Set<TaxonomyNode<ElkClass>> result = new ArrayHashSet<TaxonomyNode<ElkClass>>();

		for (final IndexedClass strictSubclass : strictSubclasses) {
			/*
			 * If some strict superclass of strictSubclass is a strict subclass
			 * of classExpression, strictSubclass is not direct.
			 * 
			 * It is sufficient to check only direct superclasses of
			 * strictSubclass.
			 */
			boolean isDirect = true;
			for (final TaxonomyNode<ElkClass> superNode : taxonomy
					.getNode(strictSubclass.getElkEntity())
					.getDirectSuperNodes()) {
				final IndexedClassExpression superClass = superNode
						.getCanonicalMember()
						.accept(resolvingExpressionConverter_);
				if (strictSubclasses.contains(superClass)) {
					isDirect = false;
					break;
				}
			}

			if (isDirect) {
				result.add(taxonomy.getNode(strictSubclass.getElkEntity()));
			}
		}

		if (result.isEmpty()) {
			/*
			 * No indexed class has classExpression among its subsumers and
			 * classExpression is not equivalent to any atomic class, so the
			 * only subclass of classExpression is Nothing and it is direct.
			 */
			result.add(taxonomy.getBottomNode());
		}
		return Collections.unmodifiableSet(result);
	}
Set < ? extends Node < ElkClass > > getDirectSubClasses ( final ElkClassExpression classExpression , final Taxonomy < ElkClass > taxonomy ) throws ElkQueryException { final QueryState state = checkComputed ( classExpression ) ; if ( state . node == null ) { return null ; } // else final Iterator < ElkClass > iter = state . node . iterator ( ) ; if ( iter . hasNext ( ) ) { final ElkClass cls = iter . next ( ) ; return taxonomy . getNode ( cls ) . getDirectSubNodes ( ) ; } /*
		 * Else, if classExpression is not equivalent to any atomic class,
		 * direct atomic sub-classes of classExpression are atomic classes that
		 * have classExpression among their subsumers, but no other of their
		 * strict subsumers have classExpression among its subsumers.
		 */ final Collection < ? extends IndexedClass > allClasses = saturationState_ . getOntologyIndex ( ) . getClasses ( ) ; final Set < IndexedClass > strictSubclasses = new ArrayHashSet < IndexedClass > ( allClasses . size ( ) ) ; for ( final IndexedClass ic : allClasses ) { final Set < IndexedClassExpression > subsumers = ic . getContext ( ) . getComposedSubsumers ( ) ; if ( subsumers . contains ( state . indexed ) && state . indexed . getContext ( ) . getComposedSubsumers ( ) . size ( ) != subsumers . size ( ) ) { // is subclass, but not equivalent strictSubclasses . add ( ic ) ; } } final Set < TaxonomyNode < ElkClass > > result = new ArrayHashSet < TaxonomyNode < ElkClass > > ( ) ; for ( final IndexedClass strictSubclass : strictSubclasses ) { /*
			 * If some strict superclass of strictSubclass is a strict subclass
			 * of classExpression, strictSubclass is not direct.
			 * 
			 * It is sufficient to check only direct superclasses of
			 * strictSubclass.
			 */ boolean isDirect = true ; for ( final TaxonomyNode < ElkClass > superNode : taxonomy . getNode ( strictSubclass . getElkEntity ( ) ) . getDirectSuperNodes ( ) ) { final IndexedClassExpression superClass = superNode . getCanonicalMember ( ) . accept ( resolvingExpressionConverter_ ) ; if ( strictSubclasses . contains ( superClass ) ) { isDirect = false ; break ; } } if ( isDirect ) { result . add ( taxonomy . getNode ( strictSubclass . getElkEntity ( ) ) ) ; } } if ( result . isEmpty ( ) ) { /*
			 * No indexed class has classExpression among its subsumers and
			 * classExpression is not equivalent to any atomic class, so the
			 * only subclass of classExpression is Nothing and it is direct.
			 */ result . add ( taxonomy . getBottomNode ( ) ) ; } return Collections . unmodifiableSet ( result ) ; }
Returns set of {@link Node}s containing all {@link ElkClass}es that are
direct strict sub-classes of the supplied class expression, if it is
satisfiable. Returns <code>null</code> otherwise. If the class expression
was not registered by {@link #registerQuery(ElkClassExpression)} or the
appropriate stage was not completed yet, throws {@link ElkQueryException}
.

@param classExpression
@param taxonomy
@return atomic direct strict sub-classes of the supplied class
expression, if it is satisfiable, otherwise <code>null</code>.
@throws ElkQueryException
if the result is not ready
Returns set of { @link Node } s containing all { @link ElkClass } es that are direct strict sub - classes of the supplied class expression if it is satisfiable . Returns <code > null< / code > otherwise . If the class expression was not registered by { @link #registerQuery ( ElkClassExpression ) } or the appropriate stage was not completed yet throws { @link ElkQueryException } .