Index: BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLQueryBuilderImpl.java
===================================================================
--- BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLQueryBuilderImpl.java (revision 46)
+++ BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/OWLQueryBuilderImpl.java (revision 49)
@@ -73,4 +73,5 @@
 */
 
+
 		System.out.println("CLS");
 
@@ -95,10 +96,10 @@
 		}
 
+/*
 		
+		String uri = "http://purl.jp/bio/10/lsd/ontology/201209#EnglishEntry";
 		
+		ClassLink[] cls = null;
 		
-/*
-		uri = "http://purl.jp/bio/10/lsd/ontology/201209#EnglishEntry";
-
 		System.out.println("CLS-INS");
 		cls = null;
@@ -356,5 +357,5 @@
 		// SELECT
 		if (countLinks) {
-			queryStr.append("SELECT DISTINCT ?p ?pDirection ?c (COUNT(?s) AS ?numOfLinks) (COUNT(DISTINCT(?s)) AS ?numOfLinkedInstances) \n");
+			queryStr.append("SELECT DISTINCT ?p ?pDirection ?c (COUNT(?oci) AS ?numOfOriginalClassInstances) (COUNT(?lci) AS ?numOfLinkedClassInstances) (COUNT(?s) AS ?numOfLinks) (COUNT(DISTINCT(?s)) AS ?numOfLinkedInstances) \n");
 		} else {
 			queryStr.append("SELECT DISTINCT ?p ?pDirection ?c \n");
@@ -477,5 +478,5 @@
 				}
 				ClassLink cl = new ClassLink(proURI, clsURI, direction,
-						numOfLinks, 0, 0 );
+						numOfLinks, 0, 0, 0, 0 );
 				solCLs.add(cl);
 			}
@@ -509,5 +510,5 @@
 		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");
-		queryStr.append("SELECT DISTINCT ?pf ?pr ?c \n");
+		queryStr.append("SELECT DISTINCT ?pf ?pr (COUNT(?pf) AS ?numOfForwardLinks) (COUNT(?pr) AS ?numOfReverseLinks) (COUNT(DISTINCT(?insOrg)) AS ?numOfOriginInstances) (COUNT(DISTINCT(?ins)) AS ?numOfLinkedInstances)  ?c \n");
 		if (graphURIs != null) {
 			for (String graphURI : graphURIs) {
@@ -524,4 +525,5 @@
 		queryStr.append("  { ?ins ?pr ?insOrg. }\n  UNION { ?insOrg ?pf ?ins. }\n");
 		queryStr.append("}\n");
+		queryStr.append("GROUP BY ?pf ?pr ?c\n");
 		if (limit > 0) {
 			queryStr.append("limit ");
@@ -536,5 +538,15 @@
 				query);
 
-		ResultSet results = qexec.execSelect();
+		ResultSet results = null;
+		try{
+			long start = System.currentTimeMillis();
+			results = qexec.execSelect();
+			long end = System.currentTimeMillis();
+			System.out.println("EXEC TIME: " + (end-start));
+		}catch(Exception ex){
+			ex.printStackTrace();
+			throw ex;
+		}
+
 		ArrayList<ClassLink> solCLs = new ArrayList<ClassLink>();
 		for (; results.hasNext();) {
@@ -545,8 +557,18 @@
 			Direction direction = null;
 			String propURI = null;
+			int numOfLinks = 0;
+			int numOfLinkedInstances = 0;
+			int numOfOriginInstances = 0;
 			if (proForward != null) {
 				if (proReverse != null) {
+					numOfLinks = sol.getLiteral("numOfForwardLinks").getInt();
+					numOfLinks += sol.getLiteral("numOfReverseLinks").getInt();
+					numOfLinkedInstances = sol.getLiteral("numOfLinkedInstances").getInt();
+					numOfOriginInstances = sol.getLiteral("numOfOriginInstances").getInt();
 					direction = Direction.both;
 				} else {
+					numOfLinkedInstances = sol.getLiteral("numOfLinkedInstances").getInt();
+					numOfOriginInstances = sol.getLiteral("numOfOriginInstances").getInt();
+					numOfLinks = sol.getLiteral("numOfForwardLinks").getInt();
 					direction = Direction.forward;
 				}
@@ -555,9 +577,12 @@
 				direction = Direction.reverse;
 				propURI = proReverse.getURI();
+				numOfLinkedInstances = sol.getLiteral("numOfOriginInstances").getInt();
+				numOfOriginInstances = sol.getLiteral("numOfLinkedInstances").getInt();
+				numOfLinks = sol.getLiteral("numOfReverseLinks").getInt();
 			}
 			String clsURI = cls.getURI();
 			// System.out.println(propURI + " " + clsURI + " " + direction);
 
-			ClassLink cl = new ClassLink(propURI, clsURI, direction, 0, 0, 0);
+			ClassLink cl = new ClassLink(propURI, clsURI, direction, numOfLinks, numOfOriginInstances, numOfLinkedInstances, 0, 0);
 			solCLs.add(cl);
 		}
@@ -834,10 +859,128 @@
 					classLink.setNumOfOriginInstances(numOfOriginInstances);
 				}
+				lit = sol.getLiteral("numOfOriginClassInstances");
+				if (lit != null) {
+					int numOfOriginClassInstances = lit.getInt();
+					classLink.setNumOfOriginClassInstances(numOfOriginClassInstances);
+				}
+				lit = sol.getLiteral("numOfLinkedClassInstances");
+				if (lit != null) {
+					int numOfLinkedClassInstances = lit.getInt();
+					classLink.setNumOfLinkedClassInstances(numOfLinkedClassInstances);
+				}
 			}
 			qexec.close();
+
+			// count instances
+			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");
+
+			queryStr.append("SELECT (COUNT(?ics) AS ?numOfOriginClassInstances) \n");
+			if (graphURIs != null) {
+				for (String graphURI : graphURIs) {
+					queryStr.append("FROM <");
+					queryStr.append(graphURI);
+					queryStr.append(">\n");
+				}
+			}
+
+			queryStr.append("WHERE{\n");
+			if (classLink.getDirection() == Direction.forward) {
+				queryStr.append("?ics rdf:type  <");
+				queryStr.append(startClassURI);
+				queryStr.append(">.\n");
+				queryStr.append("}");
+			} else {
+				if (classLink.getDirection() == Direction.forward) {
+					queryStr.append("?ics rdf:type  <");
+					queryStr.append(classLink.getLinkedClassURI());
+					queryStr.append(">.\n");
+					queryStr.append("}");
+				} else {
+					queryStr.append("?ics rdf:type  <");
+					queryStr.append(classLink.getLinkedClassURI());
+					queryStr.append(">.\n");
+					queryStr.append("}");
+				}
+			}
+	
+			System.out.println(queryStr.toString());
+
+			query = QueryFactory.create(queryStr.toString());
+			qexec = QueryExecutionFactory.sparqlService(
+					endpointURI, query);
+
+			results = qexec.execSelect();
+			if (results.hasNext()) {
+				QuerySolution sol = results.next();
+				Literal lit = null;
+				lit = sol.getLiteral("numOfOriginClassInstances");
+				if (lit != null) {
+					int numOfOriginClassInstances = lit.getInt();
+					classLink.setNumOfOriginClassInstances(numOfOriginClassInstances);
+				}
+			}
+			qexec.close();
+
+			// count instances
+			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");
+
+			queryStr.append("SELECT (COUNT(?ocs) AS ?numOfLinkedClassInstances) \n");
+			if (graphURIs != null) {
+				for (String graphURI : graphURIs) {
+					queryStr.append("FROM <");
+					queryStr.append(graphURI);
+					queryStr.append(">\n");
+				}
+			}
+
+			queryStr.append("WHERE{\n");
+			if (classLink.getDirection() == Direction.forward) {
+				queryStr.append("?ocs rdf:type  <");
+				queryStr.append(classLink.getLinkedClassURI());
+				queryStr.append(">.\n");
+				queryStr.append("}");
+			} else {
+				if (classLink.getDirection() == Direction.forward) {
+					queryStr.append("?ocs rdf:type  <");
+					queryStr.append(startClassURI);
+					queryStr.append(">.\n");
+					queryStr.append("}");
+				} else {
+					queryStr.append("?ocs rdf:type  <");
+					queryStr.append(startClassURI);
+					queryStr.append(">.\n");
+					queryStr.append("}");
+				}
+			}
+	
+			System.out.println(queryStr.toString());
+
+			query = QueryFactory.create(queryStr.toString());
+			qexec = QueryExecutionFactory.sparqlService(
+					endpointURI, query);
+
+			results = qexec.execSelect();
+			if (results.hasNext()) {
+				QuerySolution sol = results.next();
+				Literal lit = null;
+				lit = sol.getLiteral("numOfLinkedClassInstances");
+				if (lit != null) {
+					int numOfLinkedClassInstances = lit.getInt();
+					classLink.setNumOfLinkedClassInstances(numOfLinkedClassInstances);
+				}
+			}
+			qexec.close();
+			
 		}
 		return classLinks;
 	}
 
+	
 	public SClass[] countInstances(String[] graphURIs, SClass[] classes)
 			throws Exception {
Index: BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/ClassLink.java
===================================================================
--- BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/ClassLink.java (revision 46)
+++ BH13SPARQLBuilder/src/org/biohackathon/SPARQLBuilder/OWL/ClassLink.java (revision 49)
@@ -15,4 +15,6 @@
 	private int numOfLinkedInstances = 0;
 	private int numOfOriginInstances = 0;
+	private int numOfOriginClassInstances = 0;
+	private int numOfLinkedClassInstances = 0;
 	
 	/**
@@ -26,5 +28,7 @@
 	 * @since 28.01.2014
 	 */
-	public ClassLink(String propertyURI, String linkedClassURI, Direction direction, int numLinks, int numofOriginInstances, int numOfLinkedInstances){
+	public ClassLink(String propertyURI, String linkedClassURI, Direction direction, 
+				int numLinks, int numOfOriginInstances, int numOfLinkedInstances,
+				int numOfOriginClassInstances, int numofLinkedClassInstances){
 		this.propertyURI = propertyURI;
 		this.linkedClassURI = linkedClassURI;
@@ -33,4 +37,6 @@
 		this.numOfLinkedInstances = numOfLinkedInstances;
 		this.numOfOriginInstances = numOfOriginInstances;
+		this.numOfOriginClassInstances = numOfOriginClassInstances;
+		this.numOfLinkedClassInstances = numofLinkedClassInstances;
 	}
 	
@@ -69,7 +75,20 @@
 		sb.append(linkedClassURI);
 		sb.append(" [");
+		sb.append(numOfOriginInstances);
+		sb.append("/");
+		sb.append(numOfOriginClassInstances);
+		sb.append("]縲---");
+
+		
+		sb.append(" [");
 		sb.append(numOfLinks);
+		sb.append("] --->");
+
+		sb.append(" [");
+		sb.append(numOfLinkedInstances);
+		sb.append("/");
+		sb.append(numOfLinkedClassInstances);
 		sb.append("]");
-		return sb.toString();
+return sb.toString();
 	}
 	
@@ -110,4 +129,24 @@
 		this.numOfOriginInstances = numOfOriginInstances;
 	}
+
+
+	public final int getNumOfOriginClassInstances() {
+		return numOfOriginClassInstances;
+	}
+
+
+	public final void setNumOfOriginClassInstances(int numOfOriginClassInstances) {
+		this.numOfOriginClassInstances = numOfOriginClassInstances;
+	}
+
+
+	public final int getNumOfLinkedClassInstances() {
+		return numOfLinkedClassInstances;
+	}
+
+
+	public final void setNumOfLinkedClassInstances(int numOfLinkedClassInstances) {
+		this.numOfLinkedClassInstances = numOfLinkedClassInstances;
+	}
 		
 
