From 34d78a9463285b6d45158de08bf642f9cc48c5ad Mon Sep 17 00:00:00 2001 From: grahamtriggs Date: Mon, 19 Oct 2015 17:16:09 +0100 Subject: [PATCH] [VIVO-1031] Use consumer interface for most ResultSets --- .../webapp/dao/jena/DataPropertyDaoJena.java | 28 +++-- .../webapp/dao/jena/IndividualDaoSDB.java | 116 +++++++++--------- .../vitro/webapp/dao/jena/IndividualSDB.java | 81 ++++++------ .../dao/jena/ObjectPropertyDaoJena.java | 67 +++++----- .../jena/ObjectPropertyStatementDaoJena.java | 88 ++++++------- .../webapp/dao/jena/PropertyDaoJena.java | 57 +++------ .../dao/jena/RDFServiceDatasetGraph.java | 31 +++-- .../webapp/dao/jena/RDFServiceGraph.java | 47 ++++--- .../rdfservice/impl/RDFServiceImpl.java | 6 +- .../impl/sparql/RDFServiceSparql.java | 25 ++-- 10 files changed, 268 insertions(+), 278 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java index f566e992c..955662ef6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DataPropertyDaoJena.java @@ -12,6 +12,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -733,20 +734,21 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements log.error(queryString); return null; } - log.debug("Data property query string:\n" + query); - - ResultSet results = getPropertyQueryResults(queryString); - List properties = new ArrayList(); - while (results.hasNext()) { - QuerySolution sol = results.next(); - Resource resource = sol.getResource("property"); - String uri = resource.getURI(); - DataProperty property = getDataPropertyByURI(uri); - if (property != null) { - properties.add(property); + log.debug("Data property query string:\n" + query); + + final List properties = new ArrayList(); + getPropertyQueryResults(queryString, new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + Resource resource = qs.getResource("property"); + String uri = resource.getURI(); + DataProperty property = getDataPropertyByURI(uri); + if (property != null) { + properties.add(property); + } } - } - return properties; + }); + return properties; } protected static final String LIST_VIEW_CONFIG_FILE_QUERY_STRING = "PREFIX display: " + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualDaoSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualDaoSDB.java index 402efb117..0ea68b060 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualDaoSDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualDaoSDB.java @@ -12,6 +12,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -175,13 +176,12 @@ public class IndividualDaoSDB extends IndividualDaoJena { } private List getIndividualList(Resource theClass) { - List ents = new ArrayList(); + final List ents = new ArrayList(); DatasetWrapper w = getDatasetWrapper(); Dataset dataset = w.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); try { - - String query = + String query = "SELECT DISTINCT ?ind ?label " + "WHERE " + "{ \n" + @@ -191,47 +191,53 @@ public class IndividualDaoSDB extends IndividualDaoJena { " ?ind <" + RDFS.label.getURI() + "> ?label \n" + "} \n" + "} ORDER BY ?ind ?label"; + RDFService rdfService = wadf.getRDFService(); - InputStream in = null; try { - in = rdfService.sparqlSelectQuery( - query, RDFService.ResultFormat.JSON); + rdfService.sparqlSelectQuery( + query, new ResultSetConsumer() { + String uri = null; + String label = null; + + @Override + protected void processQuerySolution(QuerySolution qs) { + Resource currRes = qs.getResource("ind"); + if (currRes.isAnon()) { + return; + } + + if (uri != null && !uri.equals(currRes.getURI())) { + try { + ents.add(makeIndividual(uri, label)); + } catch (IndividualNotFoundException e) { + // don't add + } + uri = currRes.getURI(); + label = null; + } else if (uri == null) { + uri = currRes.getURI(); + } + Literal labelLit = qs.getLiteral("label"); + if (labelLit != null) { + label = labelLit.getLexicalForm(); + } + } + + @Override + protected void endProcessing() { + if (uri != null) { + try { + ents.add(makeIndividual(uri, label)); + } catch (IndividualNotFoundException e) { + // don't add + } + } + } + }); } catch (RDFServiceException e) { log.debug(e,e); throw new RuntimeException(e); } - ResultSet rs = ResultSetFactory.fromJSON(in); - String uri = null; - String label = null; - while (rs.hasNext()) { - QuerySolution sol = rs.nextSolution(); - Resource currRes = sol.getResource("ind"); - if (currRes.isAnon()) { - continue; - } - if (uri != null && !uri.equals(currRes.getURI())) { - try { - ents.add(makeIndividual(uri, label)); - } catch (IndividualNotFoundException e) { - // don't add - } - uri = currRes.getURI(); - label = null; - } else if (uri == null) { - uri = currRes.getURI(); - } - Literal labelLit = sol.getLiteral("label"); - if (labelLit != null) { - label = labelLit.getLexicalForm(); - } - if (!rs.hasNext()) { - try { - ents.add(makeIndividual(uri, label)); - } catch (IndividualNotFoundException e) { - // don't add - } - } - } } finally { dataset.getLock().leaveCriticalSection(); w.close(); @@ -241,7 +247,7 @@ public class IndividualDaoSDB extends IndividualDaoJena { private List getGraphFilteredIndividualList(Resource theClass, String filterStr) { - List filteredIndividualList = new ArrayList(); + final List filteredIndividualList = new ArrayList(); DatasetWrapper w = getDatasetWrapper(); Dataset dataset = w.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); @@ -254,28 +260,26 @@ public class IndividualDaoSDB extends IndividualDaoJena { " } \n" + filterStr + "} ORDER BY ?ind"; RDFService rdfService = wadf.getRDFService(); - InputStream in = null; try { - in = rdfService.sparqlSelectQuery( - query, RDFService.ResultFormat.JSON); + rdfService.sparqlSelectQuery( + query, new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + Resource currRes = qs.getResource("ind"); + if (!currRes.isAnon()) { + try { + filteredIndividualList.add( + makeIndividual(currRes.getURI(), null)); + } catch (IndividualNotFoundException e) { + // don't add + } + } + } + }); } catch (RDFServiceException e) { log.debug(e,e); throw new RuntimeException(e); } - ResultSet rs = ResultSetFactory.fromJSON(in); - while (rs.hasNext()) { - QuerySolution sol = rs.nextSolution(); - Resource currRes = sol.getResource("ind"); - if (currRes.isAnon()) { - continue; - } - try { - filteredIndividualList.add( - makeIndividual(currRes.getURI(), null)); - } catch (IndividualNotFoundException e) { - // don't add - } - } } finally { dataset.getLock().leaveCriticalSection(); w.close(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualSDB.java index 77c763240..e1dfd8d59 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualSDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/IndividualSDB.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; import com.hp.hpl.jena.graph.NodeFactory; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.joda.time.DateTime; @@ -276,23 +277,23 @@ public class IndividualSDB extends IndividualImpl implements Individual { @Override public List getMostSpecificTypeURIs() { - List typeURIs = new ArrayList(); + final List typeURIs = new ArrayList(); if (this.getURI() == null) { return typeURIs; } else { String queryStr = "SELECT ?type WHERE { <" + this.getURI() + "> <" + VitroVocabulary.MOST_SPECIFIC_TYPE + "> ?type }"; try { - InputStream json = webappDaoFactory.getRDFService().sparqlSelectQuery( - queryStr, RDFService.ResultFormat.JSON); - ResultSet rs = ResultSetFactory.fromJSON(json); - while (rs.hasNext()) { - QuerySolution qsoln = rs.nextSolution(); - RDFNode node = qsoln.get("type"); - if (node.isURIResource()) { - typeURIs.add(node.asResource().getURI()); - } - } + webappDaoFactory.getRDFService().sparqlSelectQuery(queryStr, new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + RDFNode node = qs.get("type"); + if (node.isURIResource()) { + typeURIs.add(node.asResource().getURI()); + } + } + }); + return typeURIs; } catch (RDFServiceException e) { throw new RuntimeException(e); @@ -761,33 +762,35 @@ public class IndividualSDB extends IndividualImpl implements Individual { } } - private List sparqlForDataPropertyStatements(String propertyUri) { - List stmts = new ArrayList(); + private List sparqlForDataPropertyStatements(final String propertyUri) { + final List stmts = new ArrayList(); + final IndividualSDB individualSDB = this; + String queryStr = "SELECT (str(?value) as ?valueString) WHERE { <" + this.getURI() + "> <" + propertyUri + "> ?value }"; try { - InputStream json = webappDaoFactory.getRDFService().sparqlSelectQuery( - queryStr, RDFService.ResultFormat.JSON); - ResultSet rs = ResultSetFactory.fromJSON(json); - while (rs.hasNext()) { - QuerySolution qsoln = rs.nextSolution(); - RDFNode node = qsoln.get("valueString"); - if (!node.isLiteral()) { - log.debug("Ignoring non-literal value for " + node + - " for property " + propertyUri); - } else { - Literal lit = node.asLiteral(); - DataPropertyStatement stmt = new DataPropertyStatementImpl(); - - stmt.setData(lit.getLexicalForm()); - stmt.setDatatypeURI(lit.getDatatypeURI()); - stmt.setLanguage(lit.getLanguage()); - stmt.setDatapropURI(propertyUri); - stmt.setIndividualURI(this.getURI()); - stmt.setIndividual(this); - stmts.add(stmt); - } - } + webappDaoFactory.getRDFService().sparqlSelectQuery( + queryStr, new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + RDFNode node = qs.get("valueString"); + if (!node.isLiteral()) { + log.debug("Ignoring non-literal value for " + node + + " for property " + propertyUri); + } else { + Literal lit = node.asLiteral(); + DataPropertyStatement stmt = new DataPropertyStatementImpl(); + + stmt.setData(lit.getLexicalForm()); + stmt.setDatatypeURI(lit.getDatatypeURI()); + stmt.setLanguage(lit.getLanguage()); + stmt.setDatapropURI(propertyUri); + stmt.setIndividualURI(individualSDB.getURI()); + stmt.setIndividual(individualSDB); + stmts.add(stmt); + } + } + }); } catch (RDFServiceException e) { log.error(e,e); throw new RuntimeException(e); @@ -842,14 +845,12 @@ public class IndividualSDB extends IndividualImpl implements Individual { if (ind.getModel().contains((Resource) null, RDF.type, (RDFNode) null)){ tempModel = ind.getModel(); } else { + tempModel = ModelFactory.createDefaultModel(); String getTypesQuery = buildMyVClassesQuery(assertedOnly); - + RDFService service = webappDaoFactory.getRDFService(); try { - tempModel = RDFServiceUtils.parseModel( - service.sparqlConstructQuery( - getTypesQuery, RDFService.ModelSerializationFormat.N3), - RDFService.ModelSerializationFormat.N3); + service.sparqlConstructQuery(getTypesQuery, tempModel); } catch (RDFServiceException e) { throw new RuntimeException(e); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java index d7441c266..03b4efda8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyDaoJena.java @@ -10,6 +10,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -1021,39 +1022,43 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp } log.debug("Object property query:\n" + query); - ObjectProperty propRegister = new ObjectProperty(); - propRegister.setURI(""); - - ResultSet results = getPropertyQueryResults(queryString); - List properties = new ArrayList(); - while (results.hasNext()) { - QuerySolution soln = results.next(); - Resource resource = soln.getResource("property"); - String uri = resource.getURI(); - Resource objType = soln.getResource("objType"); - String objTypeUri = objType.getURI(); - log.debug("Found populated object property " + uri + - " with object type " + objType); - ObjectProperty property = null; - if (uri.equals(propRegister.getURI())) { - property = propRegister.clone(); - } else { - ObjectProperty newProperty = getObjectPropertyByURI(uri); - if (newProperty != null) { - propRegister = newProperty; - // add canonical instance of the property first in the list - // before the range-changed versions - properties.add(newProperty); - // isolate the canonical prop from what's about to happen next - property = newProperty.clone(); - } + + final List properties = new ArrayList(); + getPropertyQueryResults(queryString, new ResultSetConsumer() { + ObjectProperty propRegister = new ObjectProperty(); + { + propRegister.setURI(""); } - if (property != null) { - property.setRangeVClassURI(objTypeUri); - properties.add(property); + + @Override + protected void processQuerySolution(QuerySolution qs) { + Resource resource = qs.getResource("property"); + String uri = resource.getURI(); + Resource objType = qs.getResource("objType"); + String objTypeUri = objType.getURI(); + log.debug("Found populated object property " + uri + " with object type " + objType); + ObjectProperty property = null; + if (uri.equals(propRegister.getURI())) { + property = propRegister.clone(); + } else { + ObjectProperty newProperty = getObjectPropertyByURI(uri); + if (newProperty != null) { + propRegister = newProperty; + // add canonical instance of the property first in the list + // before the range-changed versions + properties.add(newProperty); + // isolate the canonical prop from what's about to happen next + property = newProperty.clone(); + } + } + if (property != null) { + property.setRangeVClassURI(objTypeUri); + properties.add(property); + } } - } - return properties; + }); + + return properties; } protected static final String LIST_VIEW_CONFIG_FILE_QUERY_STRING = diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java index e037dc339..fe4284ad6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java @@ -12,6 +12,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -279,12 +280,12 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec public List> getObjectPropertyStatementsForIndividualByProperty( String subjectUri, String propertyUri, - String objectKey, String domainUri, String rangeUri, + final String objectKey, String domainUri, String rangeUri, String queryString, Set constructQueryStrings, String sortDirection) { - List> list = new ArrayList>(); + final List> list = new ArrayList>(); long start = System.currentTimeMillis(); @@ -299,31 +300,39 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec if("desc".equalsIgnoreCase( sortDirection ) ){ queryString = queryString.replaceAll(" ASC\\(", " DESC("); } - ResultSet results = (constructedModel == null) ? selectFromRDFService( - queryString, subjectUri, propertyUri, domainUri, rangeUri) : selectFromConstructedModel( - queryString, subjectUri, propertyUri, domainUri, rangeUri, constructedModel); - while (results.hasNext()) { - QuerySolution soln = results.nextSolution(); - RDFNode node = soln.get(objectKey); - if (node != null && node.isURIResource()) { - list.add(QueryUtils.querySolutionToStringValueMap(soln)); - } - } - if(log.isDebugEnabled()) { - long duration = System.currentTimeMillis() - start; - log.debug(duration + " to do list view for " + - propertyUri + " / " + domainUri + " / " + rangeUri); + ResultSetConsumer consumer = new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + RDFNode node = qs.get(objectKey); + if (node != null && node.isURIResource()) { + list.add(QueryUtils.querySolutionToStringValueMap(qs)); } + } + }; + + if (constructedModel == null) { + selectFromRDFService( + queryString, subjectUri, propertyUri, domainUri, rangeUri, consumer); + } else { + selectFromConstructedModel( + queryString, subjectUri, propertyUri, domainUri, rangeUri, constructedModel, consumer); + } + + if(log.isDebugEnabled()) { + long duration = System.currentTimeMillis() - start; + log.debug(duration + " to do list view for " + + propertyUri + " / " + domainUri + " / " + rangeUri); + } } catch (Exception e) { log.error("Error getting object property values for subject " + subjectUri + " and property " + propertyUri, e); return Collections.emptyList(); } return list; } - - private ResultSet selectFromRDFService(String queryString, String subjectUri, - String propertyUri, String domainUri, String rangeUri) { + + private void selectFromRDFService(String queryString, String subjectUri, + String propertyUri, String domainUri, String rangeUri, ResultSetConsumer consumer) { String[] part = queryString.split("[Ww][Hh][Ee][Rr][Ee]"); part[1] = part[1].replace("?subject", "<" + subjectUri + ">"); part[1] = part[1].replace("?property", "<" + propertyUri + ">"); @@ -335,16 +344,15 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec } queryString = part[0] + "WHERE" + part[1]; try { - return ResultSetFactory.fromJSON( - rdfService.sparqlSelectQuery(queryString, RDFService.ResultFormat.JSON)); + rdfService.sparqlSelectQuery(queryString, consumer); } catch (RDFServiceException e) { throw new RuntimeException(e); - } + } } - private ResultSet selectFromConstructedModel(String queryString, - String subjectUri, String propertyUri, String domainUri, String rangeUri, - Model constructedModel) { + private void selectFromConstructedModel(String queryString, + String subjectUri, String propertyUri, String domainUri, String rangeUri, + Model constructedModel, ResultSetConsumer consumer) { Query query = null; try { query = QueryFactory.create(queryString, Syntax.syntaxARQ); @@ -352,7 +360,7 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec log.error("Could not create SPARQL query for query string. " + th.getMessage()); log.error(queryString); throw new RuntimeException(th); - } + } QuerySolutionMap initialBindings = new QuerySolutionMap(); initialBindings.add("subject", ResourceFactory.createResource(subjectUri)); @@ -369,19 +377,19 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec } // Run the SPARQL query to get the properties - + QueryExecution qexec = null; try { qexec = QueryExecutionFactory.create( query, constructedModel, initialBindings); - return new ResultSetMem(qexec.execSelect()); + consumer.processResultSet(qexec.execSelect()); } finally { if (qexec != null) { qexec.close(); } - } + } } - + private Model constructModelForSelectQueries(String subjectUri, String propertyUri, String rangeUri, @@ -441,25 +449,7 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec w.close(); } } else { - String parseFormat = "N3"; - RDFService.ModelSerializationFormat resultFormat = RDFService - .ModelSerializationFormat.N3; - - /* If the test ObjectPropertyStatementDaoJenaTest.testN3WithSameAs() - * fails this code can be removed: */ - if( OWL.sameAs.getURI().equals( propertyUri )){ - // VIVO-111: owl:sameAs can be represented as = in n3 but - // Jena's parser does not recognize it. - // Switch to rdf/xml only for sameAs since it seems like n3 - // would be faster the rest of the time. - parseFormat = "RDF/XML"; - resultFormat = RDFService.ModelSerializationFormat.RDFXML; - } - /* end of removal */ - - InputStream is = rdfService.sparqlConstructQuery( - queryString, resultFormat); - constructedModel.read( is, null, parseFormat); + rdfService.sparqlConstructQuery(queryString, constructedModel); } } catch (Exception e) { log.error("Error getting constructed model for subject " diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java index 3c2343fd1..ec2062718 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/PropertyDaoJena.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -440,44 +441,24 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao { return classSet; } - protected ResultSet getPropertyQueryResults(String queryString) { - log.debug("SPARQL query:\n" + queryString); - - // RY Removing prebinding due to Jena bug: when isLiteral(?object) or - // isURI(?object) is added to the query as a filter, the query fails with prebinding - // but succeeds when the subject uri is concatenated into the query string. - //QuerySolutionMap subjectBinding = new QuerySolutionMap(); - //subjectBinding.add("subject", ResourceFactory.createResource(subjectUri)); - - // Run the SPARQL query to get the properties - - try { - return ResultSetFactory.fromJSON( - getRDFService().sparqlSelectQuery( - queryString, RDFService.ResultFormat.JSON)); - } catch (RDFServiceException e) { - throw new RuntimeException(e); - } - -// DatasetWrapper w = dwf.getDatasetWrapper(); -// Dataset dataset = w.getDataset(); -// dataset.getLock().enterCriticalSection(Lock.READ); -// ResultSet rs = null; -// try { -// QueryExecution qexec = QueryExecutionFactory.create( -// query, dataset); //, subjectBinding); -// try { -// rs = new ResultSetMem(qexec.execSelect()); -// } finally { -// qexec.close(); -// } -// } finally { -// dataset.getLock().leaveCriticalSection(); -// w.close(); -// } -// return rs; - } - + protected void getPropertyQueryResults(String queryString, ResultSetConsumer consumer) { + log.debug("SPARQL query:\n" + queryString); + + // RY Removing prebinding due to Jena bug: when isLiteral(?object) or + // isURI(?object) is added to the query as a filter, the query fails with prebinding + // but succeeds when the subject uri is concatenated into the query string. + //QuerySolutionMap subjectBinding = new QuerySolutionMap(); + //subjectBinding.add("subject", ResourceFactory.createResource(subjectUri)); + + // Run the SPARQL query to get the properties + + try { + getRDFService().sparqlSelectQuery(queryString, consumer); + } catch (RDFServiceException e) { + throw new RuntimeException(e); + } + } + /** * requires SPARQL 1.1 (or ARQ) property path support * @param vclassURI diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDatasetGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDatasetGraph.java index b2f010b5d..b6a60f6e1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDatasetGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceDatasetGraph.java @@ -24,6 +24,7 @@ import com.hp.hpl.jena.util.iterator.WrappedIterator; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import edu.cornell.mannlib.vitro.webapp.utils.logging.ToString; public class RDFServiceDatasetGraph implements DatasetGraph { @@ -109,7 +110,7 @@ public class RDFServiceDatasetGraph implements DatasetGraph { } @Override - public Iterator find(Node graph, Node subject, Node predicate, Node object) { + public Iterator find(final Node graph, final Node subject, final Node predicate, final Node object) { if (!isVar(subject) && !isVar(predicate) && !isVar(object) &&!isVar(graph)) { if (contains(subject, predicate, object, graph)) { return new SingletonIterator(new Quad(subject, predicate, object, graph)); @@ -136,25 +137,23 @@ public class RDFServiceDatasetGraph implements DatasetGraph { //log.info(findQuery.toString()); - ResultSet rs = null; - + final List quadlist = new ArrayList(); try { - rs = JSONInput.fromJSON(rdfService.sparqlSelectQuery( - findQuery.toString(), RDFService.ResultFormat.JSON)); + rdfService.sparqlSelectQuery(findQuery.toString(), new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + Quad q = new Quad(isVar(graph) ? qs.get("?g").asNode() : graph, + isVar(subject) ? qs.get("?s").asNode() : subject, + isVar(predicate) ? qs.get("?p").asNode() : predicate, + isVar(object) ? qs.get("?o").asNode() : object); + + quadlist.add(q); + } + }); } catch (RDFServiceException rdfse) { throw new RuntimeException(rdfse); } - - List quadlist = new ArrayList(); - while (rs.hasNext()) { - QuerySolution soln = rs.nextSolution(); - Quad q = new Quad(isVar(graph) ? soln.get("?g").asNode() : graph, - isVar(subject) ? soln.get("?s").asNode() : subject, - isVar(predicate) ? soln.get("?p").asNode() : predicate, - isVar(object) ? soln.get("?o").asNode() : object); - //log.info(t); - quadlist.add(q); - } + //log.info(triplist.size() + " results"); return WrappedIterator.create(quadlist.iterator()); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java index 81ca7c240..ff262da04 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDFServiceGraph.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -163,8 +164,10 @@ public class RDFServiceGraph implements GraphWithPerform { containsQuery.append(" } \n"); } containsQuery.append("} \nLIMIT 1 "); - ResultSet result = execSelect(containsQuery.toString()); - return result.hasNext(); + + ResultSetConsumer.HasResult consumer = new ResultSetConsumer.HasResult(); + execSelect(containsQuery.toString(), consumer); + return consumer.hasResult(); } @Override @@ -232,7 +235,7 @@ public class RDFServiceGraph implements GraphWithPerform { } @Override - public ExtendedIterator find(Node subject, Node predicate, Node object) { + public ExtendedIterator find(final Node subject, final Node predicate, final Node object) { if (!isVar(subject) && !isVar(predicate) && !isVar(object)) { if (contains(subject, predicate, object)) { return new SingletonIterator(new Triple(subject, predicate, object)); @@ -255,18 +258,31 @@ public class RDFServiceGraph implements GraphWithPerform { findQuery.append("\n}"); String queryString = findQuery.toString(); - + + final List triplist = new ArrayList(); + + execSelect(queryString, new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + Triple t = new Triple(isVar(subject) ? qs.get("?s").asNode() : subject, + isVar(predicate) ? qs.get("?p").asNode() : predicate, + isVar(object) ? qs.get("?o").asNode() : object); + //log.info(t); + triplist.add(t); + } + }); + +/* ResultSet rs = execSelect(queryString); - - List triplist = new ArrayList(); while (rs.hasNext()) { QuerySolution soln = rs.nextSolution(); - Triple t = new Triple(isVar(subject) ? soln.get("?s").asNode() : subject, - isVar(predicate) ? soln.get("?p").asNode() : predicate, - isVar(object) ? soln.get("?o").asNode() : object); + Triple t = new Triple(isVar(subject) ? soln.get("?s").asNode() : subject, + isVar(predicate) ? soln.get("?p").asNode() : predicate, + isVar(object) ? soln.get("?o").asNode() : object); //log.info(t); triplist.add(t); } +*/ //log.info(triplist.size() + " results"); return WrappedIterator.create(triplist.iterator()); } @@ -389,18 +405,9 @@ public class RDFServiceGraph implements GraphWithPerform { } }; - private boolean execAsk(String queryStr) { - try { - return rdfService.sparqlAskQuery(queryStr); - } catch (RDFServiceException rdfse) { - throw new RuntimeException(rdfse); - } - } - - private ResultSet execSelect(String queryStr) { + private void execSelect(String queryStr, ResultSetConsumer consumer) { try { - return JSONInput.fromJSON(rdfService.sparqlSelectQuery( - queryStr, RDFService.ResultFormat.JSON)); + rdfService.sparqlSelectQuery(queryStr, consumer); } catch (RDFServiceException rdfse) { throw new RuntimeException(rdfse); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceImpl.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceImpl.java index 0dab71131..5e7c5aed3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceImpl.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/RDFServiceImpl.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import edu.cornell.mannlib.vitro.webapp.rdfservice.ResultSetConsumer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -168,8 +169,9 @@ public abstract class RDFServiceImpl implements RDFService { } protected boolean sparqlSelectQueryHasResults(String queryStr) throws RDFServiceException { - ResultSet rs = XMLInput.fromXML(sparqlSelectQuery(queryStr, ResultFormat.XML)); - return rs.hasNext(); + ResultSetConsumer.HasResult hasResult = new ResultSetConsumer.HasResult(); + sparqlSelectQuery(queryStr, hasResult); + return hasResult.hasResult(); } protected static String sparqlTriple(Triple triple) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/sparql/RDFServiceSparql.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/sparql/RDFServiceSparql.java index 9dbf8a2e5..b4f865746 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/sparql/RDFServiceSparql.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/sparql/RDFServiceSparql.java @@ -411,20 +411,19 @@ public class RDFServiceSparql extends RDFServiceImpl implements RDFService { } private List getGraphURIsFromSparqlQuery(String queryString) throws RDFServiceException { - List graphURIs = new ArrayList(); + final List graphURIs = new ArrayList(); try { - - ResultSet rs = ResultSetFactory.fromJSON( - sparqlSelectQuery(queryString, RDFService.ResultFormat.JSON)); - while (rs.hasNext()) { - QuerySolution qs = rs.nextSolution(); - if (qs != null) { // no idea how this happens, but it seems to - RDFNode n = qs.getResource("g"); - if (n != null && n.isResource()) { - graphURIs.add(((Resource) n).getURI()); - } - } - } + sparqlSelectQuery(queryString, new ResultSetConsumer() { + @Override + protected void processQuerySolution(QuerySolution qs) { + if (qs != null) { // no idea how this happens, but it seems to + RDFNode n = qs.getResource("g"); + if (n != null && n.isResource()) { + graphURIs.add(((Resource) n).getURI()); + } + } + } + }); } catch (Exception e) { throw new RDFServiceException("Unable to list graph URIs", e); }