From: <jen...@us...> - 2008-01-29 17:34:22
|
Revision: 456 http://dl-learner.svn.sourceforge.net/dl-learner/?rev=456&view=rev Author: jenslehmann Date: 2008-01-29 09:34:13 -0800 (Tue, 29 Jan 2008) Log Message: ----------- - rewrote SPARQL query - added method to cache for executing a SPARQL query (result is either taken from cache or query is send) Modified Paths: -------------- trunk/src/dl-learner/org/dllearner/kb/sparql/SparqlKnowledgeSource.java trunk/src/dl-learner/org/dllearner/kb/sparql/TypedSparqlQuery.java trunk/src/dl-learner/org/dllearner/kb/sparql/query/Cache.java trunk/src/dl-learner/org/dllearner/kb/sparql/query/CachedSparqlQuery.java trunk/src/dl-learner/org/dllearner/kb/sparql/query/SparqlQuery.java trunk/src/dl-learner/org/dllearner/kb/sparql/test/JenaQueryToResultSpeedTest.java trunk/src/dl-learner/org/dllearner/kb/sparql/test/TestResultSet.java trunk/src/dl-learner/org/dllearner/server/DLLearnerWS.java Removed Paths: ------------- trunk/src/dl-learner/org/dllearner/kb/sparql/query/CachedSparqlQueryTest.java Modified: trunk/src/dl-learner/org/dllearner/kb/sparql/SparqlKnowledgeSource.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/SparqlKnowledgeSource.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/SparqlKnowledgeSource.java 2008-01-29 17:34:13 UTC (rev 456) @@ -46,8 +46,6 @@ import org.dllearner.core.dl.KB; import org.dllearner.kb.sparql.configuration.SparqlEndpoint; import org.dllearner.kb.sparql.configuration.SparqlQueryType; -import org.dllearner.kb.sparql.query.Cache; -import org.dllearner.kb.sparql.query.CachedSparqlQueryTest; import org.dllearner.kb.sparql.query.SparqlQuery; import org.dllearner.parser.KBParser; import org.dllearner.reasoning.DIGConverter; @@ -398,8 +396,10 @@ public SparqlQuery sparqlQuery(String query) { this.endpoint = new SparqlEndpoint(url, defaultGraphURIs, namedGraphURIs); - if (cached) return new CachedSparqlQueryTest(endpoint, new Cache("cache"),""+query.hashCode(),query); - else return new SparqlQuery(query, endpoint); +// if (cached) +// return new CachedSparqlQueryTest(endpoint, new Cache("cache"),""+query.hashCode(),query); +// else + return new SparqlQuery(query, endpoint); } /*public static void main(String[] args) throws MalformedURLException { Modified: trunk/src/dl-learner/org/dllearner/kb/sparql/TypedSparqlQuery.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/TypedSparqlQuery.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/TypedSparqlQuery.java 2008-01-29 17:34:13 UTC (rev 456) @@ -27,7 +27,6 @@ import org.dllearner.kb.sparql.configuration.Configuration; import org.dllearner.kb.sparql.query.Cache; import org.dllearner.kb.sparql.query.CachedSparqlQuery; -import org.dllearner.kb.sparql.query.SparqlQuery; import org.dllearner.utilities.StringTuple; import com.hp.hpl.jena.query.ResultSet; @@ -230,13 +229,6 @@ return xml; } - @Deprecated - public String sendAndReceiveSPARQL(String queryString) { - // SparqlQuery sq=new SparqlQuery(configuration.getSparqlEndpoint()); - return new SparqlQuery(queryString, configuration.getSparqlEndpoint()) - .getAsXMLString(); - } - public void p(String str) { if (print_flag) { System.out.println(str); Modified: trunk/src/dl-learner/org/dllearner/kb/sparql/query/Cache.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/query/Cache.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/query/Cache.java 2008-01-29 17:34:13 UTC (rev 456) @@ -28,30 +28,34 @@ import java.net.URLEncoder; import java.util.HashMap; +import com.hp.hpl.jena.query.ResultSet; + /** * SPARQL query cache to avoid possibly expensive multiple queries. An object of * this class can be the cache itself or a cache object(one entry), We could * split that in two classes, but one entry o object only has contains data and * one additional function and would just be a data class + * TODO: decipher previous sentence * * it writes the files according to one resource in the basedir and saves the * cache object in it. Filename is the subject, a resource * e.g. http://dbpedia.org/resource/Angela_Merkel which is first urlencoded * and so serves as the hash for the filename. + * TODO: Why not just take some hash of the SPARQL query itself? * * the cache object in the file remembers: a timestamp, * a hashmap SparqlQuery -> SparqlXMLResult * Cache validates if timestamp too old and Sparql-Query the same * before returning the SPARQL xml-result + * TODO: it is not JSON, not XML is it? * * @author Sebastian Hellmann * @author Sebastian Knappe + * @author Jens Lehmann */ public class Cache implements Serializable { - /** - * This maps sparql query to sparql result - */ + // maps SPARQL queries to JSON represenation of results protected HashMap<String, String> hm; final static long serialVersionUID = 104; @@ -232,4 +236,23 @@ return false; } + /** + * Takes a SPARQL query (which has not been evaluated yet) as + * argument and returns a result set. The result set is taken from + * this cache if the query is stored here. Otherwise the query is + * send and its result added to the cache and returned. + * + * @param query The SPARQL query. + * @return Jena result set. + */ + public ResultSet executeSparqlQuery(SparqlQuery query) { + if(hm.containsKey(query.getQueryString())) { + String result = hm.get(query.getQueryString()); + return SparqlQuery.JSONtoResultSet(result); + } else { + query.send(); + return query.getResultSet(); + } + } + } Modified: trunk/src/dl-learner/org/dllearner/kb/sparql/query/CachedSparqlQuery.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/query/CachedSparqlQuery.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/query/CachedSparqlQuery.java 2008-01-29 17:34:13 UTC (rev 456) @@ -8,9 +8,12 @@ * Does the same as SparqlQuery, but uses the cache. key should be an uri or * something that can be mapped to a file see cache * + * Do not use this class anymore, but use Cache.executeSparqlQuery instead. + * * @author Jens Lehmann * */ +@Deprecated public class CachedSparqlQuery { String key; @@ -52,7 +55,8 @@ // if not in cache get it from EndPoint if (FromCache == null) { // configuration.increaseNumberOfuncachedSparqlQueries(); - xml = this.sparqlQuery.getAsXMLString(); + ResultSet rs = sparqlQuery.send(); + xml = SparqlQuery.getAsXMLString(rs); // sendAndReceiveSPARQL(sparql); // p(sparql); // System.out.println(xml); @@ -92,7 +96,8 @@ // if not in cache get it from EndPoint if (FromCache == null) { // configuration.increaseNumberOfuncachedSparqlQueries(); - JSON = this.sparqlQuery.getAsJSON(); + ResultSet rs = sparqlQuery.send(); + JSON = SparqlQuery.getAsJSON(rs); System.out.println(JSON); // sendAndReceiveSPARQL(sparql); // p(sparql); Deleted: trunk/src/dl-learner/org/dllearner/kb/sparql/query/CachedSparqlQueryTest.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/query/CachedSparqlQueryTest.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/query/CachedSparqlQueryTest.java 2008-01-29 17:34:13 UTC (rev 456) @@ -1,37 +0,0 @@ -package org.dllearner.kb.sparql.query; - -import org.dllearner.kb.sparql.configuration.SparqlEndpoint; - -/** - * Does the same as SparqlQuery, but uses the cache. key should be an uri or - * something that can be mapped to a file see cache - * - * @author Sebastian Knappe - * - */ -public class CachedSparqlQueryTest extends SparqlQuery { - - private Cache cache; - private String key; - - public CachedSparqlQueryTest(SparqlEndpoint endpoint, Cache cache, String key, - String queryString) { - super(queryString,endpoint); - this.cache = cache; - this.key = key; - } - - public void send() - { - String FromCache = cache.get(key, queryString); - - // if not in cache get it from EndPoint - if (FromCache == null) { - super.send(); - this.cache.put(key, queryString, getAsJSON()); - } else { - this.rs=SparqlQuery.JSONtoResultSet(FromCache); - System.out.println("FROM CACHE"); - } - } -} Modified: trunk/src/dl-learner/org/dllearner/kb/sparql/query/SparqlQuery.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/query/SparqlQuery.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/query/SparqlQuery.java 2008-01-29 17:34:13 UTC (rev 456) @@ -24,12 +24,10 @@ import java.nio.charset.Charset; import java.util.Iterator; import java.util.List; -import java.util.Vector; import org.apache.log4j.Logger; import org.dllearner.kb.sparql.SparqlKnowledgeSource; import org.dllearner.kb.sparql.configuration.SparqlEndpoint; -import org.dllearner.utilities.StringTuple; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.query.ResultSetFactory; @@ -38,22 +36,23 @@ import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP; /** - * Represents one SPARQL query. It includes support for stopping the SPARQL query - * (which may be necessary if a timeout is reached). + * Represents one SPARQL query. It includes support for stopping the SPARQL + * query (which may be necessary if a timeout is reached). * * @author Jens Lehmann * */ public class SparqlQuery { - private static Logger logger = Logger - .getLogger(SparqlKnowledgeSource.class); - - protected boolean isRunning = false; + private static Logger logger = Logger.getLogger(SparqlKnowledgeSource.class); + + private boolean isRunning = false; + // TODO: declare as private protected String queryString; - protected QueryEngineHTTP queryExecution; - protected SparqlEndpoint endpoint; - protected ResultSet rs=null; + private QueryEngineHTTP queryExecution; + private SparqlEndpoint endpoint; + // TODO: declare as private + protected ResultSet rs = null; /** * Standard constructor. @@ -66,32 +65,34 @@ this.endpoint = endpoint; } - public void setIsRunning(boolean running){ - this.isRunning=running; + @Deprecated + public void setIsRunning(boolean running) { + this.isRunning = running; } - + /** - * method used for sending over Jena - * @return jena ResultSet + * Sends a SPARQL query using the Jena library. */ - public void send() { + public ResultSet send() { + isRunning = true; logger.info(queryString); - + String service = endpoint.getURL().toString(); logger.info(endpoint.getURL().toString()); // Jena access to SPARQL endpoint - queryExecution=new QueryEngineHTTP(service,queryString); - for (String dgu : endpoint.getDefaultGraphURIs()){ + queryExecution = new QueryEngineHTTP(service, queryString); + for (String dgu : endpoint.getDefaultGraphURIs()) { queryExecution.addDefaultGraph(dgu); } - for (String ngu : endpoint.getNamedGraphURIs()){ + for (String ngu : endpoint.getNamedGraphURIs()) { queryExecution.addNamedGraph(ngu); } logger.info("query SPARQL server"); - - + rs = queryExecution.execSelect(); logger.info(rs.getResultVars().toString()); + isRunning = false; + return rs; } public void stop() { @@ -99,46 +100,62 @@ isRunning = false; } + public String getQueryString() { + return queryString; + } + + public ResultSet getResultSet() { + return rs; + } + public boolean isRunning() { return isRunning; } + + public boolean hasCompleted() { + return (rs != null); + } /** * TODO define the format + * * @return */ - @SuppressWarnings({"unchecked"}) - public String[][] getAsStringArray(){ - if (rs==null) this.send(); + @Deprecated + @SuppressWarnings( { "unchecked" }) + public String[][] getAsStringArray() { + if (rs == null) + this.send(); System.out.println("Starting Query"); List<ResultBinding> l = ResultSetFormatter.toList(rs); - List<String> resultVars=rs.getResultVars(); - String[][] array=new String[l.size()][resultVars.size()]; - Iterator<String> iter=resultVars.iterator(); - int i=0,j=0; - + List<String> resultVars = rs.getResultVars(); + String[][] array = new String[l.size()][resultVars.size()]; + Iterator<String> iter = resultVars.iterator(); + int i = 0, j = 0; + for (ResultBinding resultBinding : l) { - while (iter.hasNext()){ - String varName=(String)iter.next(); - array[i][j]=resultBinding.get(varName).toString(); + while (iter.hasNext()) { + String varName = (String) iter.next(); + array[i][j] = resultBinding.get(varName).toString(); j++; } - iter=resultVars.iterator(); + iter = resultVars.iterator(); i++; - j=0; + j = 0; } System.out.println("Query complete"); return array; } - + /** * sends a query and returns XML * * @return String xml */ - public String getAsXMLString() { - if (rs==null) this.send(); - return ResultSetFormatter.asXMLString(rs); + public static String getAsXMLString(ResultSet resultSet) { + //if (rs == null) + // this.send(); + return ResultSetFormatter.asXMLString(resultSet); } /** @@ -147,67 +164,42 @@ * * @return jena List<ResultBinding> */ - @SuppressWarnings({"unchecked"}) + @Deprecated + @SuppressWarnings( { "unchecked" }) public List<ResultBinding> getAsList() { - if (rs==null) this.send(); + if (rs == null) + this.send(); return ResultSetFormatter.toList(rs); } /** - * sends a query and returns the results for two variables - * ex: getAsVectorOfTupels("predicate", "object") - * TODO untested and not used, feel free to change + * Converts Jena result set to JSON. * - * @param varName1 - * @param varName2 - * @return Vector<StringTuple> + * @param resultSet The result set to transform. + * @return JSON representation of the result set. */ - @SuppressWarnings({"unchecked"}) - @Deprecated - public Vector<StringTuple> getAsVectorOfTupels(String varName1, - String varName2) { - Vector<StringTuple> vret = new Vector<StringTuple>(); - List<ResultBinding> l = ResultSetFormatter.toList(rs); - //System.out.println(l); - //System.out.println(ResultSetFormatter.asXMLString(rs)); - for (ResultBinding resultBinding : l) { - - vret.add(new StringTuple(resultBinding.get(varName1).toString(), - resultBinding.get(varName2).toString())); - } - return vret; - } - - /** - * sends a query and returns JSON - * @return a String representation of the Resultset as JSON - */ - public String getAsJSON(){ - if (rs==null) this.send(); - ByteArrayOutputStream baos=new ByteArrayOutputStream(); - ResultSetFormatter.outputAsJSON(baos, rs); + public static String getAsJSON(ResultSet resultSet) { + // if (rs == null) + // this.send(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ResultSetFormatter.outputAsJSON(baos, resultSet); // possible Jena bug: Jena modifies the result set during // JSON transformation, so we need to get it back - rs=JSONtoResultSet(baos.toString()); + resultSet = JSONtoResultSet(baos.toString()); return baos.toString(); } - + /** - * @param json a string representation string object - * @return jena ResultSet + * Converts from JSON to internal Jena format. + * + * @param json + * A JSON representation if a SPARQL query result. + * @return A Jena ResultSet. */ - public static ResultSet JSONtoResultSet(String json){ - ResultSet rs=null; - try{ - ByteArrayInputStream bais=new ByteArrayInputStream(json.getBytes(Charset.forName("UTF-8"))); - rs=ResultSetFactory.fromJSON(bais); - }catch (Exception e) {e.printStackTrace();} - return rs; - + public static ResultSet JSONtoResultSet(String json) { + ByteArrayInputStream bais = new ByteArrayInputStream(json + .getBytes(Charset.forName("UTF-8"))); + return ResultSetFactory.fromJSON(bais); } - - public String getQueryString() { - return queryString; - } } Modified: trunk/src/dl-learner/org/dllearner/kb/sparql/test/JenaQueryToResultSpeedTest.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/test/JenaQueryToResultSpeedTest.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/test/JenaQueryToResultSpeedTest.java 2008-01-29 17:34:13 UTC (rev 456) @@ -22,7 +22,9 @@ import org.dllearner.kb.sparql.configuration.SparqlEndpoint; import org.dllearner.kb.sparql.query.SparqlQuery; +import com.hp.hpl.jena.query.ResultSet; + public class JenaQueryToResultSpeedTest { static boolean print_flag=false; @@ -51,12 +53,14 @@ SparqlEndpoint sse = SparqlEndpoint.dbpediaEndpoint(); SparqlQuery sqJena = new SparqlQuery(queryString, sse); // first query is not counted - sqJena.getAsXMLString(); + ResultSet rs = sqJena.send(); + SparqlQuery.getAsXMLString(rs); long now = System.currentTimeMillis(); long tmp = now; for (int i = 0; i < howOften; i++) { - sqJena.getAsXMLString(); + rs = sqJena.send(); + SparqlQuery.getAsXMLString(rs); p("Jena as XML needed: " + (System.currentTimeMillis() - tmp)); tmp = System.currentTimeMillis(); @@ -92,12 +96,14 @@ SparqlEndpoint sse = SparqlEndpoint.dbpediaEndpoint(); SparqlQuery sqJena = new SparqlQuery(queryString, sse); // first query is not counted - sqJena.getAsJSON(); + ResultSet rs = sqJena.send(); + SparqlQuery.getAsJSON(rs); long now = System.currentTimeMillis(); long tmp = now; for (int i = 0; i < howOften; i++) { - sqJena.getAsJSON(); + rs = sqJena.send(); + SparqlQuery.getAsJSON(rs); p("Jena as JSON needed: " + (System.currentTimeMillis() - tmp)); tmp = System.currentTimeMillis(); @@ -113,13 +119,16 @@ SparqlEndpoint sse = SparqlEndpoint.dbpediaEndpoint(); SparqlQuery sqJena = new SparqlQuery(queryString, sse); // first query is not counted - sqJena.getAsJSON(); + ResultSet rs = sqJena.send(); + SparqlQuery.getAsJSON(rs); long now = System.currentTimeMillis(); long tmp = now; for (int i = 0; i < howOften; i++) { // System.out.println(sqJena.getAsJSON()); - SparqlQuery.JSONtoResultSet(sqJena.getAsJSON()); + rs = sqJena.send(); + String json = SparqlQuery.getAsJSON(rs); + SparqlQuery.JSONtoResultSet(json); p("Jena as JSON and back needed: " + (System.currentTimeMillis() - tmp)); tmp = System.currentTimeMillis(); @@ -137,7 +146,8 @@ SparqlQuery sqJena = new SparqlQuery(queryString, sse); // SparqlQueryConventional sqConv=new SparqlQueryConventional(sse); - System.out.println(sqJena.getAsXMLString()); + ResultSet rs = sqJena.send(); + System.out.println(SparqlQuery.getAsXMLString(rs)); // System.out.println(sqConv.getAsXMLString("")); } Modified: trunk/src/dl-learner/org/dllearner/kb/sparql/test/TestResultSet.java =================================================================== --- trunk/src/dl-learner/org/dllearner/kb/sparql/test/TestResultSet.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/kb/sparql/test/TestResultSet.java 2008-01-29 17:34:13 UTC (rev 456) @@ -28,6 +28,7 @@ import org.dllearner.kb.sparql.configuration.SparqlEndpoint; import org.dllearner.kb.sparql.query.SparqlQuery; +import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.sparql.core.ResultBinding; public class TestResultSet { @@ -43,7 +44,8 @@ SparqlEndpoint sse = SparqlEndpoint.dbpediaEndpoint(); SparqlQuery sqJena = new SparqlQuery(queryString, sse); - String json=sqJena.getAsJSON(); + ResultSet rs = sqJena.send(); + String json = SparqlQuery.getAsJSON(rs); System.out.println(json); @@ -107,12 +109,14 @@ } System.out.println("Conv total: " + (System.currentTimeMillis() - now)); // first query is not counted - sqJena.getAsXMLString(); + ResultSet rs = sqJena.send(); + SparqlQuery.getAsXMLString(rs); now = System.currentTimeMillis(); tmp = now; for (int i = 0; i < howOften; i++) { - sqJena.getAsXMLString(); + rs = sqJena.send(); + SparqlQuery.getAsXMLString(rs); System.out.println("Jena needed: " + (System.currentTimeMillis() - tmp)); tmp = System.currentTimeMillis(); @@ -140,7 +144,8 @@ SparqlQuery sqJena = new SparqlQuery(queryString, sse); // SparqlQueryConventional sqConv = new SparqlQueryConventional(sse); - System.out.println(sqJena.getAsXMLString()); + ResultSet rs = sqJena.send(); + System.out.println(SparqlQuery.getAsXMLString(rs)); //System.out.println(sqConv.getAsXMLString(queryString)); } Modified: trunk/src/dl-learner/org/dllearner/server/DLLearnerWS.java =================================================================== --- trunk/src/dl-learner/org/dllearner/server/DLLearnerWS.java 2008-01-29 14:36:53 UTC (rev 455) +++ trunk/src/dl-learner/org/dllearner/server/DLLearnerWS.java 2008-01-29 17:34:13 UTC (rev 456) @@ -57,6 +57,8 @@ import org.dllearner.utilities.Datastructures; import org.dllearner.utilities.Helper; +import com.hp.hpl.jena.query.ResultSet; + /** * DL-Learner web service interface. * @@ -499,14 +501,16 @@ public String getAsJSON(int sessionID, int queryID) throws ClientNotKnownException { ClientState state = getState(sessionID); - return state.getQuery(queryID).getAsJSON(); + ResultSet rs = state.getQuery(queryID).send(); + return SparqlQuery.getAsJSON(rs); } @WebMethod public String getAsXMLString(int sessionID, int queryID) throws ClientNotKnownException { ClientState state = getState(sessionID); - return state.getQuery(queryID).getAsXMLString(); + ResultSet rs = state.getQuery(queryID).send(); + return SparqlQuery.getAsXMLString(rs); } @WebMethod This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |