From 468a7214fec6f0ae564b1cea4078b653b3940564 Mon Sep 17 00:00:00 2001 From: Jim Blake Date: Wed, 26 Nov 2014 11:16:17 -0500 Subject: [PATCH] VIVO-778 Clean up ObjectPropertyStatementPattern Rename to ReasonerStatementPattern, move to a new package and refactor. --- .../ObjectPropertyStatementPattern.java | 52 ----- ...ObjectPropertyStatementPatternFactory.java | 26 --- .../dao/jena/pellet/PelletListener.java | 180 ++++++++---------- .../servlet/setup/SimpleReasonerSetup.java | 2 +- .../ReasonerConfiguration.java | 84 ++++---- .../ReasonerStatementPattern.java | 94 +++++++++ 6 files changed, 216 insertions(+), 222 deletions(-) delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ObjectPropertyStatementPattern.java delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ObjectPropertyStatementPatternFactory.java rename webapp/src/edu/cornell/mannlib/vitro/webapp/{dao/jena/pellet => tboxreasoner}/ReasonerConfiguration.java (52%) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/tboxreasoner/ReasonerStatementPattern.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ObjectPropertyStatementPattern.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ObjectPropertyStatementPattern.java deleted file mode 100644 index 001ecee14..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ObjectPropertyStatementPattern.java +++ /dev/null @@ -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); - } - -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ObjectPropertyStatementPatternFactory.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ObjectPropertyStatementPatternFactory.java deleted file mode 100644 index 57fb8f900..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ObjectPropertyStatementPatternFactory.java +++ /dev/null @@ -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 patternSet = new HashSet(); - - public static ObjectPropertyStatementPattern getPattern(Resource subject, Property predicate, Resource object) { - //for (Iterator 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; - } - -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/PelletListener.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/PelletListener.java index 47634ddba..d76547497 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/PelletListener.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/PelletListener.java @@ -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.jena.event.EditEvent; +import edu.cornell.mannlib.vitro.webapp.tboxreasoner.ReasonerConfiguration; +import edu.cornell.mannlib.vitro.webapp.tboxreasoner.ReasonerStatementPattern; public class PelletListener implements ModelChangedListener { @@ -50,11 +52,11 @@ public class PelletListener implements ModelChangedListener { private OntModel mainModel; private Model inferenceModel; private ReasonerConfiguration reasonerConfiguration; - private Set inferenceDrivingPatternAllowSet; - private Set inferenceDrivingPatternDenySet; - private Set inferenceReceivingPatternAllowSet; + private Set inferenceDrivingPatternAllowSet; + private Set inferenceDrivingPatternDenySet; + private Set inferenceReceivingPatternAllowSet; - private Map> inferenceDrivingPatternMap; + private Map> inferenceDrivingPatternMap; private Model additionModel; private Model removalModel; @@ -142,13 +144,13 @@ public class PelletListener implements ModelChangedListener { this.inferenceReceivingPatternAllowSet = reasonerConfiguration.getInferenceReceivingPatternAllowSet(); if (this.inferenceDrivingPatternAllowSet != null) { - this.inferenceDrivingPatternMap = new HashMap>(); - for (Iterator i = inferenceDrivingPatternAllowSet.iterator(); i.hasNext();) { - ObjectPropertyStatementPattern pat = i.next(); + this.inferenceDrivingPatternMap = new HashMap<>(); + for (Iterator i = inferenceDrivingPatternAllowSet.iterator(); i.hasNext();) { + ReasonerStatementPattern pat = i.next(); Property p = pat.getPredicate(); - List patList = inferenceDrivingPatternMap.get(p); + List patList = inferenceDrivingPatternMap.get(p); if (patList == null) { - patList = new LinkedList(); + patList = new LinkedList<>(); patList.add(pat); inferenceDrivingPatternMap.put(p, patList); } else { @@ -163,7 +165,7 @@ public class PelletListener implements ModelChangedListener { this.deletedDataProperties = ModelFactory.createDefaultModel(); this.mainModel.enterCriticalSection(Lock.READ); try { - for (ObjectPropertyStatementPattern pat : this.inferenceDrivingPatternAllowSet) { + for (ReasonerStatementPattern pat : this.inferenceDrivingPatternAllowSet) { addedStatements(mainModel.listStatements((Resource) null, pat.getPredicate(), (RDFNode) null)); } if (!skipReasoningUponInitialization) { @@ -198,12 +200,12 @@ public class PelletListener implements ModelChangedListener { inferenceRounds++; log.info("Getting new inferences"); long startTime = System.currentTimeMillis(); - LinkedList irpl = new LinkedList(); + LinkedList irpl = new LinkedList<>(); if (inferenceReceivingPatternAllowSet != null) { irpl.addAll(inferenceReceivingPatternAllowSet); } else { - irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,null,null)); + irpl.add(ReasonerStatementPattern.ANY_OBJECT_PROPERTY); } if (reasonerConfiguration.getQueryForAllObjectProperties()) { @@ -214,7 +216,7 @@ public class PelletListener implements ModelChangedListener { for (Iterator objPropIt = closeIt; objPropIt.hasNext();) { ObjectProperty objProp = (ObjectProperty) objPropIt.next(); if ( !("http://www.w3.org/2002/07/owl#".equals(objProp.getNameSpace())) ) { - irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,objProp,null)); + irpl.add(ReasonerStatementPattern.objectPattern(objProp)); } } } finally { @@ -229,7 +231,7 @@ public class PelletListener implements ModelChangedListener { try { while (sit.hasNext()) { Resource subj = (Resource) sit.next(); - irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,ResourceFactory.createProperty(subj.getURI()),null)); + irpl.add(ReasonerStatementPattern.objectPattern(ResourceFactory.createProperty(subj.getURI()))); } } finally { sit.close(); @@ -249,7 +251,7 @@ public class PelletListener implements ModelChangedListener { DatatypeProperty dataProp = (DatatypeProperty) dataPropIt.next(); if ( !("http://www.w3.org/2002/07/owl#".equals(dataProp.getNameSpace())) ) { // TODO: THIS WILL WORK, BUT NEED TO GENERALIZE THE PATTERN CLASSES - irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,dataProp,null)); + irpl.add(ReasonerStatementPattern.objectPattern(dataProp)); } } } finally { @@ -264,7 +266,7 @@ public class PelletListener implements ModelChangedListener { try { while (sit.hasNext()) { Resource subj = (Resource) sit.next(); - irpl.add(ObjectPropertyStatementPatternFactory.getPattern(null,ResourceFactory.createProperty(subj.getURI()),null)); + irpl.add(ReasonerStatementPattern.objectPattern(ResourceFactory.createProperty(subj.getURI()))); } } finally { sit.close(); @@ -294,68 +296,55 @@ public class PelletListener implements ModelChangedListener { pelletModel.leaveCriticalSection(); } - for (Iterator patIt = irpl.iterator(); patIt.hasNext(); ) { - ObjectPropertyStatementPattern pat = patIt.next(); - - 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); - } + for (Iterator patIt = irpl.iterator(); patIt.hasNext(); ) { + ReasonerStatementPattern pat = patIt.next(); + log.debug("Querying for "+pat); Model tempModel = ModelFactory.createDefaultModel(); pelletModel.enterCriticalSection(Lock.READ); try { - - ClosableIterator ci = pelletModel.listStatements(pat.getSubject(),pat.getPredicate(),pat.getObject()); - try { - for (ClosableIterator i=ci; i.hasNext();) { - Statement stmt = (Statement) i.next(); - - boolean reject = false; - - // this next part is only needed if we're using Jena's OWL reasoner instead of actually using Pellet - try { - if ( ( ((Resource)stmt.getObject()).equals(RDFS.Resource) ) ) { - reject = true; - } else if ( ( stmt.getSubject().equals(OWL.Nothing) ) ) { - reject = true; - } else if ( ( stmt.getObject().equals(OWL.Nothing) ) ) { - reject = true; - } - } catch (Exception e) {} - - if (!reject) { - tempModel.add(stmt); - - boolean fullModelContainsStatement = false; - fullModel.enterCriticalSection(Lock.READ); - try { - fullModelContainsStatement = fullModel.contains(stmt); - } finally { - fullModel.leaveCriticalSection(); - } - - if (!fullModelContainsStatement) { - // 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(); - try { - inferenceModel.add(stmt); - addCount++; - } finally { - openPipe(); - fullModel.leaveCriticalSection(); - } - } - - } - } - } finally { - ci.close(); - } + for(Statement stmt : pat.matchStatementsFromModel(pelletModel)) { + + boolean reject = false; + + // this next part is only needed if we're using Jena's OWL reasoner instead of actually using Pellet + try { + if ( ( ((Resource)stmt.getObject()).equals(RDFS.Resource) ) ) { + reject = true; + } else if ( ( stmt.getSubject().equals(OWL.Nothing) ) ) { + reject = true; + } else if ( ( stmt.getObject().equals(OWL.Nothing) ) ) { + reject = true; + } + } catch (Exception e) {} + + if (!reject) { + tempModel.add(stmt); + + boolean fullModelContainsStatement = false; + fullModel.enterCriticalSection(Lock.READ); + try { + fullModelContainsStatement = fullModel.contains(stmt); + } finally { + fullModel.leaveCriticalSection(); + } + + if (!fullModelContainsStatement) { + // 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(); + try { + inferenceModel.add(stmt); + addCount++; + } finally { + openPipe(); + fullModel.leaveCriticalSection(); + } + } + + } + } } finally { pelletModel.leaveCriticalSection(); } @@ -364,22 +353,11 @@ public class PelletListener implements ModelChangedListener { try { Queue localRemovalQueue = new LinkedList(); - inferenceModel.enterCriticalSection(Lock.READ); - try { - ClosableIterator ci = inferenceModel.listStatements(pat.getSubject(),pat.getPredicate(),pat.getObject()); - 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 (Statement stmt : pat.matchStatementsFromModel(inferenceModel)) { + if (!tempModel.contains(stmt)) { + localRemovalQueue.add(stmt); + } + } for (Iterator i = localRemovalQueue.iterator(); i.hasNext(); ) { fullModel.enterCriticalSection(Lock.WRITE); closePipe(); @@ -448,10 +426,10 @@ public class PelletListener implements ModelChangedListener { if (pipeOpen) { sendToPellet = false; boolean denied = false; - ObjectPropertyStatementPattern stPat = ObjectPropertyStatementPatternFactory.getPattern(stmt.getSubject(), stmt.getPredicate(), (Resource) stmt.getObject()); + ReasonerStatementPattern stPat = ReasonerStatementPattern.objectPattern(stmt); if (inferenceDrivingPatternDenySet != null) { - for (Iterator i = inferenceDrivingPatternDenySet.iterator(); i.hasNext(); ){ - ObjectPropertyStatementPattern pat = i.next(); + for (Iterator i = inferenceDrivingPatternDenySet.iterator(); i.hasNext(); ){ + ReasonerStatementPattern pat = i.next(); if (pat.matches(stPat)) { denied = true; break; @@ -463,10 +441,10 @@ public class PelletListener implements ModelChangedListener { sendToPellet = true; } else { // TODO: O(1) implementation of this - List patList = this.inferenceDrivingPatternMap.get(stmt.getPredicate()); + List patList = this.inferenceDrivingPatternMap.get(stmt.getPredicate()); if (patList != null) { - for (Iterator i = patList.iterator(); i.hasNext(); ){ - ObjectPropertyStatementPattern pat = i.next(); + for (Iterator i = patList.iterator(); i.hasNext(); ){ + ReasonerStatementPattern pat = i.next(); if (pat.matches(stPat)) { sendToPellet = true; break; @@ -526,10 +504,10 @@ public class PelletListener implements ModelChangedListener { } removeFromPellet = false; boolean denied = false; - ObjectPropertyStatementPattern stPat = ObjectPropertyStatementPatternFactory.getPattern(stmt.getSubject(), stmt.getPredicate(), (Resource) stmt.getObject()); + ReasonerStatementPattern stPat = ReasonerStatementPattern.objectPattern(stmt); if (inferenceDrivingPatternDenySet != null) { - for (Iterator i = inferenceDrivingPatternDenySet.iterator(); i.hasNext(); ){ - ObjectPropertyStatementPattern pat = i.next(); + for (Iterator i = inferenceDrivingPatternDenySet.iterator(); i.hasNext(); ){ + ReasonerStatementPattern pat = i.next(); if (pat.matches(stPat)) { denied = true; break; @@ -541,10 +519,10 @@ public class PelletListener implements ModelChangedListener { removeFromPellet = true; } else { // TODO: O(1) implementation of this - List patList = this.inferenceDrivingPatternMap.get(stmt.getPredicate()); + List patList = this.inferenceDrivingPatternMap.get(stmt.getPredicate()); if (patList != null) { - for (Iterator i = patList.iterator(); i.hasNext(); ){ - ObjectPropertyStatementPattern pat = i.next(); + for (Iterator i = patList.iterator(); i.hasNext(); ){ + ReasonerStatementPattern pat = i.next(); if (pat.matches(stPat)) { removeFromPellet = true; break; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java index 08d3b5cc3..48a2fb1e2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/SimpleReasonerSetup.java @@ -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.jena.WebappDaoFactoryJena; 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.ModelNames; 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.SimpleReasonerTBoxListener; 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; public class SimpleReasonerSetup implements ServletContextListener { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ReasonerConfiguration.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/tboxreasoner/ReasonerConfiguration.java similarity index 52% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ReasonerConfiguration.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/tboxreasoner/ReasonerConfiguration.java index 970c14e4d..8f6889ba2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/pellet/ReasonerConfiguration.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/tboxreasoner/ReasonerConfiguration.java @@ -1,22 +1,22 @@ /* $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.Set; +import org.mindswap.pellet.jena.PelletReasonerFactory; + import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.vocabulary.OWL; import com.hp.hpl.jena.vocabulary.RDF; import com.hp.hpl.jena.vocabulary.RDFS; -import org.mindswap.pellet.jena.PelletReasonerFactory; - public class ReasonerConfiguration { - public Set inferenceDrivingPatternAllowSet; - public Set inferenceDrivingPatternDenySet; - public Set inferenceReceivingPatternAllowSet; + public Set inferenceDrivingPatternAllowSet; + public Set inferenceDrivingPatternDenySet; + public Set inferenceReceivingPatternAllowSet; private boolean queryForAllObjectProperties = false; 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) DEFAULT = new ReasonerConfiguration(); - HashSet defaultInferenceDrivingPatternAllowSet = new HashSet(); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDF.type,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDFS.subClassOf,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDFS.subPropertyOf,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.equivalentClass,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.unionOf,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.intersectionOf,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.complementOf,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.oneOf,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.onProperty,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.someValuesFrom,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.allValuesFrom,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.hasValue,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.minCardinality,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.maxCardinality,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.cardinality,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDF.first,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDF.rest,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.disjointWith,null)); - defaultInferenceDrivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.inverseOf,null)); + HashSet defaultInferenceDrivingPatternAllowSet = new HashSet<>(); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDF.type)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDFS.subClassOf)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDFS.subPropertyOf)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.equivalentClass)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.unionOf)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.intersectionOf)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.complementOf)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.oneOf)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.onProperty)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.someValuesFrom)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.allValuesFrom)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.hasValue)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.minCardinality)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.maxCardinality)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.cardinality)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDF.first)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDF.rest)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.disjointWith)); + defaultInferenceDrivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.inverseOf)); DEFAULT.setInferenceDrivingPatternAllowSet(defaultInferenceDrivingPatternAllowSet); - Set defaultInferenceReceivingPatternAllowSet = new HashSet(); - defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDF.type,null)); - defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDFS.subClassOf,null)); - defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,RDFS.subPropertyOf,null)); - defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.equivalentClass,null)); - defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.disjointWith,null)); - defaultInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null,OWL.inverseOf,null)); + Set defaultInferenceReceivingPatternAllowSet = new HashSet<>(); + defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDF.type)); + defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDFS.subClassOf)); + defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(RDFS.subPropertyOf)); + defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.equivalentClass)); + defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.disjointWith)); + defaultInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern(OWL.inverseOf)); DEFAULT.setInferenceReceivingPatternAllowSet(defaultInferenceReceivingPatternAllowSet); DEFAULT.setQueryForAllObjectProperties(false); @@ -107,36 +107,36 @@ public class ReasonerConfiguration { COMPLETE.setQueryForAllObjectProperties(true); COMPLETE.setReasonOnAllDatatypePropertyStatements(true); COMPLETE.setQueryForAllDatatypeProperties(true); - Set completeInferenceReceivingPatternAllowSet = new HashSet(); + Set completeInferenceReceivingPatternAllowSet = new HashSet<>(); 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 - //completeInferenceReceivingPatternAllowSet.add(ObjectPropertyStatementPatternFactory.getPattern(null, OWL.differentFrom, null)); + //completeInferenceReceivingPatternAllowSet.add(ReasonerStatementPattern.objectPattern( OWL.differentFrom, null)); COMPLETE.setInferenceReceivingPatternAllowSet(completeInferenceReceivingPatternAllowSet); } - public Set getInferenceDrivingPatternAllowSet() { + public Set getInferenceDrivingPatternAllowSet() { return this.inferenceDrivingPatternAllowSet; } - public void setInferenceDrivingPatternAllowSet(Set patternSet) { + public void setInferenceDrivingPatternAllowSet(Set patternSet) { this.inferenceDrivingPatternAllowSet = patternSet; } - public Set getInferenceDrivingPatternDenySet() { + public Set getInferenceDrivingPatternDenySet() { return this.inferenceDrivingPatternDenySet; } - public void setInferenceDrivingPatternDenySet(Set patternSet) { + public void setInferenceDrivingPatternDenySet(Set patternSet) { this.inferenceDrivingPatternDenySet = patternSet; } - public Set getInferenceReceivingPatternAllowSet() { + public Set getInferenceReceivingPatternAllowSet() { return this.inferenceReceivingPatternAllowSet; } - public void setInferenceReceivingPatternAllowSet(Set patternSet) { + public void setInferenceReceivingPatternAllowSet(Set patternSet) { this.inferenceReceivingPatternAllowSet = patternSet; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/tboxreasoner/ReasonerStatementPattern.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/tboxreasoner/ReasonerStatementPattern.java new file mode 100644 index 000000000..e1c1c627e --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/tboxreasoner/ReasonerStatementPattern.java @@ -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 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; + } + +}