VIVO-778 Clean up ObjectPropertyStatementPattern
Rename to ReasonerStatementPattern, move to a new package and refactor.
This commit is contained in:
parent
adf04bd2be
commit
468a7214fe
6 changed files with 216 additions and 222 deletions
|
@ -1,52 +0,0 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.dao.jena.pellet;
|
|
||||||
|
|
||||||
import com.hp.hpl.jena.rdf.model.Property;
|
|
||||||
import com.hp.hpl.jena.rdf.model.Resource;
|
|
||||||
|
|
||||||
public class ObjectPropertyStatementPattern {
|
|
||||||
|
|
||||||
private Resource subject = null;
|
|
||||||
private Property predicate = null;
|
|
||||||
private Resource object = null;
|
|
||||||
|
|
||||||
public ObjectPropertyStatementPattern(Resource subject, Property predicate, Resource object) {
|
|
||||||
this.subject = subject;
|
|
||||||
this.predicate = predicate;
|
|
||||||
this.object = object;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Resource getSubject() {
|
|
||||||
return this.subject;
|
|
||||||
}
|
|
||||||
public Property getPredicate() {
|
|
||||||
return this.predicate;
|
|
||||||
}
|
|
||||||
public Resource getObject() {
|
|
||||||
return this.object;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean matches(ObjectPropertyStatementPattern p2) {
|
|
||||||
boolean sMatch = false;
|
|
||||||
boolean pMatch = false;
|
|
||||||
boolean oMatch = false;
|
|
||||||
if (this.getSubject() == null || p2.getSubject()==null) {
|
|
||||||
sMatch = true; // (this.getSubject() == null && p2.getSubject() == null);
|
|
||||||
} else {
|
|
||||||
sMatch = (this.getSubject().equals(p2.getSubject()));
|
|
||||||
}
|
|
||||||
if (this.getPredicate() == null || p2.getPredicate()==null) {
|
|
||||||
pMatch = true; // (this.getPredicate() == null && p2.getPredicate() == null);
|
|
||||||
} else {
|
|
||||||
pMatch = (this.getPredicate().equals(p2.getPredicate()));
|
|
||||||
}
|
|
||||||
if (this.getObject() == null || p2.getObject()==null) {
|
|
||||||
oMatch = true ; // (this.getObject() == null && p2.getObject() == null);
|
|
||||||
} else {
|
|
||||||
oMatch = (this.getObject().equals(p2.getObject()));
|
|
||||||
}
|
|
||||||
return (sMatch && pMatch && oMatch);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.dao.jena.pellet;
|
|
||||||
|
|
||||||
import com.hp.hpl.jena.rdf.model.Property;
|
|
||||||
import com.hp.hpl.jena.rdf.model.Resource;
|
|
||||||
|
|
||||||
public class ObjectPropertyStatementPatternFactory {
|
|
||||||
|
|
||||||
//private static Set<ObjectPropertyStatementPattern> patternSet = new HashSet<ObjectPropertyStatementPattern>();
|
|
||||||
|
|
||||||
public static ObjectPropertyStatementPattern getPattern(Resource subject, Property predicate, Resource object) {
|
|
||||||
//for (Iterator<ObjectPropertyStatementPattern> i = patternSet.iterator(); i.hasNext(); ) {
|
|
||||||
// ObjectPropertyStatementPattern pat = i.next();
|
|
||||||
// if ( ( (pat.getSubject()==null && subject==null) || (pat.getSubject().equals(subject)) )
|
|
||||||
// && ( (pat.getPredicate()==null && predicate==null) || (pat.getPredicate().equals(predicate)) )
|
|
||||||
// && ( (pat.getObject()==null && object==null) || (pat.getObject().equals(object)) ) ) {
|
|
||||||
// return pat;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
ObjectPropertyStatementPattern newPat = new ObjectPropertyStatementPattern(subject,predicate,object);
|
|
||||||
//patternSet.add(newPat);
|
|
||||||
return newPat;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -37,6 +37,8 @@ import com.hp.hpl.jena.vocabulary.RDFS;
|
||||||
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
|
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent;
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.tboxreasoner.ReasonerConfiguration;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.tboxreasoner.ReasonerStatementPattern;
|
||||||
|
|
||||||
public class PelletListener implements ModelChangedListener {
|
public class PelletListener implements ModelChangedListener {
|
||||||
|
|
||||||
|
@ -50,11 +52,11 @@ public class PelletListener implements ModelChangedListener {
|
||||||
private OntModel mainModel;
|
private OntModel mainModel;
|
||||||
private Model inferenceModel;
|
private Model inferenceModel;
|
||||||
private ReasonerConfiguration reasonerConfiguration;
|
private ReasonerConfiguration reasonerConfiguration;
|
||||||
private Set<ObjectPropertyStatementPattern> inferenceDrivingPatternAllowSet;
|
private Set<ReasonerStatementPattern> inferenceDrivingPatternAllowSet;
|
||||||
private Set<ObjectPropertyStatementPattern> inferenceDrivingPatternDenySet;
|
private Set<ReasonerStatementPattern> inferenceDrivingPatternDenySet;
|
||||||
private Set<ObjectPropertyStatementPattern> inferenceReceivingPatternAllowSet;
|
private Set<ReasonerStatementPattern> inferenceReceivingPatternAllowSet;
|
||||||
|
|
||||||
private Map<Property,List<ObjectPropertyStatementPattern>> inferenceDrivingPatternMap;
|
private Map<Property,List<ReasonerStatementPattern>> inferenceDrivingPatternMap;
|
||||||
|
|
||||||
private Model additionModel;
|
private Model additionModel;
|
||||||
private Model removalModel;
|
private Model removalModel;
|
||||||
|
@ -142,13 +144,13 @@ public class PelletListener implements ModelChangedListener {
|
||||||
this.inferenceReceivingPatternAllowSet = reasonerConfiguration.getInferenceReceivingPatternAllowSet();
|
this.inferenceReceivingPatternAllowSet = reasonerConfiguration.getInferenceReceivingPatternAllowSet();
|
||||||
|
|
||||||
if (this.inferenceDrivingPatternAllowSet != null) {
|
if (this.inferenceDrivingPatternAllowSet != null) {
|
||||||
this.inferenceDrivingPatternMap = new HashMap<Property,List<ObjectPropertyStatementPattern>>();
|
this.inferenceDrivingPatternMap = new HashMap<>();
|
||||||
for (Iterator<ObjectPropertyStatementPattern> i = inferenceDrivingPatternAllowSet.iterator(); i.hasNext();) {
|
for (Iterator<ReasonerStatementPattern> i = inferenceDrivingPatternAllowSet.iterator(); i.hasNext();) {
|
||||||
ObjectPropertyStatementPattern pat = i.next();
|
ReasonerStatementPattern pat = i.next();
|
||||||
Property p = pat.getPredicate();
|
Property p = pat.getPredicate();
|
||||||
List<ObjectPropertyStatementPattern> patList = inferenceDrivingPatternMap.get(p);
|
List<ReasonerStatementPattern> patList = inferenceDrivingPatternMap.get(p);
|
||||||
if (patList == null) {
|
if (patList == null) {
|
||||||
patList = new LinkedList<ObjectPropertyStatementPattern>();
|
patList = new LinkedList<>();
|
||||||
patList.add(pat);
|
patList.add(pat);
|
||||||
inferenceDrivingPatternMap.put(p, patList);
|
inferenceDrivingPatternMap.put(p, patList);
|
||||||
} else {
|
} else {
|
||||||
|
@ -163,7 +165,7 @@ public class PelletListener implements ModelChangedListener {
|
||||||
this.deletedDataProperties = ModelFactory.createDefaultModel();
|
this.deletedDataProperties = ModelFactory.createDefaultModel();
|
||||||
this.mainModel.enterCriticalSection(Lock.READ);
|
this.mainModel.enterCriticalSection(Lock.READ);
|
||||||
try {
|
try {
|
||||||
for (ObjectPropertyStatementPattern pat : this.inferenceDrivingPatternAllowSet) {
|
for (ReasonerStatementPattern pat : this.inferenceDrivingPatternAllowSet) {
|
||||||
addedStatements(mainModel.listStatements((Resource) null, pat.getPredicate(), (RDFNode) null));
|
addedStatements(mainModel.listStatements((Resource) null, pat.getPredicate(), (RDFNode) null));
|
||||||
}
|
}
|
||||||
if (!skipReasoningUponInitialization) {
|
if (!skipReasoningUponInitialization) {
|
||||||
|
@ -198,12 +200,12 @@ public class PelletListener implements ModelChangedListener {
|
||||||
inferenceRounds++;
|
inferenceRounds++;
|
||||||
log.info("Getting new inferences");
|
log.info("Getting new inferences");
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
LinkedList<ObjectPropertyStatementPattern> irpl = new LinkedList<ObjectPropertyStatementPattern>();
|
LinkedList<ReasonerStatementPattern> irpl = new LinkedList<>();
|
||||||
|
|
||||||
if (inferenceReceivingPatternAllowSet != null) {
|
if (inferenceReceivingPatternAllowSet != null) {
|
||||||
irpl.addAll(inferenceReceivingPatternAllowSet);
|
irpl.addAll(inferenceReceivingPatternAllowSet);
|
||||||
} else {
|
} else {
|
||||||
irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,null,null));
|
irpl.add(ReasonerStatementPattern.ANY_OBJECT_PROPERTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reasonerConfiguration.getQueryForAllObjectProperties()) {
|
if (reasonerConfiguration.getQueryForAllObjectProperties()) {
|
||||||
|
@ -214,7 +216,7 @@ public class PelletListener implements ModelChangedListener {
|
||||||
for (Iterator objPropIt = closeIt; objPropIt.hasNext();) {
|
for (Iterator objPropIt = closeIt; objPropIt.hasNext();) {
|
||||||
ObjectProperty objProp = (ObjectProperty) objPropIt.next();
|
ObjectProperty objProp = (ObjectProperty) objPropIt.next();
|
||||||
if ( !("http://www.w3.org/2002/07/owl#".equals(objProp.getNameSpace())) ) {
|
if ( !("http://www.w3.org/2002/07/owl#".equals(objProp.getNameSpace())) ) {
|
||||||
irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,objProp,null));
|
irpl.add(ReasonerStatementPattern.objectPattern(objProp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -229,7 +231,7 @@ public class PelletListener implements ModelChangedListener {
|
||||||
try {
|
try {
|
||||||
while (sit.hasNext()) {
|
while (sit.hasNext()) {
|
||||||
Resource subj = (Resource) sit.next();
|
Resource subj = (Resource) sit.next();
|
||||||
irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,ResourceFactory.createProperty(subj.getURI()),null));
|
irpl.add(ReasonerStatementPattern.objectPattern(ResourceFactory.createProperty(subj.getURI())));
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
sit.close();
|
sit.close();
|
||||||
|
@ -249,7 +251,7 @@ public class PelletListener implements ModelChangedListener {
|
||||||
DatatypeProperty dataProp = (DatatypeProperty) dataPropIt.next();
|
DatatypeProperty dataProp = (DatatypeProperty) dataPropIt.next();
|
||||||
if ( !("http://www.w3.org/2002/07/owl#".equals(dataProp.getNameSpace())) ) {
|
if ( !("http://www.w3.org/2002/07/owl#".equals(dataProp.getNameSpace())) ) {
|
||||||
// TODO: THIS WILL WORK, BUT NEED TO GENERALIZE THE PATTERN CLASSES
|
// TODO: THIS WILL WORK, BUT NEED TO GENERALIZE THE PATTERN CLASSES
|
||||||
irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,dataProp,null));
|
irpl.add(ReasonerStatementPattern.objectPattern(dataProp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -264,7 +266,7 @@ public class PelletListener implements ModelChangedListener {
|
||||||
try {
|
try {
|
||||||
while (sit.hasNext()) {
|
while (sit.hasNext()) {
|
||||||
Resource subj = (Resource) sit.next();
|
Resource subj = (Resource) sit.next();
|
||||||
irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,ResourceFactory.createProperty(subj.getURI()),null));
|
irpl.add(ReasonerStatementPattern.objectPattern(ResourceFactory.createProperty(subj.getURI())));
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
sit.close();
|
sit.close();
|
||||||
|
@ -294,68 +296,55 @@ public class PelletListener implements ModelChangedListener {
|
||||||
pelletModel.leaveCriticalSection();
|
pelletModel.leaveCriticalSection();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Iterator<ObjectPropertyStatementPattern> patIt = irpl.iterator(); patIt.hasNext(); ) {
|
for (Iterator<ReasonerStatementPattern> patIt = irpl.iterator(); patIt.hasNext(); ) {
|
||||||
ObjectPropertyStatementPattern pat = patIt.next();
|
ReasonerStatementPattern pat = patIt.next();
|
||||||
|
log.debug("Querying for "+pat);
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
String subjStr = (pat.getSubject() != null) ? pat.getSubject().getURI() : "*";
|
|
||||||
String predStr = (pat.getPredicate() != null) ? pat.getPredicate().getURI() : "*";
|
|
||||||
String objStr = (pat.getObject() != null) ? pat.getObject().getURI() : "*";
|
|
||||||
log.debug("Querying for "+subjStr+" : "+predStr+" : "+objStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
Model tempModel = ModelFactory.createDefaultModel();
|
Model tempModel = ModelFactory.createDefaultModel();
|
||||||
|
|
||||||
pelletModel.enterCriticalSection(Lock.READ);
|
pelletModel.enterCriticalSection(Lock.READ);
|
||||||
try {
|
try {
|
||||||
|
for(Statement stmt : pat.matchStatementsFromModel(pelletModel)) {
|
||||||
ClosableIterator ci = pelletModel.listStatements(pat.getSubject(),pat.getPredicate(),pat.getObject());
|
|
||||||
try {
|
boolean reject = false;
|
||||||
for (ClosableIterator i=ci; i.hasNext();) {
|
|
||||||
Statement stmt = (Statement) i.next();
|
// this next part is only needed if we're using Jena's OWL reasoner instead of actually using Pellet
|
||||||
|
try {
|
||||||
boolean reject = false;
|
if ( ( ((Resource)stmt.getObject()).equals(RDFS.Resource) ) ) {
|
||||||
|
reject = true;
|
||||||
// this next part is only needed if we're using Jena's OWL reasoner instead of actually using Pellet
|
} else if ( ( stmt.getSubject().equals(OWL.Nothing) ) ) {
|
||||||
try {
|
reject = true;
|
||||||
if ( ( ((Resource)stmt.getObject()).equals(RDFS.Resource) ) ) {
|
} else if ( ( stmt.getObject().equals(OWL.Nothing) ) ) {
|
||||||
reject = true;
|
reject = true;
|
||||||
} else if ( ( stmt.getSubject().equals(OWL.Nothing) ) ) {
|
}
|
||||||
reject = true;
|
} catch (Exception e) {}
|
||||||
} else if ( ( stmt.getObject().equals(OWL.Nothing) ) ) {
|
|
||||||
reject = true;
|
if (!reject) {
|
||||||
}
|
tempModel.add(stmt);
|
||||||
} catch (Exception e) {}
|
|
||||||
|
boolean fullModelContainsStatement = false;
|
||||||
if (!reject) {
|
fullModel.enterCriticalSection(Lock.READ);
|
||||||
tempModel.add(stmt);
|
try {
|
||||||
|
fullModelContainsStatement = fullModel.contains(stmt);
|
||||||
boolean fullModelContainsStatement = false;
|
} finally {
|
||||||
fullModel.enterCriticalSection(Lock.READ);
|
fullModel.leaveCriticalSection();
|
||||||
try {
|
}
|
||||||
fullModelContainsStatement = fullModel.contains(stmt);
|
|
||||||
} finally {
|
if (!fullModelContainsStatement) {
|
||||||
fullModel.leaveCriticalSection();
|
// in theory we should be able to lock only the inference model, but I'm not sure yet if Jena propagates the locking upward
|
||||||
}
|
fullModel.enterCriticalSection(Lock.WRITE);
|
||||||
|
closePipe();
|
||||||
if (!fullModelContainsStatement) {
|
try {
|
||||||
// in theory we should be able to lock only the inference model, but I'm not sure yet if Jena propagates the locking upward
|
inferenceModel.add(stmt);
|
||||||
fullModel.enterCriticalSection(Lock.WRITE);
|
addCount++;
|
||||||
closePipe();
|
} finally {
|
||||||
try {
|
openPipe();
|
||||||
inferenceModel.add(stmt);
|
fullModel.leaveCriticalSection();
|
||||||
addCount++;
|
}
|
||||||
} finally {
|
}
|
||||||
openPipe();
|
|
||||||
fullModel.leaveCriticalSection();
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
ci.close();
|
|
||||||
}
|
|
||||||
} finally {
|
} finally {
|
||||||
pelletModel.leaveCriticalSection();
|
pelletModel.leaveCriticalSection();
|
||||||
}
|
}
|
||||||
|
@ -364,22 +353,11 @@ public class PelletListener implements ModelChangedListener {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Queue<Statement> localRemovalQueue = new LinkedList<Statement>();
|
Queue<Statement> localRemovalQueue = new LinkedList<Statement>();
|
||||||
inferenceModel.enterCriticalSection(Lock.READ);
|
for (Statement stmt : pat.matchStatementsFromModel(inferenceModel)) {
|
||||||
try {
|
if (!tempModel.contains(stmt)) {
|
||||||
ClosableIterator ci = inferenceModel.listStatements(pat.getSubject(),pat.getPredicate(),pat.getObject());
|
localRemovalQueue.add(stmt);
|
||||||
try {
|
}
|
||||||
for (ClosableIterator i=ci; i.hasNext();) {
|
}
|
||||||
Statement stmt = (Statement) i.next();
|
|
||||||
if (!tempModel.contains(stmt)) {
|
|
||||||
localRemovalQueue.add(stmt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
ci.close();
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
inferenceModel.leaveCriticalSection();
|
|
||||||
}
|
|
||||||
for (Iterator<Statement> i = localRemovalQueue.iterator(); i.hasNext(); ) {
|
for (Iterator<Statement> i = localRemovalQueue.iterator(); i.hasNext(); ) {
|
||||||
fullModel.enterCriticalSection(Lock.WRITE);
|
fullModel.enterCriticalSection(Lock.WRITE);
|
||||||
closePipe();
|
closePipe();
|
||||||
|
@ -448,10 +426,10 @@ public class PelletListener implements ModelChangedListener {
|
||||||
if (pipeOpen) {
|
if (pipeOpen) {
|
||||||
sendToPellet = false;
|
sendToPellet = false;
|
||||||
boolean denied = false;
|
boolean denied = false;
|
||||||
ObjectPropertyStatementPattern stPat = ObjectPropertyStatementPatternFactory.getPattern(stmt.getSubject(), stmt.getPredicate(), (Resource) stmt.getObject());
|
ReasonerStatementPattern stPat = ReasonerStatementPattern.objectPattern(stmt);
|
||||||
if (inferenceDrivingPatternDenySet != null) {
|
if (inferenceDrivingPatternDenySet != null) {
|
||||||
for (Iterator<ObjectPropertyStatementPattern> i = inferenceDrivingPatternDenySet.iterator(); i.hasNext(); ){
|
for (Iterator<ReasonerStatementPattern> i = inferenceDrivingPatternDenySet.iterator(); i.hasNext(); ){
|
||||||
ObjectPropertyStatementPattern pat = i.next();
|
ReasonerStatementPattern pat = i.next();
|
||||||
if (pat.matches(stPat)) {
|
if (pat.matches(stPat)) {
|
||||||
denied = true;
|
denied = true;
|
||||||
break;
|
break;
|
||||||
|
@ -463,10 +441,10 @@ public class PelletListener implements ModelChangedListener {
|
||||||
sendToPellet = true;
|
sendToPellet = true;
|
||||||
} else {
|
} else {
|
||||||
// TODO: O(1) implementation of this
|
// TODO: O(1) implementation of this
|
||||||
List<ObjectPropertyStatementPattern> patList = this.inferenceDrivingPatternMap.get(stmt.getPredicate());
|
List<ReasonerStatementPattern> patList = this.inferenceDrivingPatternMap.get(stmt.getPredicate());
|
||||||
if (patList != null) {
|
if (patList != null) {
|
||||||
for (Iterator<ObjectPropertyStatementPattern> i = patList.iterator(); i.hasNext(); ){
|
for (Iterator<ReasonerStatementPattern> i = patList.iterator(); i.hasNext(); ){
|
||||||
ObjectPropertyStatementPattern pat = i.next();
|
ReasonerStatementPattern pat = i.next();
|
||||||
if (pat.matches(stPat)) {
|
if (pat.matches(stPat)) {
|
||||||
sendToPellet = true;
|
sendToPellet = true;
|
||||||
break;
|
break;
|
||||||
|
@ -526,10 +504,10 @@ public class PelletListener implements ModelChangedListener {
|
||||||
}
|
}
|
||||||
removeFromPellet = false;
|
removeFromPellet = false;
|
||||||
boolean denied = false;
|
boolean denied = false;
|
||||||
ObjectPropertyStatementPattern stPat = ObjectPropertyStatementPatternFactory.getPattern(stmt.getSubject(), stmt.getPredicate(), (Resource) stmt.getObject());
|
ReasonerStatementPattern stPat = ReasonerStatementPattern.objectPattern(stmt);
|
||||||
if (inferenceDrivingPatternDenySet != null) {
|
if (inferenceDrivingPatternDenySet != null) {
|
||||||
for (Iterator<ObjectPropertyStatementPattern> i = inferenceDrivingPatternDenySet.iterator(); i.hasNext(); ){
|
for (Iterator<ReasonerStatementPattern> i = inferenceDrivingPatternDenySet.iterator(); i.hasNext(); ){
|
||||||
ObjectPropertyStatementPattern pat = i.next();
|
ReasonerStatementPattern pat = i.next();
|
||||||
if (pat.matches(stPat)) {
|
if (pat.matches(stPat)) {
|
||||||
denied = true;
|
denied = true;
|
||||||
break;
|
break;
|
||||||
|
@ -541,10 +519,10 @@ public class PelletListener implements ModelChangedListener {
|
||||||
removeFromPellet = true;
|
removeFromPellet = true;
|
||||||
} else {
|
} else {
|
||||||
// TODO: O(1) implementation of this
|
// TODO: O(1) implementation of this
|
||||||
List<ObjectPropertyStatementPattern> patList = this.inferenceDrivingPatternMap.get(stmt.getPredicate());
|
List<ReasonerStatementPattern> patList = this.inferenceDrivingPatternMap.get(stmt.getPredicate());
|
||||||
if (patList != null) {
|
if (patList != null) {
|
||||||
for (Iterator<ObjectPropertyStatementPattern> i = patList.iterator(); i.hasNext(); ){
|
for (Iterator<ReasonerStatementPattern> i = patList.iterator(); i.hasNext(); ){
|
||||||
ObjectPropertyStatementPattern pat = i.next();
|
ReasonerStatementPattern pat = i.next();
|
||||||
if (pat.matches(stPat)) {
|
if (pat.matches(stPat)) {
|
||||||
removeFromPellet = true;
|
removeFromPellet = true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -26,7 +26,6 @@ import com.hp.hpl.jena.vocabulary.OWL;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
|
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena;
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.pellet.PelletListener;
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.pellet.PelletListener;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.pellet.ReasonerConfiguration;
|
|
||||||
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
|
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
|
||||||
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
|
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames;
|
||||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
|
||||||
|
@ -34,6 +33,7 @@ import edu.cornell.mannlib.vitro.webapp.reasoner.ReasonerPlugin;
|
||||||
import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasoner;
|
import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasoner;
|
||||||
import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasonerTBoxListener;
|
import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasonerTBoxListener;
|
||||||
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
|
import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.tboxreasoner.ReasonerConfiguration;
|
||||||
import edu.cornell.mannlib.vitro.webapp.utils.threads.VitroBackgroundThread;
|
import edu.cornell.mannlib.vitro.webapp.utils.threads.VitroBackgroundThread;
|
||||||
|
|
||||||
public class SimpleReasonerSetup implements ServletContextListener {
|
public class SimpleReasonerSetup implements ServletContextListener {
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
package edu.cornell.mannlib.vitro.webapp.dao.jena.pellet;
|
package edu.cornell.mannlib.vitro.webapp.tboxreasoner;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.mindswap.pellet.jena.PelletReasonerFactory;
|
||||||
|
|
||||||
import com.hp.hpl.jena.ontology.OntModelSpec;
|
import com.hp.hpl.jena.ontology.OntModelSpec;
|
||||||
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 com.hp.hpl.jena.vocabulary.RDFS;
|
||||||
|
|
||||||
import org.mindswap.pellet.jena.PelletReasonerFactory;
|
|
||||||
|
|
||||||
public class ReasonerConfiguration {
|
public class ReasonerConfiguration {
|
||||||
|
|
||||||
public Set<ObjectPropertyStatementPattern> inferenceDrivingPatternAllowSet;
|
public Set<ReasonerStatementPattern> inferenceDrivingPatternAllowSet;
|
||||||
public Set<ObjectPropertyStatementPattern> inferenceDrivingPatternDenySet;
|
public Set<ReasonerStatementPattern> inferenceDrivingPatternDenySet;
|
||||||
public Set<ObjectPropertyStatementPattern> inferenceReceivingPatternAllowSet;
|
public Set<ReasonerStatementPattern> inferenceReceivingPatternAllowSet;
|
||||||
|
|
||||||
private boolean queryForAllObjectProperties = false;
|
private boolean queryForAllObjectProperties = false;
|
||||||
private boolean incrementalReasoningEnabled = true;
|
private boolean incrementalReasoningEnabled = true;
|
||||||
|
@ -58,34 +58,34 @@ public class ReasonerConfiguration {
|
||||||
|
|
||||||
//ask the reasoner only to classify, realize, and infer disjointWith statements (based on a somewhat incomplete information)
|
//ask the reasoner only to classify, realize, and infer disjointWith statements (based on a somewhat incomplete information)
|
||||||
DEFAULT = new ReasonerConfiguration();
|
DEFAULT = new ReasonerConfiguration();
|
||||||
HashSet<ObjectPropertyStatementPattern> defaultInferenceDrivingPatternAllowSet = new HashSet<ObjectPropertyStatementPattern>();
|
HashSet<ReasonerStatementPattern> defaultInferenceDrivingPatternAllowSet = new HashSet<>();
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDF.type,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDF.type));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDFS.subClassOf,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDFS.subClassOf));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDFS.subPropertyOf,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDFS.subPropertyOf));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.equivalentClass,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.equivalentClass));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.unionOf,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.unionOf));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.intersectionOf,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.intersectionOf));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.complementOf,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.complementOf));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.oneOf,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.oneOf));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.onProperty,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.onProperty));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.someValuesFrom,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.someValuesFrom));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.allValuesFrom,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.allValuesFrom));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.hasValue,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.hasValue));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.minCardinality,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.minCardinality));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.maxCardinality,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.maxCardinality));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.cardinality,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.cardinality));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDF.first,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDF.first));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDF.rest,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDF.rest));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.disjointWith,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.disjointWith));
|
||||||
defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.inverseOf,null));
|
defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.inverseOf));
|
||||||
DEFAULT.setInferenceDrivingPatternAllowSet(defaultInferenceDrivingPatternAllowSet);
|
DEFAULT.setInferenceDrivingPatternAllowSet(defaultInferenceDrivingPatternAllowSet);
|
||||||
Set<ObjectPropertyStatementPattern> defaultInferenceReceivingPatternAllowSet = new HashSet<ObjectPropertyStatementPattern>();
|
Set<ReasonerStatementPattern> defaultInferenceReceivingPatternAllowSet = new HashSet<>();
|
||||||
defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDF.type,null));
|
defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDF.type));
|
||||||
defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDFS.subClassOf,null));
|
defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDFS.subClassOf));
|
||||||
defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDFS.subPropertyOf,null));
|
defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDFS.subPropertyOf));
|
||||||
defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.equivalentClass,null));
|
defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.equivalentClass));
|
||||||
defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.disjointWith,null));
|
defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.disjointWith));
|
||||||
defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.inverseOf,null));
|
defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.inverseOf));
|
||||||
DEFAULT.setInferenceReceivingPatternAllowSet(defaultInferenceReceivingPatternAllowSet);
|
DEFAULT.setInferenceReceivingPatternAllowSet(defaultInferenceReceivingPatternAllowSet);
|
||||||
DEFAULT.setQueryForAllObjectProperties(false);
|
DEFAULT.setQueryForAllObjectProperties(false);
|
||||||
|
|
||||||
|
@ -107,36 +107,36 @@ public class ReasonerConfiguration {
|
||||||
COMPLETE.setQueryForAllObjectProperties(true);
|
COMPLETE.setQueryForAllObjectProperties(true);
|
||||||
COMPLETE.setReasonOnAllDatatypePropertyStatements(true);
|
COMPLETE.setReasonOnAllDatatypePropertyStatements(true);
|
||||||
COMPLETE.setQueryForAllDatatypeProperties(true);
|
COMPLETE.setQueryForAllDatatypeProperties(true);
|
||||||
Set<ObjectPropertyStatementPattern> completeInferenceReceivingPatternAllowSet = new HashSet<ObjectPropertyStatementPattern>();
|
Set<ReasonerStatementPattern> completeInferenceReceivingPatternAllowSet = new HashSet<>();
|
||||||
completeInferenceReceivingPatternAllowSet.addAll(defaultInferenceReceivingPatternAllowSet);
|
completeInferenceReceivingPatternAllowSet.addAll(defaultInferenceReceivingPatternAllowSet);
|
||||||
completeInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null, OWL.sameAs, null));
|
completeInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.sameAs));
|
||||||
// getting NPEs inside Pellet with differentFrom on 2.0.0-rc7
|
// getting NPEs inside Pellet with differentFrom on 2.0.0-rc7
|
||||||
//completeInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null, OWL.differentFrom, null));
|
//completeInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern( OWL.differentFrom, null));
|
||||||
COMPLETE.setInferenceReceivingPatternAllowSet(completeInferenceReceivingPatternAllowSet);
|
COMPLETE.setInferenceReceivingPatternAllowSet(completeInferenceReceivingPatternAllowSet);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<ObjectPropertyStatementPattern> getInferenceDrivingPatternAllowSet() {
|
public Set<ReasonerStatementPattern> getInferenceDrivingPatternAllowSet() {
|
||||||
return this.inferenceDrivingPatternAllowSet;
|
return this.inferenceDrivingPatternAllowSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setInferenceDrivingPatternAllowSet(Set<ObjectPropertyStatementPattern> patternSet) {
|
public void setInferenceDrivingPatternAllowSet(Set<ReasonerStatementPattern> patternSet) {
|
||||||
this.inferenceDrivingPatternAllowSet = patternSet;
|
this.inferenceDrivingPatternAllowSet = patternSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<ObjectPropertyStatementPattern> getInferenceDrivingPatternDenySet() {
|
public Set<ReasonerStatementPattern> getInferenceDrivingPatternDenySet() {
|
||||||
return this.inferenceDrivingPatternDenySet;
|
return this.inferenceDrivingPatternDenySet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setInferenceDrivingPatternDenySet(Set<ObjectPropertyStatementPattern> patternSet) {
|
public void setInferenceDrivingPatternDenySet(Set<ReasonerStatementPattern> patternSet) {
|
||||||
this.inferenceDrivingPatternDenySet = patternSet;
|
this.inferenceDrivingPatternDenySet = patternSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<ObjectPropertyStatementPattern> getInferenceReceivingPatternAllowSet() {
|
public Set<ReasonerStatementPattern> getInferenceReceivingPatternAllowSet() {
|
||||||
return this.inferenceReceivingPatternAllowSet;
|
return this.inferenceReceivingPatternAllowSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setInferenceReceivingPatternAllowSet(Set<ObjectPropertyStatementPattern> patternSet) {
|
public void setInferenceReceivingPatternAllowSet(Set<ReasonerStatementPattern> patternSet) {
|
||||||
this.inferenceReceivingPatternAllowSet = patternSet;
|
this.inferenceReceivingPatternAllowSet = patternSet;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.tboxreasoner;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.rdf.model.Model;
|
||||||
|
import com.hp.hpl.jena.rdf.model.Property;
|
||||||
|
import com.hp.hpl.jena.rdf.model.Resource;
|
||||||
|
import com.hp.hpl.jena.rdf.model.Statement;
|
||||||
|
import com.hp.hpl.jena.shared.Lock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For now, this only models Object Properties.
|
||||||
|
*
|
||||||
|
* It should be easy to add Data Property patterns by making this abstract and
|
||||||
|
* creating two concrete subclasses.
|
||||||
|
*/
|
||||||
|
public class ReasonerStatementPattern {
|
||||||
|
public static final ReasonerStatementPattern ANY_OBJECT_PROPERTY = new ReasonerStatementPattern(
|
||||||
|
null, null, null);
|
||||||
|
|
||||||
|
public static ReasonerStatementPattern objectPattern(Property predicate) {
|
||||||
|
return new ReasonerStatementPattern(null, predicate, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ReasonerStatementPattern objectPattern(Statement stmt) {
|
||||||
|
if (!stmt.getObject().isResource()) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Object of stmt must be a resource.");
|
||||||
|
}
|
||||||
|
return new ReasonerStatementPattern(stmt.getSubject(),
|
||||||
|
stmt.getPredicate(), stmt.getObject().asResource());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any or all of these may be null, which acts as a wild card.
|
||||||
|
*/
|
||||||
|
private final Resource subject;
|
||||||
|
private final Property predicate;
|
||||||
|
private final Resource object;
|
||||||
|
private final String toString;
|
||||||
|
|
||||||
|
private ReasonerStatementPattern(Resource subject, Property predicate,
|
||||||
|
Resource object) {
|
||||||
|
this.subject = subject;
|
||||||
|
this.predicate = predicate;
|
||||||
|
this.object = object;
|
||||||
|
this.toString = buildToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Property getPredicate() {
|
||||||
|
return predicate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All fields must match, either by being equal, or by being a wild card.
|
||||||
|
*/
|
||||||
|
public boolean matches(ReasonerStatementPattern that) {
|
||||||
|
boolean sMatch = this.subject == null || that.subject == null
|
||||||
|
|| this.subject.equals(that.subject);
|
||||||
|
boolean pMatch = this.predicate == null || that.predicate == null
|
||||||
|
|| this.predicate.equals(that.predicate);
|
||||||
|
boolean oMatch = this.object == null || that.object == null
|
||||||
|
|| this.object.equals(that.object);
|
||||||
|
return sMatch && pMatch && oMatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of statements from this model that match this pattern.
|
||||||
|
*/
|
||||||
|
public List<Statement> matchStatementsFromModel(Model m) {
|
||||||
|
m.enterCriticalSection(Lock.READ);
|
||||||
|
try {
|
||||||
|
return m.listStatements(subject, predicate, object).toList();
|
||||||
|
} finally {
|
||||||
|
m.leaveCriticalSection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String buildToString() {
|
||||||
|
return "ReasonerStatementPattern[subject="
|
||||||
|
+ (subject == null ? "*" : subject.toString()) + ", predicate="
|
||||||
|
+ (predicate == null ? "*" : predicate.toString())
|
||||||
|
+ ", object=" + (object == null ? "*" : object.toString())
|
||||||
|
+ "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return toString;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue