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 b41f2630b..30ca46f6b 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 @@ -50,19 +50,19 @@ public class ObjectPropertyStatementDaoSDB extends return entity; else { Map uriToObjectProperty = new HashMap(); - //String[] graphVars = { "?g", "?h", "?i", "?j" }; + 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 { \n" + + "} WHERE { GRAPH ?g { \n" + " <" + entity.getURI() + "> ?p ?o \n" + - //" OPTIONAL { GRAPH ?h { ?o a ?oType } } \n" + - // " OPTIONAL { { ?o <" + RDFS.label.getURI() + "> ?oLabel } } \n" + - // " OPTIONAL { { ?o <" + VitroVocabulary.MONIKER + "> ?oMoniker } } \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" + - //WebappDaoFactorySDB.getFilterBlock(graphVars, datasetMode) + + WebappDaoFactorySDB.getFilterBlock(graphVars, datasetMode) + "}"; long startTime = System.currentTimeMillis(); Model m = null; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactoryJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactoryJena.java index 5f00ca7b2..83959c350 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactoryJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactoryJena.java @@ -204,7 +204,6 @@ public class WebappDaoFactoryJena implements WebappDaoFactory { union.addSubModel(inferences); } dataset.setDefaultModel(union); - dataset.addNamedModel("urn:x-arq:UnionGraph", union); return dataset; } 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 03cc1e07b..dd67215e5 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 @@ -44,7 +44,6 @@ public abstract class BaseObjectPropertyDataPostProcessor implements /** Postprocessing that applies to the list as a whole - reordering, removing duplicates, etc. */ protected void processList(List> data) { - objectPropertyTemplateModel.removeLessSpecificSolutions(data); objectPropertyTemplateModel.removeDuplicates(data); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java index a4f4fd87b..bbbed7033 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java @@ -236,68 +236,6 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel } } - /** - * For performance reasons, we've had to rewrite SPARQL queries that would - * naturally use OPTIONAL blocks to use UNIONs instead. These UNION queries - * return a superset of the solutions returned by the originals. This - * method filters out the unwanted solutions with extra null values. - * - * This operation is polynomial time in the worst case, but should be linear - * with the actual queries used for list views. The ORDER BY clauses - * should minimize the seek distance for solution elimination. - * - * @param List> data - */ - protected void removeLessSpecificSolutions(List> data) { - List> redundantSolns = - new ArrayList>(); - for (int i = 0; i < data.size(); i++) { - Map soln = data.get(i); - boolean redundantSoln = false; - // seek forward - int j = i + 1; - while (!redundantSoln && (j < data.size())) { - redundantSoln = isEqualToOrLessSpecificThan(soln, data.get(j)); - j++; - } - // loop back around - j = 0; - while (!redundantSoln && (j < i)) { - redundantSoln = isEqualToOrLessSpecificThan(soln, data.get(j)); - j++; - } - if (redundantSoln) { - redundantSolns.add(soln); - } - } - data.removeAll(redundantSolns); - } - - /** - * Returns true if soln1 is equal to or less specific (i.e., has more null - * values) than soln2 - * @param List> soln1 - * @param List> soln2 - */ - private boolean isEqualToOrLessSpecificThan (Map soln1, - Map soln2) { - if (soln1.keySet().size() < soln2.keySet().size()) { - return true; - } - for (String key : soln1.keySet()) { - String value1 = soln1.get(key); - String value2 = soln2.get(key); - if (value2 == null && value1 != null) { - return false; - } - if (value1 != null && value2 != null && !value1.equals(value2)) { - return false; - } - } - return true; - } - - /** The SPARQL query results may contain duplicate rows for a single object, if there are multiple solutions * to the entire query. Remove duplicates here by arbitrarily selecting only the first row returned. * @param List> data diff --git a/webapp/web/config/listViewConfig-default.xml b/webapp/web/config/listViewConfig-default.xml index 33d781186..73cb92fd7 100644 --- a/webapp/web/config/listViewConfig-default.xml +++ b/webapp/web/config/listViewConfig-default.xml @@ -11,21 +11,9 @@ PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?object ?name ?moniker { - { - ?subject ?property ?object . - } - UNION { - ?subject ?property ?object . - ?object rdfs:label ?name - } - UNION { - ?subject ?property ?object . - ?object vitro:moniker ?moniker - } UNION { - ?subject ?property ?object . - ?object rdfs:label ?name . - ?object vitro:moniker ?moniker . - } + GRAPH ?g1 { ?subject ?property ?object } + OPTIONAL { GRAPH ?g2 { ?object rdfs:label ?name } } + OPTIONAL { GRAPH ?g3 { ?object vitro:moniker ?moniker } } } @@ -34,28 +22,11 @@ PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?subclass ?object ?name ?moniker { - - { - ?subject ?property ?object . - ?object a ?subclass . + GRAPH ?g1 { ?subject ?property ?object + OPTIONAL { ?object a ?subclass } } - UNION { - ?subject ?property ?object . - ?object a ?subclass . - ?object rdfs:label ?name - } - UNION { - ?subject ?property ?object . - ?object a ?subclass . - ?object vitro:moniker ?moniker - } UNION { - ?subject ?property ?object . - ?object a ?subclass . - ?object rdfs:label ?name . - ?object vitro:moniker ?moniker . - } - - + OPTIONAL { GRAPH ?g2 { ?object rdfs:label ?name } } + OPTIONAL { GRAPH ?g3 { ?object vitro:moniker ?moniker } } } ORDER BY ?subclass diff --git a/webapp/web/config/listViewConfig-vitroLink.xml b/webapp/web/config/listViewConfig-vitroLink.xml index accf9f1b9..ab5dbca18 100644 --- a/webapp/web/config/listViewConfig-vitroLink.xml +++ b/webapp/web/config/listViewConfig-vitroLink.xml @@ -14,10 +14,10 @@ (afn:localname(?link) AS ?linkName) ?anchor ?url WHERE { - ?subject ?property ?link - OPTIONAL { ?link vitro:linkAnchor ?anchor } - OPTIONAL { ?link vitro:linkURL ?url } - OPTIONAL { ?link vitro:linkDisplayRank ?rank } + 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 } } } ORDER BY ?rank