From 42b0b79377bc62b869a5d73528b23a0417f79b1b Mon Sep 17 00:00:00 2001 From: sjm222 Date: Mon, 12 Jul 2010 01:41:44 +0000 Subject: [PATCH] miscellaneous small updates made while testing the 1.0 to 1.1 upgrade process. --- .../webapp/ontology/update/ABoxUpdater.java | 8 +- .../ontology/update/AtomicOntologyChange.java | 1 - .../ontology/update/OntologyUpdater.java | 81 +++++++------- .../webapp/ontology/update/TBoxUpdater.java | 101 ++++++++++-------- 4 files changed, 95 insertions(+), 96 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java index f4953b9c8..5b99c58a8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java @@ -110,7 +110,7 @@ public class ABoxUpdater { /** * - * Update a knowledge based on a class rename in the ontology. All references to the + * Update the knowledge base for a class rename in the ontology. All references to the * old class URI in either the subject or the object position of a statement are * changed to use the new class URI. * @@ -212,7 +212,7 @@ public class ABoxUpdater { /** * - * Examine a knowledge based on a class addition to the ontology and + * Examine the knowledge base for a class addition to the ontology and * add messages to the change log indicating where manual review is * recommended. If the added class has a direct parent in the new ontology * that is not OWL.Thing, and if the knowledge base contains individuals @@ -275,6 +275,7 @@ public class ABoxUpdater { } } + /** * * Update a knowledge base to account for a class deletion in the ontology. @@ -328,6 +329,7 @@ public class ABoxUpdater { renameClass(chg); } + public void processPropertyChanges(List changes) throws IOException { Iterator propItr = changes.iterator(); while(propItr.hasNext()){ @@ -452,7 +454,7 @@ public class ABoxUpdater { record.recordRetractions(renamePropRetractModel); if (renamePropRetractModel.size() > 0) { - logger.log(renamePropRetractModel.size() + " statment" + + logger.log(renamePropRetractModel.size() + " statement" + ((renamePropRetractModel.size() > 1) ? "s" : "") + " with predicate " + propObj.getSourceURI() + " " + ((renamePropRetractModel.size() > 1) ? "were" : "was") diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/AtomicOntologyChange.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/AtomicOntologyChange.java index 4e86c0d4b..8441c24d2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/AtomicOntologyChange.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/AtomicOntologyChange.java @@ -2,7 +2,6 @@ package edu.cornell.mannlib.vitro.webapp.ontology.update; -import com.hp.hpl.jena.ontology.OntModel; /** * * We need to document what is in source and destinationURI for each diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java index ea2a4b127..a2ee1d2e2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java @@ -12,14 +12,8 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Set; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.ontology.OntProperty; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; @@ -27,9 +21,6 @@ import com.hp.hpl.jena.query.QueryFactory; 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.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; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.shared.Lock; @@ -45,9 +36,7 @@ import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestUtils; */ public class OntologyUpdater { - - - private final Log log = LogFactory.getLog(OntologyUpdater.class); + //private final Log log = LogFactory.getLog(OntologyUpdater.class); private OntologyUpdateSettings settings; private OntologyChangeLogger logger; @@ -55,10 +44,8 @@ public class OntologyUpdater { public OntologyUpdater(OntologyUpdateSettings settings) { this.settings = settings; - this.logger = new SimpleOntologyChangeLogger(settings.getLogFile(), - settings.getErrorLogFile()); - this.record = new SimpleOntologyChangeRecord( - settings.getAddedDataFile(), settings.getRemovedDataFile()); + this.logger = new SimpleOntologyChangeLogger(settings.getLogFile(), settings.getErrorLogFile()); + this.record = new SimpleOntologyChangeRecord(settings.getAddedDataFile(), settings.getRemovedDataFile()); } public boolean update() throws IOException { @@ -67,8 +54,14 @@ public class OntologyUpdater { boolean updateRequired = updateRequired(); if (updateRequired) { - performUpdate(); + try { + performUpdate(); + } catch (Exception e) { + logger.logError(e.getMessage()); + e.printStackTrace(); + } + if (!logger.errorsWritten()) { // add assertions to the knowledge base showing that the // update was successful, so we don't need to run it again. @@ -78,6 +71,7 @@ public class OntologyUpdater { record.writeChanges(); logger.closeLogs(); + } return updateRequired; @@ -86,20 +80,17 @@ public class OntologyUpdater { private void performUpdate() throws IOException { - performSparqlConstructs(settings.getSparqlConstructsDir(), - settings.getOntModelSelector().getABoxModel()); + performSparqlConstructs(settings.getSparqlConstructsDir(), settings.getOntModelSelector().getABoxModel()); List rawChanges = getAtomicOntologyChanges(); - AtomicOntologyChangeLists changes = - new AtomicOntologyChangeLists(rawChanges, - settings.getNewTBoxModel(), - settings.getOldTBoxModel()); - - //process the TBox before the ABox - updateTBoxAnnotations(); - - updateABox(changes); + AtomicOntologyChangeLists changes = new AtomicOntologyChangeLists(rawChanges, + settings.getNewTBoxModel(), + settings.getOldTBoxModel()); + //process the TBox before the ABox + updateTBoxAnnotations(); + + updateABox(changes); } @@ -195,7 +186,8 @@ public class OntologyUpdater { private void updateABox(AtomicOntologyChangeLists changes) throws IOException { - // TODO get models from somewhere + + OntModel oldTBoxModel = settings.getOldTBoxModel(); OntModel newTBoxModel = settings.getNewTBoxModel(); OntModel ABoxModel = settings.getOntModelSelector().getABoxModel(); @@ -204,7 +196,7 @@ public class OntologyUpdater { settings.getNewTBoxAnnotationsModel(), logger, record); aboxUpdater.processPropertyChanges(changes.getAtomicPropertyChanges()); aboxUpdater.processClassChanges(changes.getAtomicClassChanges()); - // run additional SPARQL CONSTRUCTS + } private void updateTBoxAnnotations() throws IOException { @@ -255,6 +247,7 @@ public class OntologyUpdater { private void assertSuccess() throws FileNotFoundException, IOException { try { + Model m = settings.getOntModelSelector().getApplicationMetadataModel(); File successAssertionsFile = new File(settings.getSuccessAssertionsFile()); @@ -292,35 +285,33 @@ public class OntologyUpdater { OntModel oldTboxModel) throws IOException { Iterator listItr = changeList.iterator(); - while(listItr.hasNext()){ + + while(listItr.hasNext()) { AtomicOntologyChange changeObj = listItr.next(); - if(changeObj.getSourceURI() != null){ - if(oldTboxModel.getOntProperty(changeObj. - getSourceURI()) != null){ + if (changeObj.getSourceURI() != null){ + + if (oldTboxModel.getOntProperty(changeObj.getSourceURI()) != null){ atomicPropertyChanges.add(changeObj); } - else if(oldTboxModel.getOntClass(changeObj. - getSourceURI()) != null) { + else if (oldTboxModel.getOntClass(changeObj.getSourceURI()) != null) { atomicClassChanges.add(changeObj); } else{ logger.logError("Source URI is neither a Property" + - " nor a Class. " + "Change Object skipped"); + " nor a Class. " + "Change Object skipped for sourceURI: " + changeObj.getSourceURI()); } } else if(changeObj.getDestinationURI() != null){ - if(newTboxModel.getOntProperty(changeObj. - getDestinationURI()) != null){ + + if (newTboxModel.getOntProperty(changeObj.getDestinationURI()) != null) { atomicPropertyChanges.add(changeObj); - } - else if(newTboxModel.getOntClass(changeObj. - getDestinationURI()) != null){ + } else if(newTboxModel.getOntClass(changeObj. + getDestinationURI()) != null) { atomicClassChanges.add(changeObj); - } - else{ + } else{ logger.logError("Destination URI is neither a Property" + - " nor a Class. " + "Change Object skipped"); + " nor a Class. " + "Change Object skipped for destinationURI: " + changeObj.getDestinationURI()); } } else{ 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 b6e836923..e1fd76a9c 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 @@ -22,8 +22,8 @@ import com.hp.hpl.jena.shared.Lock; */ public class TBoxUpdater { - private OntModel oldTboxModel; - private OntModel newTboxModel; + private OntModel oldTboxAnnotationsModel; + private OntModel newTboxAnnotationsModel; private OntModel siteModel; private OntologyChangeLogger logger; private OntologyChangeRecord record; @@ -32,8 +32,8 @@ public class TBoxUpdater { * * Constructor * - * @param oldTboxModel - previous version of the ontology - * @param newTboxModel - new version of the ontology + * @param oldTboxAnnotationsModel - previous version of the annotations in the ontology + * @param newTboxAnnotationsModel - new version of the annotations in the ontology * @param siteModel - the knowledge base to be updated * @param logger - for writing to the change log * and the error log. @@ -41,14 +41,14 @@ public class TBoxUpdater { * and the retractions model. * */ - public TBoxUpdater(OntModel oldTboxModel, - OntModel newTboxModel, + public TBoxUpdater(OntModel oldTboxAnnotationsModel, + OntModel newTboxAnnotationsModel, OntModel siteModel, OntologyChangeLogger logger, OntologyChangeRecord record) { - this.oldTboxModel = oldTboxModel; - this.newTboxModel = newTboxModel; + this.oldTboxAnnotationsModel = oldTboxAnnotationsModel; + this.newTboxAnnotationsModel = newTboxAnnotationsModel; this.siteModel = siteModel; this.logger = logger; this.record = record; @@ -56,12 +56,12 @@ public class TBoxUpdater { /** * - * Update a knowledge base to align with changes vitro annotation property default + * Update a knowledge base to align with changes to vitro annotation property default * values in a new version of the ontology. The two versions of the ontology and the * knowledge base to be updated are provided in the class constructor and are * referenced via class level variables. * - * If the default value (i.e. the value that is provided in the vivo-core- + * If the default value (i.e. the value that is provided in the vivo-core * annotations files) of a vitro annotation property has been changed for a vivo * core class, and that default value has not been changed in the site knowledge * base, then update the value in the site knowledge base to be the new default. @@ -76,7 +76,7 @@ public class TBoxUpdater { * Writes to the change log file, the error log file, and the incremental change * knowledge base. * - * Note: as specified, this method for now assume that no new vitro annotation + * Note: as specified, this method for now assumes that no new vitro annotation * properties have been introduced. This should be updated for future versions. */ public void updateVitroPropertyDefaultValues() throws IOException { @@ -92,8 +92,8 @@ public class TBoxUpdater { // if the default has changed in the new version of the ontology AND if // the site hasn't overidden the previous default in their knowledge base. - StmtIterator iter = oldTboxModel.listStatements(); - + StmtIterator iter = oldTboxAnnotationsModel.listStatements(); + int stmtCount = 0; while (iter.hasNext()) { @@ -103,43 +103,53 @@ public class TBoxUpdater { Resource subject = stmt.getSubject(); Property predicate = stmt.getPredicate(); RDFNode oldObject = stmt.getObject(); + + NodeIterator newObjects = newTboxAnnotationsModel.listObjectsOfProperty(subject, predicate); - NodeIterator objects = newTboxModel.listObjectsOfProperty(subject, predicate); - - if ((objects == null) || (!objects.hasNext()) ) { + if ((newObjects == null) || (!newObjects.hasNext()) ) { retractions.add(siteModel.listStatements(subject, predicate, (RDFNode) null)); - //logger.log("Error: found a statement for subject = " + subject.getURI() + - // " and property = " + predicate.getURI() + - // " in the old version but not the new version of the ontology."); continue; } - RDFNode newObject = objects.next(); - if (objects.hasNext()) { - logger.logError("Error: found " + objects.toList().size() + + RDFNode newObject = newObjects.next(); + + int i = 1; + while (newObjects.hasNext()) { + i++; + newObjects.next(); + } + + if (i > 1) { + logger.log("WARNING: found " + i + " statements with subject = " + subject.getURI() + " and property = " + predicate.getURI() + - " in the new version of the ontology. (maximum of one is expected)"); + " in the new version of the annotations ontology. (maximum of one is expected)"); continue; } - + if (!newObject.equals(oldObject)) { - objects = siteModel.listObjectsOfProperty(subject,predicate); + NodeIterator siteObjects = siteModel.listObjectsOfProperty(subject,predicate); - if (!objects.hasNext()) { + if (siteObjects == null || !siteObjects.hasNext()) { continue; } - - RDFNode siteObject = objects.next(); - if (objects.hasNext()) { - logger.logError("Warning: found " + objects.toList().size() + + + RDFNode siteObject = siteObjects.next(); + + i = 1; + while (siteObjects.hasNext()) { + i++; + siteObjects.next(); + } + + if (i > 1) { + logger.log("WARNING: found " + i + " statements with subject = " + subject.getURI() + " and property = " + predicate.getURI() + - " in the site model (maximum of one is expected). +" + - " did not perform any update on this property"); - continue; + " in the site annotations model. (maximum of one is expected). "); + continue; } - + if (siteObject.equals(oldObject)) { try { StmtIterator it = siteModel.listStatements(subject, predicate, (RDFNode)null); @@ -169,7 +179,7 @@ public class TBoxUpdater { } } } - + Model actualAdditions = additions.difference(retractions); siteModel.add(actualAdditions); record.recordAdditions(actualAdditions); @@ -180,7 +190,7 @@ public class TBoxUpdater { // log summary of changes if (actualAdditions.size() > 0) { logger.log("Updated the default vitro annotation value for " + - actualAdditions.size() + " statments in the knowledge base."); + actualAdditions.size() + " statements in the knowledge base."); } long numRemoved = actualRetractions.size() - actualAdditions.size(); @@ -193,15 +203,22 @@ public class TBoxUpdater { // into the site model. // - Model newAnnotationSettings = newTboxModel.difference(oldTboxModel); + Model newAnnotationSettings = newTboxAnnotationsModel.difference(oldTboxAnnotationsModel); Model newAnnotationSettingsToAdd = ModelFactory.createDefaultModel(); StmtIterator newStmtIt = newAnnotationSettings.listStatements(); while (newStmtIt.hasNext()) { Statement stmt = newStmtIt.next(); if (!siteModel.contains(stmt)) { newAnnotationSettingsToAdd.add(stmt); + + // TODO remove this for production + logger.log( "adding Statement: subject = " + stmt.getSubject().getURI() + + " property = " + stmt.getPredicate().getURI() + + " object = " + (stmt.getObject().isLiteral() ? ((Literal)stmt.getObject()).getLexicalForm() + : ((Resource)stmt.getObject()).getURI())); } } + siteModel.add(newAnnotationSettingsToAdd); record.recordAdditions(newAnnotationSettingsToAdd); @@ -213,16 +230,6 @@ public class TBoxUpdater { "existing annotation properties applied to existing classes where they weren't applied before, or existing " + "properties applied to new classes. No new annotation properties have been introduced."); } - //details - - while (iter.hasNext()) { - Statement statement = iter.next(); - - logger.log( "added Statement: subject = " + statement.getSubject().getURI() + - " property = " + statement.getPredicate().getURI() + - " object = " + (statement.getObject().isLiteral() ? ((Resource)statement.getObject()).getURI() - : ((Literal)statement.getObject()).getLexicalForm())); - } } finally { siteModel.leaveCriticalSection();