Index: BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLQueryBuilderImpl.java
===================================================================
--- BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLQueryBuilderImpl.java (revision 55)
+++ BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLQueryBuilderImpl.java (revision 56)
@@ -255,7 +255,86 @@
 
 	public SClass[] listClasses(String[] graphURIs, boolean countInstances) throws Exception{
-
-		//TODO 
-		return null;
+		StringBuffer queryStr = new StringBuffer();
+		queryStr.append("PREFIX owl: <http://www.w3.org/2002/07/owl#>\n");
+		queryStr.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n");
+		queryStr.append("PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n");
+		if (countInstances) {
+			queryStr.append("SELECT DISTINCT ?cls ?pLabel (COUNT(?i) AS ?numOfInstances)\n");
+		} else {
+			queryStr.append("SELECT DISTINCT ?cls ?pLabel \n");
+		}
+
+		if (graphURIs != null) {
+			for (String graphURI : graphURIs) {
+				queryStr.append("FROM <");
+				queryStr.append(graphURI);
+				queryStr.append(">\n");
+			}
+		}
+		queryStr.append("WHERE{\n");
+		queryStr.append("\t{ ?cls rdf:type rdfs:Class. }\n");
+		queryStr.append("\tUNION\n");
+		queryStr.append("\t{ ?cls rdf:type owl:Class. }\n");
+		queryStr.append("\tUNION\n");
+		queryStr.append("\t{ [] rdfs:domain ?cls. }\n");
+		queryStr.append("\tUNION\n");
+		queryStr.append("\t{ [] rdfs:range ?cls. }\n");
+		queryStr.append("\tUNION\n");
+		queryStr.append("\t{ ?cls rdfs:subclassOf []. }\n");
+		queryStr.append("\t?cls rdfs:label ?pLabel.\n");
+		if (countInstances) {
+			queryStr.append("\t?i rdf:type ?c.\n");
+		}
+		if (countInstances) {
+			queryStr.append("}  GROUP BY ?c ?pLabel");
+		} else {
+			queryStr.append("}");
+		}
+		System.out.println(queryStr.toString());
+
+		Query query = QueryFactory.create(queryStr.toString());
+
+		
+		QueryExecution qexec = null;
+		try{
+			long start = System.currentTimeMillis();
+			qexec = QueryExecutionFactory.sparqlService(endpointURI,
+					query);
+			long end = System.currentTimeMillis();
+			System.out.println("EXEC TIME: " + (end-start));
+		}catch(Exception ex){
+			ex.printStackTrace();
+			throw ex;
+		}
+
+		ResultSet results = qexec.execSelect();
+		HashMap<String, SClass> classMap = new HashMap<String, SClass>();
+		for (; results.hasNext();) {
+			QuerySolution sol = results.next();
+			Resource res = sol.getResource("c");
+			if (res != null) {
+				String uri = res.getURI();
+				int numOfInstances = 0;
+				if (countInstances) {
+					numOfInstances = sol.getLiteral("numOfInstances").getInt();
+				}
+				// System.out.println(numOfInstances);
+				Literal labelLiteral = sol.getLiteral("pLabel");
+				SClass sClass = null;
+				if (classMap.containsKey(uri)) {
+					sClass = classMap.get(uri);
+				} else {
+					sClass = new SClass(uri, null, numOfInstances);
+					classMap.put(uri, sClass);
+				}
+				if (labelLiteral != null) {
+					String label = labelLiteral.getString();
+					String lang = labelLiteral.getLanguage();
+					sClass.addLabel(new Label(label, lang));
+				}
+			}
+		}
+		qexec.close();
+		return classMap.values().toArray(new SClass[0]);
 	}
 
