From 423ec922d89a7822f3cc175fa62fb469daebc427 Mon Sep 17 00:00:00 2001 From: brianjlowe Date: Wed, 9 May 2012 19:14:09 +0000 Subject: [PATCH] work on triple store independence including NIHVIVO-3751 NIHVIVO-3644 NIHVIVO-3743 and NIHVIVO-3745 --- .../Classes2ClassesOperationController.java | 2 +- .../edit/RestrictionOperationController.java | 267 ++++++++++-------- .../individual/IndividualResponseBuilder.java | 2 +- .../webapp/dao/jena/DataPropertyDaoJena.java | 8 +- .../dao/jena/ObjectPropertyDaoJena.java | 4 +- .../vitro/webapp/dao/jena/SparqlDataset.java | 35 +-- .../vitro/webapp/dao/jena/SparqlGraph.java | 28 +- .../dao/jena/SparqlGraphBulkUpdater.java | 85 +++++- .../vitro/webapp/dao/jena/VClassDaoJena.java | 23 +- .../filters/WebappDaoFactorySDBPrep.java | 7 +- .../setup/JenaDataSourceSetupSparql2.java | 6 +- 11 files changed, 297 insertions(+), 170 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/Classes2ClassesOperationController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/Classes2ClassesOperationController.java index 292524c72..886828b4b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/Classes2ClassesOperationController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/Classes2ClassesOperationController.java @@ -57,7 +57,7 @@ public class Classes2ClassesOperationController extends BaseEditController { return; } - VClassDao vcDao = request.getFullWebappDaoFactory().getVClassDao(); + VClassDao vcDao = request.getAssertionsWebappDaoFactory().getVClassDao(); String modeStr = request.getParameter("opMode"); modeStr = (modeStr == null) ? "" : modeStr; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/RestrictionOperationController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/RestrictionOperationController.java index 3af9fbb1e..c822a5fc1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/RestrictionOperationController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/RestrictionOperationController.java @@ -15,9 +15,12 @@ import com.hp.hpl.jena.datatypes.RDFDatatype; import com.hp.hpl.jena.datatypes.TypeMapper; import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.ontology.OntProperty; import com.hp.hpl.jena.ontology.Restriction; import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.shared.Lock; @@ -57,129 +60,12 @@ public class RestrictionOperationController extends BaseEditController { if (epo == null) { response.sendRedirect(defaultLandingPage); return; - } - - // TODO: I need to de-spaghettify this and remap this controller, now that I know what I'm doing + } - if ( (request.getParameter("_cancel") == null ) ) { - - ontModel.enterCriticalSection(Lock.WRITE); - try { - - ontModel.getBaseModel().notifyEvent(new EditEvent(request.getFullWebappDaoFactory().getUserURI(),true)); - - if ( request.getParameter("_action") != null && request.getParameter("_action").equals("delete") ) { - - String restId = request.getParameter("restrictionId"); - - if (restId != null) { - - OntClass restrictedClass = ontModel.getOntClass( request.getParameter( "classUri" ) ); - - OntClass rest = null; - - for ( Iterator i = restrictedClass.listEquivalentClasses(); i.hasNext(); ) { - OntClass equivClass = (OntClass) i.next(); - if (equivClass.isAnon() && equivClass.getId().toString().equals(restId)) { - rest = equivClass; - } - } - - if ( rest == null ) { - for ( Iterator i = restrictedClass.listSuperClasses(); i.hasNext(); ) { - OntClass superClass = (OntClass) i.next(); - if (superClass.isAnon() && superClass.getId().toString().equals(restId)) { - rest = superClass; - } - } - } - - if ( rest != null ) { - rest.remove(); - } - - } - - } else { - - OntProperty onProperty = ontModel.getOntProperty( (String) request.getParameter("onProperty") ); - - String conditionTypeStr = request.getParameter("conditionType"); - - String restrictionTypeStr = (String) epo.getAttribute("restrictionType"); - Restriction rest = null; - - OntClass ontClass = ontModel.getOntClass( (String) epo.getAttribute("VClassURI") ); - - String roleFillerURIStr = request.getParameter("ValueClass"); - Resource roleFiller = null; - if (roleFillerURIStr != null) { - roleFiller = ontModel.getResource(roleFillerURIStr); - } - - int cardinality = -1; - String cardinalityStr = request.getParameter("cardinality"); - if (cardinalityStr != null) { - cardinality = Integer.decode(cardinalityStr); - } - - if (restrictionTypeStr.equals("allValuesFrom")) { - rest = ontModel.createAllValuesFromRestriction(null,onProperty,roleFiller); - } else if (restrictionTypeStr.equals("someValuesFrom")) { - rest = ontModel.createSomeValuesFromRestriction(null,onProperty,roleFiller); - } else if (restrictionTypeStr.equals("hasValue")) { - String valueURI = request.getParameter("ValueIndividual"); - if (valueURI != null) { - Resource valueRes = ontModel.getResource(valueURI); - if (valueRes != null) { - rest = ontModel.createHasValueRestriction(null, onProperty, valueRes); - } - } else { - String valueLexicalForm = request.getParameter("ValueLexicalForm"); - if (valueLexicalForm != null) { - String valueDatatype = request.getParameter("ValueDatatype"); - Literal value = null; - if (valueDatatype != null && valueDatatype.length() > 0) { - RDFDatatype dtype = null; - try { - dtype = TypeMapper.getInstance().getSafeTypeByName(valueDatatype); - } catch (Exception e) { - log.warn ("Unable to get safe type " + valueDatatype + " using TypeMapper"); - } - if (dtype != null) { - value = ontModel.createTypedLiteral(valueLexicalForm, dtype); - } else { - value = ontModel.createLiteral(valueLexicalForm); - } - } else { - value = ontModel.createLiteral(valueLexicalForm); - } - rest = ontModel.createHasValueRestriction(null, onProperty, value); - } - } - } else if (restrictionTypeStr.equals("minCardinality")) { - rest = ontModel.createMinCardinalityRestriction(null,onProperty,cardinality); - } else if (restrictionTypeStr.equals("maxCardinality")) { - rest = ontModel.createMaxCardinalityRestriction(null,onProperty,cardinality); - } else if (restrictionTypeStr.equals("cardinality")) { - rest = ontModel.createCardinalityRestriction(null,onProperty,cardinality); - } - - if (conditionTypeStr.equals("necessary")) { - ontClass.addSuperClass(rest); - } else if (conditionTypeStr.equals("necessaryAndSufficient")) { - ontClass.addEquivalentClass(rest); - } - - } - - } finally { - ontModel.getBaseModel().notifyEvent(new EditEvent(request.getFullWebappDaoFactory().getUserURI(),false)); - ontModel.leaveCriticalSection(); - } - + if ( (request.getParameter("_cancel") == null ) ) { + processRestriction(request, epo, ontModel); } - + //if no page forwarder was set, just go back to referring page: String referer = epo.getReferer(); if (referer == null) { @@ -198,7 +84,144 @@ public class RestrictionOperationController extends BaseEditController { throw new RuntimeException(f); } } - } + + private void processRestriction(VitroRequest request, EditProcessObject epo, OntModel ontModel) { + ontModel.enterCriticalSection(Lock.WRITE); + try { + + ontModel.getBaseModel().notifyEvent(new EditEvent(request.getFullWebappDaoFactory().getUserURI(),true)); + + if ("delete".equals(request.getParameter("_action"))) { + processDelete(request, ontModel); + } else { + processCreate(request, epo, ontModel); + } + + } finally { + ontModel.getBaseModel().notifyEvent(new EditEvent(request.getFullWebappDaoFactory().getUserURI(),false)); + ontModel.leaveCriticalSection(); + } + + } + private void processDelete(VitroRequest request, OntModel ontModel) { + + String restId = request.getParameter("restrictionId"); + + if (restId != null) { + + OntClass restrictedClass = ontModel.getOntClass( request.getParameter( "classUri" ) ); + + OntClass rest = null; + + for ( Iterator i = restrictedClass.listEquivalentClasses(); i.hasNext(); ) { + OntClass equivClass = (OntClass) i.next(); + if (equivClass.isAnon() && equivClass.getId().toString().equals(restId)) { + rest = equivClass; + } + } + + if ( rest == null ) { + for ( Iterator i = restrictedClass.listSuperClasses(); i.hasNext(); ) { + OntClass superClass = (OntClass) i.next(); + if (superClass.isAnon() && superClass.getId().toString().equals(restId)) { + rest = superClass; + } + } + } + + /** + * removing by graph subtraction so that statements with blank nodes + * stick together and are processed appropriately by the bulk update + * handler + */ + if ( rest != null ) { + Model temp = ModelFactory.createDefaultModel(); + temp.add(rest.listProperties()); + ontModel.getBaseModel().remove(temp); + } + + } + } + + private void processCreate(VitroRequest request, EditProcessObject epo, OntModel origModel) { + + Model temp = ModelFactory.createDefaultModel(); + Model dynamicUnion = ModelFactory.createUnion(temp, origModel); + OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, dynamicUnion); + + OntProperty onProperty = ontModel.getOntProperty( (String) request.getParameter("onProperty") ); + + String conditionTypeStr = request.getParameter("conditionType"); + + String restrictionTypeStr = (String) epo.getAttribute("restrictionType"); + Restriction rest = null; + + OntClass ontClass = ontModel.getOntClass( (String) epo.getAttribute("VClassURI") ); + + String roleFillerURIStr = request.getParameter("ValueClass"); + Resource roleFiller = null; + if (roleFillerURIStr != null) { + roleFiller = ontModel.getResource(roleFillerURIStr); + } + + int cardinality = -1; + String cardinalityStr = request.getParameter("cardinality"); + if (cardinalityStr != null) { + cardinality = Integer.decode(cardinalityStr); + } + + if (restrictionTypeStr.equals("allValuesFrom")) { + rest = ontModel.createAllValuesFromRestriction(null,onProperty,roleFiller); + } else if (restrictionTypeStr.equals("someValuesFrom")) { + rest = ontModel.createSomeValuesFromRestriction(null,onProperty,roleFiller); + } else if (restrictionTypeStr.equals("hasValue")) { + String valueURI = request.getParameter("ValueIndividual"); + if (valueURI != null) { + Resource valueRes = ontModel.getResource(valueURI); + if (valueRes != null) { + rest = ontModel.createHasValueRestriction(null, onProperty, valueRes); + } + } else { + String valueLexicalForm = request.getParameter("ValueLexicalForm"); + if (valueLexicalForm != null) { + String valueDatatype = request.getParameter("ValueDatatype"); + Literal value = null; + if (valueDatatype != null && valueDatatype.length() > 0) { + RDFDatatype dtype = null; + try { + dtype = TypeMapper.getInstance().getSafeTypeByName(valueDatatype); + } catch (Exception e) { + log.warn ("Unable to get safe type " + valueDatatype + " using TypeMapper"); + } + if (dtype != null) { + value = ontModel.createTypedLiteral(valueLexicalForm, dtype); + } else { + value = ontModel.createLiteral(valueLexicalForm); + } + } else { + value = ontModel.createLiteral(valueLexicalForm); + } + rest = ontModel.createHasValueRestriction(null, onProperty, value); + } + } + } else if (restrictionTypeStr.equals("minCardinality")) { + rest = ontModel.createMinCardinalityRestriction(null,onProperty,cardinality); + } else if (restrictionTypeStr.equals("maxCardinality")) { + rest = ontModel.createMaxCardinalityRestriction(null,onProperty,cardinality); + } else if (restrictionTypeStr.equals("cardinality")) { + rest = ontModel.createCardinalityRestriction(null,onProperty,cardinality); + } + + if (conditionTypeStr.equals("necessary")) { + ontClass.addSuperClass(rest); + } else if (conditionTypeStr.equals("necessaryAndSufficient")) { + ontClass.addEquivalentClass(rest); + } + + origModel.add(temp); + + } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualResponseBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualResponseBuilder.java index ee4e28960..6d273f9cc 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualResponseBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualResponseBuilder.java @@ -176,7 +176,7 @@ class IndividualResponseBuilder { private IndividualTemplateModel getIndividualTemplateModel( Individual individual) { - individual.sortForDisplay(); + //individual.sortForDisplay(); return new IndividualTemplateModel(individual, vreq); } 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 f0d6f4c3e..35cdb324c 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 @@ -671,7 +671,7 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements static { List namespaceFilters = new ArrayList(); for (String namespace : EXCLUDED_NAMESPACES) { - namespaceFilters.add("( afn:namespace(?property) != \"" + namespace + "\" )"); + namespaceFilters.add("( !regex(str(?property), \"^" + namespace + "\" ))"); } PROPERTY_FILTERS = StringUtils.join(namespaceFilters, " && "); } @@ -683,11 +683,11 @@ public class DataPropertyDaoJena extends PropertyDaoJena implements " ?property a owl:DatatypeProperty . \n" + " FILTER ( \n" + " isLiteral(?object) && \n" + - " ( afn:namespace(?property) != \"" + VitroVocabulary.PUBLIC + "\" ) && \n" + - " ( afn:namespace(?property) != \"" + VitroVocabulary.OWL + "\" ) && \n" + + " ( !regex(str(?property), \"^" + VitroVocabulary.PUBLIC + "\" )) && \n" + + " ( !regex(str(?property), \"^" + VitroVocabulary.OWL + "\" )) && \n" + // NIHVIVO-2790 vitro:moniker has been deprecated, but display existing values for editorial management (deletion is encouraged). // This property will be hidden from public display by default. - " ( ?property = <" + VitroVocabulary.MONIKER + "> || afn:namespace(?property) != \"" + VitroVocabulary.vitroURI + "\" ) \n" + + " ( ?property = <" + VitroVocabulary.MONIKER + "> || !regex(str(?property), \"^" + VitroVocabulary.vitroURI + "\" )) \n" + " ) \n" + "}"; 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 49de9b8ed..1c71bcc48 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 @@ -785,12 +785,12 @@ public class ObjectPropertyDaoJena extends PropertyDaoJena implements ObjectProp static { List namespaceFilters = new ArrayList(); for (String namespace : EXCLUDED_NAMESPACES) { - namespaceFilters.add("( afn:namespace(?property) != \"" + namespace + "\" )"); + namespaceFilters.add("( !regex(str(?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#\" )"); + "!regex(str(?property), \"^http://vitro.mannlib.cornell.edu/ns/vitro/0.7#\" ))"); PROPERTY_FILTERS = StringUtils.join(namespaceFilters, " && "); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlDataset.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlDataset.java index 0e5d4187d..3fd3043c3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlDataset.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlDataset.java @@ -1,59 +1,62 @@ package edu.cornell.mannlib.vitro.webapp.dao.jena; +import java.util.ArrayList; import java.util.Iterator; +import com.hp.hpl.jena.graph.Node; import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.sparql.core.DatasetGraph; public class SparqlDataset implements Dataset { - private String endpointURI; + private SparqlDatasetGraph g; - public SparqlDataset(String endpointURI) { - this.endpointURI = endpointURI; + public SparqlDataset(SparqlDatasetGraph g) { + this.g = g; } @Override public DatasetGraph asDatasetGraph() { - // TODO Auto-generated method stub - return null; + return g; } @Override public void close() { - // TODO Auto-generated method stub - + g.close(); } @Override public boolean containsNamedModel(String arg0) { - return true; + return g.containsGraph(Node.createURI(arg0)); } @Override public Model getDefaultModel() { - // TODO Auto-generated method stub - return null; + return ModelFactory.createModelForGraph(g.getDefaultGraph()); } @Override public Lock getLock() { - // TODO Auto-generated method stub - return null; + return g.getLock(); } @Override public Model getNamedModel(String arg0) { - // TODO Auto-generated method stub - return null; + return ModelFactory.createModelForGraph(g.getGraph(Node.createURI(arg0))); } @Override public Iterator listNames() { - // TODO Auto-generated method stub - return null; + ArrayList nameList = new ArrayList(); + Iterator nodeIt = g.listGraphNodes(); + while (nodeIt.hasNext()) { + Node n = nodeIt.next(); + nameList.add(n.getURI()); + } + return nameList.iterator(); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java index bbba9e691..33dbd0fb2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraph.java @@ -131,7 +131,11 @@ public class SparqlGraph implements GraphWithPerform { + sparqlNodeUpdate(t.getObject(), "") + " } " + ((graphURI != null) ? " } " : ""); - //log.info(updateString); + + if (graphURI != null) { + log.info("=====> update to graph " + graphURI); + } + log.info(updateString); executeUpdate(updateString); @@ -195,7 +199,6 @@ public class SparqlGraph implements GraphWithPerform { @Override public void delete(Triple arg0) throws DeleteDeniedException { - //log.info("********************** DELETE!!!!!! ************************"); performDelete(arg0); } @@ -228,7 +231,7 @@ public class SparqlGraph implements GraphWithPerform { literalBuff.append("^^<").append(node.getLiteralDatatypeURI()).append(">"); } else if (node.getLiteralLanguage() != null && node.getLiteralLanguage() != "") { literalBuff.append("@").append(node.getLiteralLanguage()); -; } + } return literalBuff.toString(); } else { return varName; @@ -243,6 +246,14 @@ public class SparqlGraph implements GraphWithPerform { } } + public static String sparqlNodeDelete(Node node, String varName) { + if (node.isBlank()) { + return "?" + node.getBlankNodeLabel().replaceAll("\\W", ""); + } else { + return sparqlNode(node, varName); + } + } + @Override public ExtendedIterator find(Node subject, Node predicate, Node object) { if (!isVar(subject) && !isVar(predicate) && !isVar(object)) { @@ -265,7 +276,16 @@ public class SparqlGraph implements GraphWithPerform { findQuery.append(" } "); } findQuery.append("\n}"); - ResultSet rs = execSelect(findQuery.toString()); + + String queryString = findQuery.toString(); + //log.info(queryString); + +// //TODO remove me +// if (queryString.contains("individual/AI") && queryString.contains("label")) { +// throw new RuntimeException("break!"); +// } + + ResultSet rs = execSelect(queryString); //rs = execSelect(findQuery.toString()); //rs = execSelect(findQuery.toString()); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphBulkUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphBulkUpdater.java index 4a1c5a152..e4bd83c02 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphBulkUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SparqlGraphBulkUpdater.java @@ -65,6 +65,21 @@ public class SparqlGraphBulkUpdater extends SimpleBulkUpdateHandler { @Override public void add(Graph g, boolean arg1) { + log.info("adding graph"); + Model[] model = separateStatementsWithBlankNodes(g); + addModel(model[1] /* nonBlankNodeModel */); + // replace following call with different method + addModel(model[0] /*blankNodeModel*/); + } + + /** + * Returns a pair of models. The first contains any statement containing at + * least one blank node. The second contains all remaining statements. + * @param g + * @return + */ + + private Model[] separateStatementsWithBlankNodes(Graph g) { Model gm = ModelFactory.createModelForGraph(g); Model blankNodeModel = ModelFactory.createDefaultModel(); Model nonBlankNodeModel = ModelFactory.createDefaultModel(); @@ -77,12 +92,68 @@ public class SparqlGraphBulkUpdater extends SimpleBulkUpdateHandler { blankNodeModel.add(stmt); } } - addModel(nonBlankNodeModel); - // replace following call with different method - addModel(blankNodeModel); + Model[] result = new Model[2]; + result[0] = blankNodeModel; + result[1] = nonBlankNodeModel; + return result; + } + + + @Override + public void delete(Graph g, boolean withReifications) { + delete(g); + } + + @Override + public void delete(Graph g) { + Model[] model = separateStatementsWithBlankNodes(g); + deleteModel(model[1] /*statements without blank nodes*/); + // replace blank nodes in remaining statements with variables + + StringBuffer patternBuff = new StringBuffer(); + Iterator tripIt = g.find(null, null, null); + while(tripIt.hasNext()) { + Triple t = tripIt.next(); + patternBuff.append(SparqlGraph.sparqlNodeDelete(t.getSubject(), null)); + patternBuff.append(" "); + patternBuff.append(SparqlGraph.sparqlNodeDelete(t.getPredicate(), null)); + patternBuff.append(" "); + patternBuff.append(SparqlGraph.sparqlNodeDelete(t.getObject(), null)); + patternBuff.append(" .\n"); + } + + StringBuffer queryBuff = new StringBuffer(); + String graphURI = graph.getGraphURI(); + queryBuff.append("DELETE { " + ((graphURI != null) ? "GRAPH <" + graphURI + "> { " : "" ) + " \n"); + queryBuff.append(patternBuff); + if (graphURI != null) { + queryBuff.append(" } \n"); + } + queryBuff.append("} WHERE { \n"); + if (graphURI != null) { + queryBuff.append(" GRAPH <" + graphURI + "> { \n"); + } + queryBuff.append(patternBuff); + if (graphURI != null) { + queryBuff.append(" } \n"); + } + queryBuff.append("} \n"); + + log.debug(queryBuff.toString()); + + graph.executeUpdate(queryBuff.toString()); + } public void addModel(Model model) { + verbModel(model, "INSERT"); + } + + public void deleteModel(Model model) { + verbModel(model, "DELETE"); + } + + private void verbModel(Model model, String verb) { Model m = ModelFactory.createDefaultModel(); int testLimit = 1000; StmtIterator stmtIt = model.listStatements(); @@ -96,7 +167,7 @@ public class SparqlGraphBulkUpdater extends SimpleBulkUpdateHandler { m.write(sw, "N-TRIPLE"); StringBuffer updateStringBuff = new StringBuffer(); String graphURI = graph.getGraphURI(); - updateStringBuff.append("INSERT DATA { " + ((graphURI != null) ? "GRAPH <" + graphURI + "> { " : "" )); + updateStringBuff.append(verb + " DATA { " + ((graphURI != null) ? "GRAPH <" + graphURI + "> { " : "" )); updateStringBuff.append(sw); updateStringBuff.append(((graphURI != null) ? " } " : "") + " }"); @@ -132,11 +203,7 @@ public class SparqlGraphBulkUpdater extends SimpleBulkUpdateHandler { } public static void removeAll(Graph g, Node s, Node p, Node o) - { - // OK, so the strategy here should be to remove all triples without blank nodes first - // Then, feel the entire remaining part of the graph as a DELETE WHERE - // with the blank nodes as variables? - + { ExtendedIterator it = g.find( s, p, o ); try { while (it.hasNext()) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassDaoJena.java index e33d777c1..93e5b28c3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassDaoJena.java @@ -38,6 +38,7 @@ 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.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; @@ -620,9 +621,13 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao { supURIs.add(getClassURIStr(cls)); } } catch (Exception e) { - //TODO make this attempt respect the direct argument - // we'll try this again using a different method that doesn't try to convert to OntClass - List supList = this.listDirectObjectPropertyValues(getOntModel().getResource(classURI), RDFS.subClassOf); + log.debug(e,e); + // we'll try this again using a different method + // that doesn't try to convert to OntClass + supURIs.clear(); + List supList = (direct) + ? listDirectObjectPropertyValues(subClass, RDFS.subClassOf) + : listObjectPropertyValues(subClass, RDFS.subClassOf); for (Resource res : supList) { supURIs.add(getClassURIStr(res)); } @@ -630,6 +635,18 @@ public class VClassDaoJena extends JenaBaseDao implements VClassDao { return supURIs; } + private List listObjectPropertyValues(Resource res, Property prop) { + List values = new ArrayList(); + StmtIterator stmtIt = res.listProperties(prop); + while (stmtIt.hasNext()) { + Statement s = stmtIt.nextStatement(); + if (s.getObject().isResource()) { + values.add(s.getObject().asResource()); + } + } + return values; + } + public VClass getTopConcept() { VClass top = new VClass(); if (getOntModel().getProfile().NAMESPACE().equals(RDFS.getURI())) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySDBPrep.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySDBPrep.java index e774cc32b..9c2a14a48 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySDBPrep.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/WebappDaoFactorySDBPrep.java @@ -28,9 +28,7 @@ import org.apache.commons.logging.LogFactory; import com.hp.hpl.jena.graph.Graph; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; -import com.hp.hpl.jena.query.DataSource; import com.hp.hpl.jena.query.Dataset; -import com.hp.hpl.jena.query.DatasetFactory; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.sdb.SDBFactory; @@ -43,10 +41,9 @@ import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactoryConfig; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; -import edu.cornell.mannlib.vitro.webapp.dao.jena.SingleContentOntModelSelector; +import edu.cornell.mannlib.vitro.webapp.dao.jena.SparqlDataset; import edu.cornell.mannlib.vitro.webapp.dao.jena.SparqlDatasetGraph; import edu.cornell.mannlib.vitro.webapp.dao.jena.SparqlGraphMultilingual; -import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena; import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB; import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase; @@ -198,7 +195,7 @@ public class WebappDaoFactorySDBPrep implements Filter { OntModel om = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, m); //oms = new SingleContentOntModelSelector(om, oms.getDisplayModel(), oms.getUserAccountsModel()); - Dataset dataset = DatasetFactory.create(new SparqlDatasetGraph(endpointURI)); + Dataset dataset = new SparqlDataset(new SparqlDatasetGraph(endpointURI)); //DataSource datasource = DatasetFactory.create(); //datasource.addNamedModel("fake:fake", m); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSparql2.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSparql2.java index c1c8050bb..40fbcc7a7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSparql2.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSparql2.java @@ -19,7 +19,6 @@ import com.hp.hpl.jena.graph.Graph; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.query.Dataset; -import com.hp.hpl.jena.query.DatasetFactory; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; @@ -32,7 +31,6 @@ import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; -import com.hp.hpl.jena.sdb.SDB; import com.hp.hpl.jena.sdb.SDBFactory; import com.hp.hpl.jena.sdb.Store; import com.hp.hpl.jena.sdb.StoreDesc; @@ -54,6 +52,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelSynchronizer; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelectorImpl; +import edu.cornell.mannlib.vitro.webapp.dao.jena.SparqlDataset; import edu.cornell.mannlib.vitro.webapp.dao.jena.SparqlDatasetGraph; import edu.cornell.mannlib.vitro.webapp.dao.jena.SparqlGraph; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaModelMaker; @@ -129,7 +128,7 @@ public class JenaDataSourceSetupSparql2 extends JenaDataSourceSetupBase ctx).getProperty("VitroConnection.DataSource.endpointURI"); Graph g = new SparqlGraph(endpointURI); - Dataset dataset = DatasetFactory.create(new SparqlDatasetGraph(endpointURI)); + Dataset dataset = new SparqlDataset(new SparqlDatasetGraph(endpointURI)); setStartupDataset(dataset, ctx); // setStartupDataset(SDBFactory.connectDataset(store), ctx); @@ -191,6 +190,7 @@ public class JenaDataSourceSetupSparql2 extends JenaDataSourceSetupBase tboxAssertions.getBaseModel().register(new ModelSynchronizer( tboxAssertionsDB)); + baseOms.setTBoxModel(tboxAssertions); } catch (Throwable e) { log.error("Unable to load tbox assertion cache from DB", e);