updated migration for external concepts.

This commit is contained in:
stellamit 2011-11-05 04:42:31 +00:00
parent ad0ff55080
commit d1a772d22f
2 changed files with 120 additions and 25 deletions

View file

@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.ontology.update;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@ -23,6 +24,7 @@ import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.shared.Lock;
import com.hp.hpl.jena.vocabulary.OWL;
import com.hp.hpl.jena.vocabulary.RDF;
import com.hp.hpl.jena.vocabulary.RDFS;
import edu.cornell.mannlib.vitro.webapp.ontology.update.AtomicOntologyChange.AtomicChangeType;
@ -327,8 +329,6 @@ public class ABoxUpdater {
return;
}
Model retractions = ModelFactory.createDefaultModel();
// Remove instances of the deleted class
aboxModel.enterCriticalSection(Lock.WRITE);
try {
@ -339,27 +339,39 @@ public class ABoxUpdater {
while (iter.hasNext()) {
count++;
Statement typeStmt = iter.next();
refCount = deleteIndividual(typeStmt.getSubject());
}
StmtIterator iter2 = aboxModel.listStatements(typeStmt.getSubject(), (Property) null, (RDFNode) null);
if (count > 0) {
logger.log("Removed " + count + " individual" + (((count > 1) ? "s" : "") + " of type " + deletedClass.getURI()) + " (refs = " + refCount + ")");
}
while (iter2.hasNext()) {
Statement subjstmt = iter2.next();
} finally {
aboxModel.leaveCriticalSection();
}
}
protected int deleteIndividual(Resource individual) throws IOException {
Model retractions = ModelFactory.createDefaultModel();
int refCount = 0;
aboxModel.enterCriticalSection(Lock.WRITE);
try {
StmtIterator iter = aboxModel.listStatements(individual, (Property) null, (RDFNode) null);
while (iter.hasNext()) {
Statement subjstmt = iter.next();
retractions.add(subjstmt);
}
StmtIterator iter3 = aboxModel.listStatements((Resource) null, (Property) null, typeStmt.getSubject());
iter = aboxModel.listStatements((Resource) null, (Property) null, individual);
while (iter3.hasNext()) {
Statement objstmt = iter3.next();
while (iter.hasNext()) {
Statement objstmt = iter.next();
retractions.add(objstmt);
refCount++;
}
}
//log summary of changes
if (count > 0) {
logger.log("Removed " + count + " individual" + (((count > 1) ? "s" : "") + " of type " + deletedClass.getURI()) + " (refs = " + refCount + ")");
}
aboxModel.remove(retractions);
record.recordRetractions(retractions);
@ -367,8 +379,9 @@ public class ABoxUpdater {
} finally {
aboxModel.leaveCriticalSection();
}
}
return refCount;
}
public void processPropertyChanges(List<AtomicOntologyChange> changes) throws IOException {
Iterator<AtomicOntologyChange> propItr = changes.iterator();
@ -554,6 +567,91 @@ public class ABoxUpdater {
}
}
protected void migrateExternalConcepts() throws IOException {
Property hasResearchArea = ResourceFactory.createProperty("http://vivoweb.org/ontology/core#hasResearchArea");
Property researchAreaOf = ResourceFactory.createProperty("http://vivoweb.org/ontology/core#researchAreaOf");
Property hasSubjectArea = ResourceFactory.createProperty("http://vivoweb.org/ontology/core#hasSubjectArea");
Property subjectAreaFor = ResourceFactory.createProperty("http://vivoweb.org/ontology/core#subjectAreaFor");
HashSet<Resource> resourcesToDelete = new HashSet<Resource>();
migrateExternalConcepts(hasSubjectArea, subjectAreaFor, resourcesToDelete);
migrateExternalConcepts(hasResearchArea, researchAreaOf, resourcesToDelete);
int count = 0;
Iterator<Resource> iter = resourcesToDelete.iterator();
while (iter.hasNext()) {
deleteIndividual(iter.next());
count++;
}
if (count > 0) {
logger.log("migrated " + count + " external concept" + ((count == 1) ? "" : "s"));
}
return;
}
private void migrateExternalConcepts(Property hasConcept, Property conceptOf, HashSet<Resource> resourcesToDelete) throws IOException {
Property sourceVocabularyReference = ResourceFactory.createProperty("http://vivoweb.org/ontology/core#sourceVocabularyReference");
Property linkURI = ResourceFactory.createProperty("http://vivoweb.org/ontology/core#linkURI");
Model additions = ModelFactory.createDefaultModel();
int count = 0;
aboxModel.enterCriticalSection(Lock.WRITE);
try {
StmtIterator iter1 = aboxModel.listStatements((Resource) null, sourceVocabularyReference, (RDFNode) null);
while (iter1.hasNext()) {
Statement stmt1 = iter1.next();
Resource subjectArea = stmt1.getSubject();
if (!stmt1.getObject().isResource()) continue;
Resource vocabularySourceReference = stmt1.getObject().asResource();
Statement linkURIStmt = aboxModel.getProperty(vocabularySourceReference, linkURI);
if (linkURIStmt == null || !linkURIStmt.getObject().isLiteral()) continue;
Resource externalConceptResource = ResourceFactory.createResource(linkURIStmt.getObject().asLiteral().getString());
if (externalConceptResource == null) continue;
Statement conceptLabelStmt = aboxModel.getProperty(subjectArea, RDFS.label);
if (conceptLabelStmt != null) {
additions.add(externalConceptResource, RDFS.label, conceptLabelStmt.getObject().asLiteral());
}
StmtIterator iter2 = aboxModel.listStatements((Resource) null, hasConcept, subjectArea);
while (iter2.hasNext()) {
Statement stmt2 = iter2.next();
Resource agent = stmt2.getSubject();
additions.add(agent, hasConcept, externalConceptResource);
additions.add(externalConceptResource, conceptOf, agent);
}
resourcesToDelete.add(subjectArea);
count++;
}
aboxModel.add(additions);
} finally {
aboxModel.leaveCriticalSection();
}
if (count > 0) {
logger.log("migrated " + count + " external " + hasConcept.getLocalName() + " reference" + ((count == 1) ? "" : "s"));
}
record.recordAdditions(additions);
return;
}
public void logChanges(Statement oldStatement, Statement newStatement) throws IOException {
logChange(oldStatement,false);
logChange(newStatement,true);

View file

@ -232,16 +232,13 @@ public class KnowledgeBaseUpdater {
private void updateABox(AtomicOntologyChangeLists changes)
throws IOException {
OntModel oldTBoxModel = settings.getOldTBoxModel();
OntModel newTBoxModel = settings.getNewTBoxModel();
OntModel ABoxModel = settings.getAssertionOntModelSelector().getABoxModel();
ABoxUpdater aboxUpdater = new ABoxUpdater(
oldTBoxModel, newTBoxModel, ABoxModel,
settings.getNewTBoxAnnotationsModel(), logger, record);
ABoxUpdater aboxUpdater = new ABoxUpdater(oldTBoxModel, newTBoxModel, ABoxModel,settings.getNewTBoxAnnotationsModel(), logger, record);
aboxUpdater.migrateExternalConcepts();
aboxUpdater.processPropertyChanges(changes.getAtomicPropertyChanges());
aboxUpdater.processClassChanges(changes.getAtomicClassChanges());
}
private void updateTBoxAnnotations() throws IOException {