code: private static DefaultDirectedGraph<DataPropertyExpression,DefaultEdge> getDataPropertyGraph(OntologyImpl.UnclassifiedOntologyTBox ontology) {
  
  		DefaultDirectedGraph<DataPropertyExpression,DefaultEdge> graph = new DefaultDirectedGraph<>(DefaultEdge.class);
  
  		for (DataPropertyExpression role : ontology.dataProperties())
  			if (!role.isBottom() && !role.isTop())
  				graph.addVertex(role);
  
          DataPropertyExpression top = null;
  		for (BinaryAxiom<DataPropertyExpression> roleIncl : ontology.getSubDataPropertyAxioms()) {
  		    if (roleIncl.getSub().isBottom() || roleIncl.getSuper().isTop())
  		        continue;
  		    if (roleIncl.getSuper().isBottom()) {
                  throw new RuntimeException("BOT cannot occur on the LHS - replaced by DISJ");
              }
              if (roleIncl.getSub().isTop()) {
                  top = roleIncl.getSub();
                  graph.addVertex(top);
              }
              graph.addEdge(roleIncl.getSub(), roleIncl.getSuper());
          }
  
          if (top != null) {
              for (DataPropertyExpression dpe : graph.vertexSet())
                  graph.addEdge(dpe, top);
          }
  
  		return graph;
  	}
docs: graph representation of data property inclusions in the ontology
  
  adds inclusions between the inverses of R and S if
  R is declared a sub-property of S in the ontology
  
  @param ontology
  @return the graph of the property inclusions