From 964cb1bdb49679cfe81c44d7ccfc7d110e8e83e6 Mon Sep 17 00:00:00 2001 From: brianjlowe Date: Fri, 8 Jun 2012 20:54:17 +0000 Subject: [PATCH] SimpleReasoner listening to all abox graphs --- .../dao/jena/ABoxJenaChangeListener.java | 42 +++++++++++++++++++ .../vitro/webapp/reasoner/SimpleReasoner.java | 24 +++++++++-- .../servlet/setup/SimpleReasonerSetup.java | 6 ++- 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ABoxJenaChangeListener.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ABoxJenaChangeListener.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ABoxJenaChangeListener.java new file mode 100644 index 000000000..72042f39c --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ABoxJenaChangeListener.java @@ -0,0 +1,42 @@ +package edu.cornell.mannlib.vitro.webapp.dao.jena; + +import java.util.HashSet; + +import com.hp.hpl.jena.rdf.model.ModelChangedListener; + +import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase; + +public class ABoxJenaChangeListener extends JenaChangeListener { + + private HashSet ignoredGraphs = new HashSet(); + + public ABoxJenaChangeListener(ModelChangedListener listener) { + super(listener); + ignoredGraphs.add(JenaDataSourceSetupBase.JENA_INF_MODEL); + ignoredGraphs.add(JenaDataSourceSetupBase.JENA_TBOX_ASSERTIONS_MODEL); + ignoredGraphs.add(JenaDataSourceSetupBase.JENA_TBOX_INF_MODEL); + } + + @Override + public void addedStatement(String serializedTriple, String graphURI) { + if (isABoxGraph(graphURI)) { + super.addedStatement(serializedTriple, graphURI); + } + } + + @Override + public void removedStatement(String serializedTriple, String graphURI) { + if (isABoxGraph(graphURI)) { + super.removedStatement(serializedTriple, graphURI); + } + } + + private boolean isABoxGraph(String graphURI) { + return (graphURI == null || + JenaDataSourceSetupBase.JENA_DB_MODEL.equals(graphURI) + || (!ignoredGraphs.contains(graphURI) + && !graphURI.contains("filegraph") + && !graphURI.contains("tbox"))); + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java index 52a1b9085..f55467e9b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java @@ -39,8 +39,12 @@ 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.dao.jena.ABoxJenaChangeListener; import edu.cornell.mannlib.vitro.webapp.dao.jena.CumulativeDeltaModeler; +import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.BulkUpdateEvent; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; /** * Allows for real-time incremental materialization or retraction of RDFS- @@ -53,6 +57,7 @@ public class SimpleReasoner extends StatementListener { private static final Log log = LogFactory.getLog(SimpleReasoner.class); + private RDFService rdfService; private OntModel tboxModel; // asserted and inferred TBox axioms private OntModel aboxModel; // ABox assertions private Model inferenceModel; // ABox inferences @@ -78,10 +83,13 @@ public class SimpleReasoner extends StatementListener { * @param inferenceRebuildModel - output. This the model temporarily used when the whole ABox inference model is rebuilt * @param inferenceScratchpadModel - output. This the model temporarily used when the whole ABox inference model is rebuilt */ - public SimpleReasoner(OntModel tboxModel, OntModel aboxModel, Model inferenceModel, + public SimpleReasoner(OntModel tboxModel, RDFService rdfService, Model inferenceModel, Model inferenceRebuildModel, Model scratchpadModel) { + this.rdfService = rdfService; this.tboxModel = tboxModel; - this.aboxModel = aboxModel; + this.aboxModel = ModelFactory.createOntologyModel( + OntModelSpec.OWL_MEM, ModelFactory.createModelForGraph( + new RDFServiceGraph(rdfService))); this.inferenceModel = inferenceModel; this.inferenceRebuildModel = inferenceRebuildModel; this.scratchpadModel = scratchpadModel; @@ -90,8 +98,16 @@ public class SimpleReasoner extends StatementListener { aBoxDeltaModeler1 = new CumulativeDeltaModeler(); aBoxDeltaModeler2 = new CumulativeDeltaModeler(); stopRequested = false; - - aboxModel.getBaseModel().register(this); + + if (rdfService == null) { + aboxModel.register(this); + } else { + try { + rdfService.registerListener(new ABoxJenaChangeListener(this)); + } catch (RDFServiceException e) { + throw new RuntimeException("Unable to register change listener", e); + } + } } /** 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 6e967fca4..ff5bb35df 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,6 +26,8 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; 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.rdfservice.RDFService; +import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils; import edu.cornell.mannlib.vitro.webapp.reasoner.ReasonerPlugin; import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasoner; import edu.cornell.mannlib.vitro.webapp.reasoner.SimpleReasonerTBoxListener; @@ -101,7 +103,9 @@ public class SimpleReasonerSetup implements ServletContextListener { // the simple reasoner will register itself as a listener to the ABox assertions - SimpleReasoner simpleReasoner = new SimpleReasoner(unionOms.getTBoxModel(), assertionsOms.getABoxModel(), inferencesOms.getABoxModel(), rebuildModel, scratchModel); + RDFService rdfService = RDFServiceUtils.getRDFServiceFactory(ctx).getRDFService(); + SimpleReasoner simpleReasoner = new SimpleReasoner( + unionOms.getTBoxModel(), rdfService, inferencesOms.getABoxModel(), rebuildModel, scratchModel); sce.getServletContext().setAttribute(SimpleReasoner.class.getName(),simpleReasoner); StartupStatus ss = StartupStatus.getBean(ctx);