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 e17339a7d..f5d09d689 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ObjectPropertyStatementDao.java @@ -31,7 +31,7 @@ public interface ObjectPropertyStatementDao { int insertNewObjectPropertyStatement(ObjectPropertyStatement objPropertyStmt ); - public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String query); + public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String objectKey, String query); - public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String query, Set constructQueries); + public List> getObjectPropertyStatementsForIndividualByProperty(String subjectUri, String propertyUri, String objectKey, 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 93a435f32..4371b41f7 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 @@ -86,15 +86,15 @@ class ObjectPropertyStatementDaoFiltering extends BaseFiltering implements Objec @Override // RY What about filtering? public List> getObjectPropertyStatementsForIndividualByProperty( - String subjectUri, String propertyUri, String query) { - return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, query); + String subjectUri, String propertyUri, String objectKey, String query) { + return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query); } @Override // RY What about filtering? public List> getObjectPropertyStatementsForIndividualByProperty( - String subjectUri, String propertyUri, String query, Set queryStrings) { - return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, query, queryStrings); + String subjectUri, String propertyUri, String objectKey, String query, Set queryStrings) { + return innerObjectPropertyStatementDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, objectKey, query, queryStrings); } 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 e9ecb77f8..08e181e74 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 @@ -27,6 +27,7 @@ import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.query.Syntax; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; @@ -75,31 +76,14 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements * This is a hack to throw out properties in the vitro, rdf, rdfs, and owl namespaces. * It will be implemented in a better way in v1.3 (Editing and Display Configuration). */ - protected static String propertyFilters = null; + protected static final String PROPERTY_FILTERS; static { List namespaceFilters = new ArrayList(); - for (String s : EXCLUDED_NAMESPACES) { - namespaceFilters.add("(afn:namespace(?property) != \"" + s + "\")"); + for (String namespace : EXCLUDED_NAMESPACES) { + namespaceFilters.add("( afn:namespace(?property) != \"" + namespace + "\" )"); } - propertyFilters = "FILTER (" + StringUtils.join(namespaceFilters, " && ") + ")\n"; + PROPERTY_FILTERS = StringUtils.join(namespaceFilters, " && "); } - protected static final String DATA_PROPERTY_QUERY_STRING = - prefixes + "\n" + - "SELECT DISTINCT ?property WHERE { \n" + - " ?subject ?property ?object . \n" + - " ?property rdf:type owl:DatatypeProperty . \n" + - propertyFilters + - "}"; - - protected static Query dataPropertyQuery; - static { - try { - dataPropertyQuery = QueryFactory.create(DATA_PROPERTY_QUERY_STRING); - } catch(Throwable th){ - log.error("could not create SPARQL query for DATA_PROPERTY_QUERY_STRING " + th.getMessage()); - log.error(DATA_PROPERTY_QUERY_STRING); - } - } private class DataPropertyRanker implements Comparator { public int compare (Object o1, Object o2) { @@ -767,9 +751,32 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements * into the new one in a future release. */ public List getDataPropertyList(String subjectUri) { - log.debug("Data property query string:\n" + DATA_PROPERTY_QUERY_STRING); - log.debug("Data property query:\n" + dataPropertyQuery); - Iterator results = getPropertyQueryResults(subjectUri, dataPropertyQuery); + + // Due to a Jena bug, prebinding on ?subject combined with the isLiteral() + // filter causes the query to fail. Using string concatenation to insert the + // subject uri instead. + String queryString = + prefixes + "\n" + + "SELECT DISTINCT ?property WHERE { \n" + + " <" + subjectUri + "> ?property ?object . \n" + + " ?property a owl:DatatypeProperty . \n" + + " FILTER ( \n" + + " isLiteral(?object) && \n" + + PROPERTY_FILTERS + "\n" + + " ) \n" + + "}"; + + Query query = null; + try { + query = QueryFactory.create(queryString); + } catch(Throwable th){ + log.error("could not create SPARQL query for query string " + th.getMessage()); + log.error(queryString); + return null; + } + log.debug("Data property query string:\n" + query); + + Iterator results = getPropertyQueryResults(subjectUri, query); List properties = new ArrayList(); while (results.hasNext()) { QuerySolution sol = results.next(); 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 199bb7a21..00a580385 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 @@ -26,6 +26,7 @@ import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.ResultSet; +import com.hp.hpl.jena.query.Syntax; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; @@ -55,44 +56,23 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp private static final Log log = LogFactory.getLog(ObjectPropertyDaoJena.class.getName()); protected static final List EXCLUDED_NAMESPACES = Arrays.asList( - // Don't need to exclude these, because they are not owl:ObjectProperty - //"http://www.w3.org/1999/02/22-rdf-syntax-ns#", - //"http://www.w3.org/2000/01/rdf-schema#", "http://www.w3.org/2002/07/owl#" ); /* * This is a hack to throw out properties in the vitro, rdf, rdfs, and owl namespaces. * It will be implemented in a better way in v1.3 (Editing and Display Configuration). */ - protected static String propertyFilters = ""; + protected static final String PROPERTY_FILTERS; static { List namespaceFilters = new ArrayList(); - for (String s : EXCLUDED_NAMESPACES) { - namespaceFilters.add("(afn:namespace(?property) != \"" + s + "\")"); + for (String namespace : EXCLUDED_NAMESPACES) { + namespaceFilters.add("( afn:namespace(?property) != \"" + namespace + "\" )"); } // A hack to include the vitro:primaryLink and vitro:additionalLink properties in the list namespaceFilters.add("( ?property = vitro:primaryLink ||" + "?property = vitro:additionalLink ||" + "afn:namespace(?property) != \"http://vitro.mannlib.cornell.edu/ns/vitro/0.7#\" )"); - propertyFilters = "FILTER (" + StringUtils.join(namespaceFilters, " && ") + ")\n"; - } - - protected static final String OBJECT_PROPERTY_QUERY_STRING = - prefixes + "\n" + - "SELECT DISTINCT ?property WHERE { \n" + - " ?subject ?property ?object . \n" + - " ?property rdf:type owl:ObjectProperty . \n" + - propertyFilters + - "}"; - - protected static Query objectPropertyQuery; - static { - try { - objectPropertyQuery = QueryFactory.create(OBJECT_PROPERTY_QUERY_STRING); - } catch(Throwable th){ - log.error("could not create SPARQL query for OBJECT_PROPERTY_QUERY_STRING " + th.getMessage()); - log.error(OBJECT_PROPERTY_QUERY_STRING); - } + PROPERTY_FILTERS = StringUtils.join(namespaceFilters, " && "); } protected static final String LIST_VIEW_CONFIG_FILE_QUERY_STRING = @@ -101,7 +81,7 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp " ?property display:listViewConfigFile ?filename . \n" + "}"; - protected static Query listViewConfigFileQuery; + protected static Query listViewConfigFileQuery = null; static { try { listViewConfigFileQuery = QueryFactory.create(LIST_VIEW_CONFIG_FILE_QUERY_STRING); @@ -884,9 +864,32 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp * into the new one in a future release. */ public List getObjectPropertyList(String subjectUri) { - log.debug("Object property query string:\n" + OBJECT_PROPERTY_QUERY_STRING); - log.debug("Object property query:\n" + objectPropertyQuery); - Iterator results = getPropertyQueryResults(subjectUri, objectPropertyQuery); + + // Due to a Jena bug, prebinding on ?subject combined with the isURI() + // filter causes the query to fail. Using string concatenation to insert the + // subject uri instead. + String queryString = + prefixes + "\n" + + "SELECT DISTINCT ?property WHERE { \n" + + " <" + subjectUri + "> ?property ?object . \n" + + " ?property a owl:ObjectProperty . \n" + + " FILTER ( \n" + + " isURI(?object) && \n" + + PROPERTY_FILTERS + "\n" + + " ) \n" + + "}"; + + Query query = null; + try { + query = QueryFactory.create(queryString); + } catch(Throwable th){ + log.error("could not create SPARQL query for query string " + th.getMessage()); + log.error(queryString); + return null; + } + log.debug("Object property query:\n" + query); + + Iterator results = getPropertyQueryResults(subjectUri, query); List properties = new ArrayList(); while (results.hasNext()) { QuerySolution soln = results.next(); 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 7047aaf5a..3531e965d 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 @@ -25,6 +25,7 @@ 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.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.rdf.model.Statement; @@ -254,10 +255,10 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec public List> getObjectPropertyStatementsForIndividualByProperty( String subjectUri, String propertyUri, - String queryString) { + String objectKey, String queryString) { return getObjectPropertyStatementsForIndividualByProperty( - subjectUri, propertyUri, null); + subjectUri, propertyUri, objectKey, objectKey, null); } @@ -272,8 +273,8 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec public List> getObjectPropertyStatementsForIndividualByProperty( String subjectUri, String propertyUri, - String queryString, - Set constructQueryStrings ) { + String objectKey, + String queryString, Set constructQueryStrings ) { Model constructedModel = constructModelForSelectQueries( subjectUri, propertyUri, constructQueryStrings); @@ -313,7 +314,10 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec while (results.hasNext()) { QuerySolution soln = results.nextSolution(); - list.add(QueryUtils.querySolutionToStringValueMap(soln)); + RDFNode node = soln.get(objectKey); + if (node.isResource()) { + list.add(QueryUtils.querySolutionToStringValueMap(soln)); + } } } finally { 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 c72717e12..3bf6b20e7 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 @@ -404,18 +404,20 @@ public class PropertyDaoJena extends JenaBaseDao implements PropertyDao { protected Iterator getPropertyQueryResults(String subjectUri, Query query) { log.debug("SPARQL query:\n" + query.toString()); - // Bind the subject's uri to the ?subject query term - QuerySolutionMap subjectBinding = new QuerySolutionMap(); - subjectBinding.add("subject", - ResourceFactory.createResource(subjectUri)); - + + // 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 DatasetWrapper w = dwf.getDatasetWrapper(); Dataset dataset = w.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); try { QueryExecution qexec = QueryExecutionFactory.create( - query, dataset, subjectBinding); + query, dataset); //, subjectBinding); try { ResultSet rs = qexec.execSelect(); // consume iterator before wrapper w is closed in finally block 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 9add632c4..39ff93f82 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 @@ -61,7 +61,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM String subjectUri = subject.getURI(); String propertyUri = op.getURI(); List> statementData = - opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getSelectQuery(), getConstructQueries()); + opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getObjectKey(), 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 2966a8049..27261328e 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 @@ -37,7 +37,7 @@ public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplat String subjectUri = subject.getURI(); String propertyUri = op.getURI(); List> statementData = - opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getSelectQuery(), getConstructQueries()); + opDao.getObjectPropertyStatementsForIndividualByProperty(subjectUri, propertyUri, getObjectKey(), getSelectQuery(), getConstructQueries()); /* Apply postprocessing */ postprocess(statementData, wdf);