From cd28028fb3f696add28431f16fed0c8e6a18c487 Mon Sep 17 00:00:00 2001 From: brianjlowe Date: Tue, 15 Oct 2013 15:48:25 -0400 Subject: [PATCH] VIVO-366 change to annotation-to-PropertyConfig converter to deal with multiple values --- .../ontology/update/KnowledgeBaseUpdater.java | 24 ++-- .../webapp/ontology/update/TBoxUpdater.java | 123 +++++++++--------- 2 files changed, 70 insertions(+), 77 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java index b4f211c97..90707edca 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java @@ -93,18 +93,6 @@ public class KnowledgeBaseUpdater { List rawChanges = getAtomicOntologyChanges(); AtomicOntologyChangeLists changes = new AtomicOntologyChangeLists(rawChanges,settings.getNewTBoxModel(),settings.getOldTBoxModel()); - - // Only modify the TBox and migration metadata the first time - if(updateRequired(servletContext)) { - //process the TBox before the ABox - try { - log.debug("\tupdating tbox annotations"); - updateTBoxAnnotations(); - } catch (Exception e) { - log.error(e,e); - } - - } // update ABox data any time log.info("performing SPARQL CONSTRUCT additions"); @@ -124,6 +112,18 @@ public class KnowledgeBaseUpdater { performSparqlConstructs(settings.getSparqlConstructDeletionsDir() + "/post/", settings.getRDFService(), RETRACT); + + // Only modify the TBox and migration metadata the first time + if(updateRequired(servletContext)) { + //process the TBox before the ABox + try { + log.debug("\tupdating tbox annotations"); + updateTBoxAnnotations(); + } catch (Exception e) { + log.error(e,e); + } + + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/TBoxUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/TBoxUpdater.java index cf81d4092..9c37e1544 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/TBoxUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/TBoxUpdater.java @@ -450,90 +450,69 @@ public class TBoxUpdater { } public void renameProperty(AtomicOntologyChange changeObj) throws IOException { - Dataset dataset = new RDFServiceDataset(settings.getRDFService()); - Model userAnnotationsModel = dataset.getNamedModel( - JenaDataSourceSetupBase.JENA_TBOX_ASSERTIONS_MODEL); if(changeObj.getNotes() != null && changeObj.getNotes().startsWith("cc:")) { - mergePropertyAnnotationsToPropertyConfig(changeObj, userAnnotationsModel); + mergePropertyAnnotationsToPropertyConfig(changeObj, siteModel); } - Resource renamedProperty = userAnnotationsModel.getResource(changeObj.getSourceURI()); - userAnnotationsModel.removeAll(renamedProperty, null, (RDFNode) null); - userAnnotationsModel.removeAll(null, null, renamedProperty); + Resource renamedProperty = siteModel.getResource(changeObj.getSourceURI()); + siteModel.removeAll(renamedProperty, null, (RDFNode) null); + siteModel.removeAll(null, null, renamedProperty); } private void mergePropertyAnnotationsToPropertyConfig(AtomicOntologyChange changeObj, Model userAnnotationsModel) throws IOException { String contextURI = VitroVocabulary.PROPERTY_CONFIG_DATA + changeObj.getNotes().substring(3); String oldPropertyURI = changeObj.getSourceURI(); - Model oldAnnotationsModel = settings.getOldTBoxAnnotationsModel(); String propertyAnnotationsQuery = "PREFIX config: <" + VitroVocabulary.configURI + "> \n" + "PREFIX vitro: <" + VitroVocabulary.vitroURI + "> \n" + "CONSTRUCT { \n" + - " <" + oldPropertyURI + "> vitro:inPropertyGroupAnnot ?group . \n" + " <" + oldPropertyURI + "> <" + RDFS.label.getURI() + "> ?label . \n" + - " <" + oldPropertyURI + "> vitro:displayRankAnnot ?displayRank . \n" + - " <" + oldPropertyURI + "> vitro:customEntryFormAnnot ?customForm . \n" + - " <" + oldPropertyURI + "> vitro:hiddenFromDisplayBelowRoleLevelAnnot ?displayLevel . \n" + - " <" + oldPropertyURI + "> vitro:prohibitedFromUpdateBelowRoleLevelAnnot ?updateLevel . \n " + + " <" + oldPropertyURI + "> ?vitroProp ?vitroValue \n" + "} WHERE { \n" + - " { <" + oldPropertyURI + "> vitro:inPropertyGroupAnnot ?group } \n" + - " UNION { <" + oldPropertyURI + "> <" + RDFS.label.getURI() + "> ?label } \n" + - " UNION { <" + oldPropertyURI + "> vitro:displayRankAnnot ?displayRank } \n" + - " UNION { <" + oldPropertyURI + "> vitro:customEntryFormAnnot ?customForm } \n" + - " UNION { <" + oldPropertyURI + "> vitro:hiddenFromDisplayBelowRoleLevelAnnot ?displayLevel } \n" + - " UNION { <" + oldPropertyURI + "> vitro:prohibitedFromUpdateBelowRoleLevelAnnot ?updateLevel } \n " + + " { <" + oldPropertyURI + "> <" + RDFS.label.getURI() + "> ?label } \n" + + " UNION { <" + oldPropertyURI + "> ?vitroProp ?vitroValue \n" + + " FILTER (regex(str(?vitroProp), \"" + VitroVocabulary.vitroURI + "\")) } \n" + "} \n" ; Model userChangesModel = construct( propertyAnnotationsQuery, userAnnotationsModel).difference( construct(propertyAnnotationsQuery, oldAnnotationsModel)); - String addQuery = "PREFIX config: <" + VitroVocabulary.configURI + "> \n" + - "PREFIX vitro: <" + VitroVocabulary.vitroURI + "> \n" + - "CONSTRUCT { \n" + - " ?configuration config:propertyGroup ?group . \n" + - " ?configuration config:displayName ?label . \n" + - " ?configuration vitro:displayRankAnnot ?displayRank . \n" + - " ?configuration vitro:customEntryFormAnnot ?customForm . \n" + - " ?configuration vitro:hiddenFromDisplayBelowRoleLevelAnnot ?displayLevel . \n" + - " ?configuration vitro:prohibitedFromUpdateBelowRoleLevelAnnot ?updateLevel . \n " + - "} WHERE { \n" + - " <" + contextURI + "> config:hasConfiguration ?configuration . \n" + - " OPTIONAL { <" + oldPropertyURI + "> vitro:inPropertyGroupAnnot ?group } \n" + - " OPTIONAL { <" + oldPropertyURI + "> <" + RDFS.label.getURI() + "> ?label } \n" + - " OPTIONAL { <" + oldPropertyURI + "> vitro:displayRankAnnot ?displayRank } \n" + - " OPTIONAL { <" + oldPropertyURI + "> vitro:customEntryFormAnnot ?customForm } \n" + - " OPTIONAL { <" + oldPropertyURI + "> vitro:hiddenFromDisplayBelowRoleLevelAnnot ?displayLevel } \n" + - " OPTIONAL { <" + oldPropertyURI + "> vitro:prohibitedFromUpdateBelowRoleLevelAnnot ?updateLevel } \n " + - "} \n" ; + if(userChangesModel.size() == 0) { + return; + } else { + log.info("Updating PropertyConfig.n3 to include locally-changed " + + "settings from old property " + oldPropertyURI); + } - String retractQuery = "PREFIX config: <" + VitroVocabulary.configURI + "> \n" + + String newQuery = "PREFIX config: <" + VitroVocabulary.configURI + "> \n" + "PREFIX vitro: <" + VitroVocabulary.vitroURI + "> \n" + "CONSTRUCT { \n" + - " <" + oldPropertyURI + "> config:propertyGroup ?rgroup . \n" + - " ?configuration config:displayName ?rlabel . \n" + - " ?configuration vitro:displayRankAnnot ?rdisplayRank . \n" + - " ?configuration vitro:customEntryFormAnnot ?rcustomForm . \n" + - " ?configuration vitro:hiddenFromDisplayBelowRoleLevelAnnot ?rdisplayLevel . \n" + - " ?configuration vitro:prohibitedFromUpdateBelowRoleLevelAnnot ?rupdateLevel . \n " + + " ?configuration config:propertyGroup ?group . \n" + + " ?configuration config:displayName ?label . \n" + + " ?configuration ?vitroProp ?vitroValue . \n" + "} WHERE { \n" + " <" + contextURI + "> config:hasConfiguration ?configuration . \n" + - " OPTIONAL { <" + oldPropertyURI + "> vitro:inPropertyGroupAnnot ?group . \n" + - " ?configuration config:propertyGroup ?rgroup } \n" + - " OPTIONAL { <" + oldPropertyURI + "> <" + RDFS.label.getURI() + "> ?label . \n" + - " ?configuration config:displayName ?rlabel . \n " + - " FILTER(?rlabel != ?label) } \n " + - " OPTIONAL { <" + oldPropertyURI + "> vitro:displayRankAnnot ?displayRank . \n" + - " ?configuration vitro:displayRantAnnot ?rdisplayRank } \n " + - " OPTIONAL { <" + oldPropertyURI + "> vitro:customEntryFormAnnot ?customForm . \n" + - " ?configuration vitro:customEntryFormAnnot ?rcustomForm } \n" + - " OPTIONAL { <" + oldPropertyURI + "> vitro:hiddenFromDisplayBelowRoleLevelAnnot ?displayLevel . \n" + - " ?configuration vitro:hiddenFromDisplayBelowRoleLevelAnnot ?rdisplayLevel } \n" + - " OPTIONAL { <" + oldPropertyURI + "> vitro:prohibitedFromUpdateBelowRoleLevelAnnot ?updateLevel . \n " + - " ?configuration vitro:prohibitedFromUpdateBelowRoleLevelAnnot ?updateLevel } " + + " OPTIONAL { <" + oldPropertyURI + "> vitro:inPropertyGroupAnnot ?group } \n" + + " OPTIONAL { <" + oldPropertyURI + "> <" + RDFS.label.getURI() + "> ?label } \n" + + " OPTIONAL { <" + oldPropertyURI + "> ?vitroProp ?vitroValue \n" + + " FILTER (regex(str(?vitroProp), \"" + VitroVocabulary.vitroURI + "\")) } \n" + + "} \n" ; + + String existingQuery = "PREFIX config: <" + VitroVocabulary.configURI + "> \n" + + "PREFIX vitro: <" + VitroVocabulary.vitroURI + "> \n" + + "CONSTRUCT { \n" + + " ?configuration config:propertyGroup ?group . \n" + + " ?configuration config:displayName ?label . \n" + + " ?configuration ?vitroProp ?vitroValue . \n" + + "} WHERE { \n" + + " <" + contextURI + "> config:hasConfiguration ?configuration . \n" + + " OPTIONAL { ?configuration config:propertyGroup ?group } \n" + + " OPTIONAL { ?configuration config:displayName ?label } \n" + + " OPTIONAL { ?configuration ?vitroProp ?vitroValue \n" + + " FILTER (regex(str(?vitroProp), \"" + VitroVocabulary.vitroURI + "\")) } \n" + "} \n" ; Model configModel = ModelFactory.createDefaultModel(); @@ -542,17 +521,31 @@ public class TBoxUpdater { FileInputStream fis = new FileInputStream(file); configModel.read(fis, null, "N3"); - Model union = ModelFactory.createUnion(configModel, - userChangesModel); + Model currentUnion = ModelFactory.createUnion(configModel, + userAnnotationsModel); - Model additions = construct(addQuery, union); - Model retractions = construct(retractQuery, union); + Model userAnnotationsAsConfig = construct(newQuery, currentUnion); + Model currentDefaultConfig = construct(existingQuery, currentUnion); - if (additions.size() > 0 || retractions.size() > 0) { - configModel.remove(retractions); - log.info("Removing " + retractions.size() + " statements from " + contextURI); + Model additions = userAnnotationsAsConfig.difference(currentDefaultConfig); + Model retractions = currentDefaultConfig.difference(userAnnotationsAsConfig); + + // filter the retractions so we won't remove a value for a given predicate + // unless the additions model contains at least one value for the same predicate + Model filteredRetractions = ModelFactory.createDefaultModel(); + StmtIterator retractIt = retractions.listStatements(); + while(retractIt.hasNext()) { + Statement candidate = retractIt.nextStatement(); + if(additions.contains(null, candidate.getPredicate(), (RDFNode) null)) { + filteredRetractions.add(candidate); + } + } + + if (additions.size() > 0 || filteredRetractions.size() > 0) { + configModel.remove(filteredRetractions); + log.debug("Removing " + filteredRetractions.size() + " statements from " + contextURI); configModel.add(additions); - log.info("Adding " + additions.size() + " statements from " + contextURI); + log.debug("Adding " + additions.size() + " statements from " + contextURI); FileOutputStream fos = new FileOutputStream(file); configModel.write(fos, "N3"); }