From bca2dbefcc69dae46abc28e372a8569f59380713 Mon Sep 17 00:00:00 2001 From: bjl23 Date: Mon, 31 Jan 2011 18:24:00 +0000 Subject: [PATCH] code to run two-stage CONSTRUCTs and SELECTs for list views --- .../dao/ObjectPropertyStatementDao.java | 3 + .../ObjectPropertyStatementDaoFiltering.java | 9 ++ .../jena/ObjectPropertyStatementDaoJena.java | 89 ++++++++++++++++++- .../jena/ObjectPropertyStatementDaoSDB.java | 15 ++-- .../servlet/setup/JenaDataSourceSetupSDB.java | 4 +- .../CollatedObjectPropertyTemplateModel.java | 2 +- ...UncollatedObjectPropertyTemplateModel.java | 2 +- 7 files changed, 109 insertions(+), 15 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java index 6af64078a..e17339a7d 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java @@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.dao; import java.util.List; import java.util.Map; +import java.util.Set; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; @@ -31,4 +32,6 @@ public interface ObjectPropertyStatementDao { int insertNewObjectPropertyStatement(ObjectPropertyStatement objPropertyStmt ); public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String query); + + public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String query, Set constructQueries); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java index a0c71f9b9..93a435f32 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/filtering/ObjectPropertyStatementDaoFiltering.java @@ -5,6 +5,7 @@ package edu.cornell.mannlib.vitro.webapp.dao.filtering; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import net.sf.jga.algorithms.Filter; import edu.cornell.mannlib.vitro.webapp.beans.Individual; @@ -88,6 +89,14 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec String subjectUri, String propertyUri, String query) { return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, query); } + + @Override + // RY What about filtering? + public List> getObjectPropertyStatementsForIndividualByProperty( + String subjectUri, String propertyUri, String query, Set queryStrings) { + return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, query, queryStrings); + } + // @Override 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 38d9ab389..7047aaf5a 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 @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -21,6 +22,8 @@ import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.QuerySolutionMap; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.query.Syntax; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; @@ -247,6 +250,17 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec return 0; } + @Override + public List> getObjectPropertyStatementsForIndividualByProperty( + String subjectUri, + String propertyUri, + String queryString) { + + return getObjectPropertyStatementsForIndividualByProperty( + subjectUri, propertyUri, null); + + } + @Override /* * SPARQL-based method for getting values related to a single object property. @@ -255,7 +269,14 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec * custom queries that could request any data in addition to just the object of the statement. * However, we do need to get the object of the statement so that we have it to create editing links. */ - public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String queryString) { + public List> getObjectPropertyStatementsForIndividualByProperty( + String subjectUri, + String propertyUri, + String queryString, + Set constructQueryStrings ) { + + Model constructedModel = constructModelForSelectQueries( + subjectUri, propertyUri, constructQueryStrings); log.debug("Query string for object property " + propertyUri + ": " + queryString); @@ -267,7 +288,7 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec log.error(queryString); return Collections.emptyList(); } - + // RY One oddity here is that SDB adds the bound variables to the query select terms, // even if they're not included in the query. QuerySolutionMap initialBindings = new QuerySolutionMap(); @@ -281,8 +302,13 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec dataset.getLock().enterCriticalSection(Lock.READ); try { - QueryExecution qexec = QueryExecutionFactory.create( - query, dataset, initialBindings); + + QueryExecution qexec = (constructedModel == null) + ? QueryExecutionFactory.create( + query, dataset, initialBindings) + : QueryExecutionFactory.create( + query, constructedModel, initialBindings); + ResultSet results = qexec.execSelect(); while (results.hasNext()) { @@ -297,4 +323,59 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec return list; } + private Model constructModelForSelectQueries(String subjectUri, + String propertyUri, + Set constructQueries) { + + if (constructQueries == null) { + return null; + } + + Model constructedModel = ModelFactory.createDefaultModel(); + + for (String queryString : constructQueries) { + + log.debug("CONSTRUCT query string for object property " + + propertyUri + ": " + queryString); + + Query query = null; + try { + query = QueryFactory.create(queryString, Syntax.syntaxARQ); + } catch(Throwable th){ + log.error("Could not create CONSTRUCT SPARQL query for query " + + "string. " + th.getMessage()); + log.error(queryString); + return constructedModel; + } + + QuerySolutionMap initialBindings = new QuerySolutionMap(); + initialBindings.add( + "subject", ResourceFactory.createResource(subjectUri)); + initialBindings.add( + "property", ResourceFactory.createResource(propertyUri)); + + List> list = new ArrayList>(); + DatasetWrapper w = dwf.getDatasetWrapper(); + Dataset dataset = w.getDataset(); + dataset.getLock().enterCriticalSection(Lock.READ); + try { + + QueryExecution qe = QueryExecutionFactory.create( + query, dataset, initialBindings); + try { + qe.execConstruct(constructedModel); + } finally { + qe.close(); + } + + } finally { + dataset.getLock().leaveCriticalSection(); + w.close(); + } + } + + return constructedModel; + + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoSDB.java index 30ca46f6b..3aa9cf068 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoSDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoSDB.java @@ -53,15 +53,16 @@ public class ObjectPropertyStatementDaoSDB extends String[] graphVars = { "?g", "?h", "?i", "?j" }; String query = "CONSTRUCT { \n" + " <" + entity.getURI() + "> ?p ?o . \n" + - " ?o a ?oType . \n" + +// " ?o a ?oType . \n" + " ?o <" + RDFS.label.getURI() + "> ?oLabel . \n" + " ?o <" + VitroVocabulary.MONIKER + "> ?oMoniker \n" + - "} WHERE { GRAPH ?g { \n" + - " <" + entity.getURI() + "> ?p ?o \n" + - " OPTIONAL { GRAPH ?h { ?o a ?oType } } \n" + - " OPTIONAL { GRAPH ?i { ?o <" + RDFS.label.getURI() + "> ?oLabel } } \n" + - " OPTIONAL { GRAPH ?j { ?o <" + VitroVocabulary.MONIKER + "> ?oMoniker } } \n" + - "} \n" + + "} WHERE { \n" + + " { <" + entity.getURI() + "> ?p ?o } \n" + +// " UNION { <" + entity.getURI() + "> ?p ?o . ?o a ?oType } \n" + + " UNION { <" + entity.getURI() + "> ?p ?o . \n" + + " ?o <" + RDFS.label.getURI() + "> ?oLabel } \n" + + " UNION { <" + entity.getURI() + "> ?p ?o . \n " + + " ?o <" + VitroVocabulary.MONIKER + "> ?oMoniker } \n" + WebappDaoFactorySDB.getFilterBlock(graphVars, datasetMode) + "}"; long startTime = System.currentTimeMillis(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSDB.java index f87aa538e..127d4cd14 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSDB.java @@ -214,7 +214,7 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j inferenceOms.getTBoxModel().addSubModel(vitroTBoxModel); unionOms.getTBoxModel().addSubModel(vitroTBoxModel); - log.error("Setting up union models and DAO factories"); + log.info("Setting up union models and DAO factories"); // create TBox + ABox union models and set up webapp DAO factories OntModel baseUnion = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, @@ -278,7 +278,7 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j ensureEssentialInterfaceData(unionOms.getApplicationMetadataModel(), sce, wadf); - //log.info("Setting up namespace mapper"); + log.info("Setting up namespace mapper"); NamespaceMapper namespaceMapper = new NamespaceMapperJena(masterUnion, masterUnion, defaultNamespace); sce.getServletContext().setAttribute("NamespaceMapper", namespaceMapper); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java index dbf6e8d5d..1cf74a2e3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java @@ -56,7 +56,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM String subjectUri = subject.getURI(); String propertyUri = op.getURI(); List> statementData = - opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getSelectQuery()); + opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getSelectQuery(), getConstructQueries()); /* Apply post-processing */ postprocess(statementData, wdf); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/UncollatedObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/UncollatedObjectPropertyTemplateModel.java index 6f73f7430..05d6754d3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/UncollatedObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/UncollatedObjectPropertyTemplateModel.java @@ -32,7 +32,7 @@ public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplat String subjectUri = subject.getURI(); String propertyUri = op.getURI(); List> statementData = - opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getSelectQuery()); + opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getSelectQuery(), getConstructQueries()); /* Apply postprocessing */ postprocess(statementData, wdf);