From eb55aa694f106f2608322b4b92ea0d97bcadef6d Mon Sep 17 00:00:00 2001 From: bjl23 Date: Mon, 31 Jan 2011 21:53:24 +0000 Subject: [PATCH] vitro list views with CONSTRUCTs and improvement to null individual handling --- .../vitro/webapp/dao/jena/IndividualSDB.java | 31 ++++++++++--- .../BaseObjectPropertyDataPostProcessor.java | 6 ++- webapp/web/config/listViewConfig-default.xml | 46 +++++++++++++++---- .../web/config/listViewConfig-vitroLink.xml | 21 +++++++-- 4 files changed, 83 insertions(+), 21 deletions(-) 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 e474a622f..05a2284e6 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 @@ -30,6 +30,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.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; @@ -132,7 +133,6 @@ public class IndividualSDB extends IndividualImpl implements Individual { Dataset dataset = w.getDataset(); try { dataset.getLock().enterCriticalSection(Lock.READ); - String[] graphVars = {"?g", "?h", "?i"}; String getStatements = "CONSTRUCT " + "{ <"+individualURI+"> <" + RDFS.label.getURI() + @@ -140,18 +140,16 @@ public class IndividualSDB extends IndividualImpl implements Individual { // "<"+individualURI+"> a ?type . \n" + "<"+individualURI+"> <" + VitroVocabulary.MONIKER + "> ?moniker \n" + - "} WHERE { GRAPH {" + - "{ \n" + + "} WHERE {" + "{ <"+individualURI+"> <" + RDFS.label.getURI() + "> ?ooo } \n" + "UNION { <" + individualURI+"> <" + VitroVocabulary.MONIKER + - "> ?moniker } \n" + + "> ?moniker \n" + "} \n" + // "UNION { <" // + individualURI + "> a ?type } \n" + -// WebappDaoFactorySDB.getFilterBlock(graphVars, datasetMode) + - "} }"; + "}"; model = QueryExecutionFactory.create( QueryFactory.create(getStatements), dataset) .execConstruct(); @@ -163,7 +161,7 @@ public class IndividualSDB extends IndividualImpl implements Individual { OntModel ontModel = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM, model); - if (model.isEmpty()) { + if (model.isEmpty() && noTriplesFor(individualURI)) { throw new IndividualNotFoundException(); } @@ -173,6 +171,25 @@ public class IndividualSDB extends IndividualImpl implements Individual { this.webappDaoFactory = wadf; } + private boolean noTriplesFor(String individualURI) { + String ask = "ASK { <" + individualURI + "> ?p ?o }"; + DatasetWrapper w = getDatasetWrapper(); + Dataset dataset = w.getDataset(); + dataset.getLock().enterCriticalSection(Lock.READ); + try { + Query askQuery = QueryFactory.create(ask, Syntax.syntaxARQ); + QueryExecution qe = QueryExecutionFactory.create(askQuery, dataset); + try { + return !qe.execAsk(); + } finally { + qe.close(); + } + } finally { + dataset.getLock().leaveCriticalSection(); + w.close(); + } + } + private static final boolean SKIP_INITIALIZATION = true; public IndividualSDB(String individualURI, diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseObjectPropertyDataPostProcessor.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseObjectPropertyDataPostProcessor.java index dd67215e5..15727950a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseObjectPropertyDataPostProcessor.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/BaseObjectPropertyDataPostProcessor.java @@ -56,7 +56,11 @@ public abstract class BaseObjectPropertyDataPostProcessor implements protected void addName(Map map, String nameKey, String objectKey) { String name = map.get(nameKey); if (name == null) { - map.put(nameKey, getIndividual(map.get(objectKey)).getName()); + // getIndividual() could return null + Individual ind = getIndividual(map.get(objectKey)); + if (ind != null) { + map.put(nameKey, ind.getName()); + } } } diff --git a/webapp/web/config/listViewConfig-default.xml b/webapp/web/config/listViewConfig-default.xml index 1378c39e0..e15256429 100644 --- a/webapp/web/config/listViewConfig-default.xml +++ b/webapp/web/config/listViewConfig-default.xml @@ -11,9 +11,9 @@ PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?object ?name ?moniker WHERE { - GRAPH ?g1 { ?subject ?property ?object } - OPTIONAL { GRAPH ?g2 { ?object rdfs:label ?name } } - OPTIONAL { GRAPH ?g3 { ?object vitro:moniker ?moniker } } + ?subject ?property ?object + OPTIONAL { ?object rdfs:label ?name } + OPTIONAL { ?object vitro:moniker ?moniker } } @@ -22,15 +22,43 @@ PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#> - SELECT ?subclass ?object ?name ?moniker WHERE { - GRAPH ?g1 { ?subject ?property ?object } - OPTIONAL { GRAPH ?g2 { ?object rdfs:label ?name } } - OPTIONAL { GRAPH ?g3 { ?object vitro:moniker ?moniker } } - OPTIONAL { GRAPH ?g4 { ?object a ?subclass } } + SELECT ?subclass ?object ?name ?moniker { + ?subject ?property ?object + OPTIONAL { ?object a ?subclass } + OPTIONAL { ?object rdfs:label ?name } + OPTIONAL { ?object vitro:moniker ?moniker } FILTER ( afn:namespace(?subclass) != "http://vitro.mannlib.cornell.edu/ns/vitro/0.7#" ) } ORDER BY ?subclass - + + + PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#> + PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> + + CONSTRUCT { + ?subject ?property ?object . + ?object a ?subclass . + ?object rdfs:label ?name . + ?object vitro:moniker ?moniker + } WHERE { + { + ?subject ?property ?object + } + UNION { + ?subject ?property ?object . + ?object a ?subclass . + } + UNION { + ?subject ?property ?object . + ?object rdfs:label ?name . + } + UNION { + ?subject ?property ?object . + ?object vitro:moniker ?moniker . + } + } + + edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.DefaultListViewDataPostProcessor diff --git a/webapp/web/config/listViewConfig-vitroLink.xml b/webapp/web/config/listViewConfig-vitroLink.xml index ab5dbca18..b77c8c947 100644 --- a/webapp/web/config/listViewConfig-vitroLink.xml +++ b/webapp/web/config/listViewConfig-vitroLink.xml @@ -14,12 +14,25 @@ (afn:localname(?link) AS ?linkName) ?anchor ?url WHERE { - GRAPH ?g1 { ?subject ?property ?link } - OPTIONAL { GRAPH ?g2 { ?link vitro:linkAnchor ?anchor } } - OPTIONAL { GRAPH ?g3 { ?link vitro:linkURL ?url } } - OPTIONAL { GRAPH ?g4 { ?link vitro:linkDisplayRank ?rank } } + ?subject ?property ?link + OPTIONAL { ?link vitro:linkAnchor ?anchor } + OPTIONAL { ?link vitro:linkURL ?url } + OPTIONAL { ?link vitro:linkDisplayRank ?rank } } ORDER BY ?rank + + + CONSTRUCT { + ?subject ?property ?link . + ?link ?linkProp ?linkObj + } WHERE { + { ?subject ?property ?link } + UNION { + ?subject ?property ?link . + ?link ?linkProp ?linkObj + } + } +