updated migration for external concepts.
This commit is contained in:
parent
ad0ff55080
commit
d1a772d22f
2 changed files with 120 additions and 25 deletions
|
@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.ontology.update;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
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.shared.Lock;
|
||||||
import com.hp.hpl.jena.vocabulary.OWL;
|
import com.hp.hpl.jena.vocabulary.OWL;
|
||||||
import com.hp.hpl.jena.vocabulary.RDF;
|
import com.hp.hpl.jena.vocabulary.RDF;
|
||||||
|
import com.hp.hpl.jena.vocabulary.RDFS;
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.ontology.update.AtomicOntologyChange.AtomicChangeType;
|
import edu.cornell.mannlib.vitro.webapp.ontology.update.AtomicOntologyChange.AtomicChangeType;
|
||||||
|
|
||||||
|
@ -326,8 +328,6 @@ public class ABoxUpdater {
|
||||||
logger.log("WARNING: didn't find the deleted class " + change.getSourceURI() + " in the old model. Skipping updates for this deletion");
|
logger.log("WARNING: didn't find the deleted class " + change.getSourceURI() + " in the old model. Skipping updates for this deletion");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Model retractions = ModelFactory.createDefaultModel();
|
|
||||||
|
|
||||||
// Remove instances of the deleted class
|
// Remove instances of the deleted class
|
||||||
aboxModel.enterCriticalSection(Lock.WRITE);
|
aboxModel.enterCriticalSection(Lock.WRITE);
|
||||||
|
@ -338,28 +338,40 @@ public class ABoxUpdater {
|
||||||
|
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
count++;
|
count++;
|
||||||
Statement typeStmt = iter.next();
|
Statement typeStmt = iter.next();
|
||||||
|
refCount = deleteIndividual(typeStmt.getSubject());
|
||||||
StmtIterator iter2 = aboxModel.listStatements(typeStmt.getSubject(), (Property) null, (RDFNode) null);
|
|
||||||
|
|
||||||
while (iter2.hasNext()) {
|
|
||||||
Statement subjstmt = iter2.next();
|
|
||||||
retractions.add(subjstmt);
|
|
||||||
}
|
|
||||||
|
|
||||||
StmtIterator iter3 = aboxModel.listStatements((Resource) null, (Property) null, typeStmt.getSubject());
|
|
||||||
|
|
||||||
while (iter3.hasNext()) {
|
|
||||||
Statement objstmt = iter3.next();
|
|
||||||
retractions.add(objstmt);
|
|
||||||
refCount++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//log summary of changes
|
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
logger.log("Removed " + count + " individual" + (((count > 1) ? "s" : "") + " of type " + deletedClass.getURI()) + " (refs = " + refCount + ")");
|
logger.log("Removed " + count + " individual" + (((count > 1) ? "s" : "") + " of type " + deletedClass.getURI()) + " (refs = " + refCount + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
iter = aboxModel.listStatements((Resource) null, (Property) null, individual);
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
Statement objstmt = iter.next();
|
||||||
|
retractions.add(objstmt);
|
||||||
|
refCount++;
|
||||||
|
}
|
||||||
|
|
||||||
aboxModel.remove(retractions);
|
aboxModel.remove(retractions);
|
||||||
record.recordRetractions(retractions);
|
record.recordRetractions(retractions);
|
||||||
|
@ -367,8 +379,9 @@ public class ABoxUpdater {
|
||||||
} finally {
|
} finally {
|
||||||
aboxModel.leaveCriticalSection();
|
aboxModel.leaveCriticalSection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return refCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processPropertyChanges(List<AtomicOntologyChange> changes) throws IOException {
|
public void processPropertyChanges(List<AtomicOntologyChange> changes) throws IOException {
|
||||||
|
|
||||||
Iterator<AtomicOntologyChange> propItr = changes.iterator();
|
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 {
|
public void logChanges(Statement oldStatement, Statement newStatement) throws IOException {
|
||||||
logChange(oldStatement,false);
|
logChange(oldStatement,false);
|
||||||
logChange(newStatement,true);
|
logChange(newStatement,true);
|
||||||
|
|
|
@ -232,16 +232,13 @@ public class KnowledgeBaseUpdater {
|
||||||
private void updateABox(AtomicOntologyChangeLists changes)
|
private void updateABox(AtomicOntologyChangeLists changes)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
|
|
||||||
OntModel oldTBoxModel = settings.getOldTBoxModel();
|
OntModel oldTBoxModel = settings.getOldTBoxModel();
|
||||||
OntModel newTBoxModel = settings.getNewTBoxModel();
|
OntModel newTBoxModel = settings.getNewTBoxModel();
|
||||||
OntModel ABoxModel = settings.getAssertionOntModelSelector().getABoxModel();
|
OntModel ABoxModel = settings.getAssertionOntModelSelector().getABoxModel();
|
||||||
ABoxUpdater aboxUpdater = new ABoxUpdater(
|
ABoxUpdater aboxUpdater = new ABoxUpdater(oldTBoxModel, newTBoxModel, ABoxModel,settings.getNewTBoxAnnotationsModel(), logger, record);
|
||||||
oldTBoxModel, newTBoxModel, ABoxModel,
|
aboxUpdater.migrateExternalConcepts();
|
||||||
settings.getNewTBoxAnnotationsModel(), logger, record);
|
|
||||||
aboxUpdater.processPropertyChanges(changes.getAtomicPropertyChanges());
|
aboxUpdater.processPropertyChanges(changes.getAtomicPropertyChanges());
|
||||||
aboxUpdater.processClassChanges(changes.getAtomicClassChanges());
|
aboxUpdater.processClassChanges(changes.getAtomicClassChanges());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateTBoxAnnotations() throws IOException {
|
private void updateTBoxAnnotations() throws IOException {
|
||||||
|
|
Loading…
Add table
Reference in a new issue