From f0992605ce3506e873fc9df26bbecac549b699a6 Mon Sep 17 00:00:00 2001 From: brianjlowe Date: Thu, 10 Dec 2015 18:34:54 +0200 Subject: [PATCH] passes sameAs unit tests --- .../vitro/webapp/reasoner/ABoxRecomputer.java | 47 ++++++------------- .../vitro/webapp/reasoner/SimpleReasoner.java | 13 +++-- 2 files changed, 24 insertions(+), 36 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/ABoxRecomputer.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/ABoxRecomputer.java index c130153c4..49885071f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/ABoxRecomputer.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/ABoxRecomputer.java @@ -158,7 +158,7 @@ public class ABoxRecomputer { String individualURI = individuals.poll(); try { additionalInferences.add(recomputeIndividual( - individualURI, rebuildModel, caches)); + individualURI, rebuildModel, caches, individuals)); numInds++; individualsInBatch.add(individualURI); boolean batchFilled = (numInds % BATCH_SIZE) == 0; @@ -202,13 +202,14 @@ public class ABoxRecomputer { private static final boolean SKIP_PLUGINS = !RUN_PLUGINS; private Model recomputeIndividual(String individualURI, - Model rebuildModel, TypeCaches caches) throws RDFServiceException { + Model rebuildModel, TypeCaches caches, Queue individualQueue) + throws RDFServiceException { long start = System.currentTimeMillis(); Model assertions = getAssertions(individualURI); log.debug((System.currentTimeMillis() - start) + " ms to get assertions."); + long prevRebuildSize = (simpleReasoner.getSameAsEnabled()) ? rebuildModel.size() : 0; Model additionalInferences = recomputeIndividual( individualURI, null, assertions, rebuildModel, caches, RUN_PLUGINS); - if (simpleReasoner.getSameAsEnabled()) { Set sameAsInds = getSameAsIndividuals(individualURI); for (String sameAsInd : sameAsInds) { @@ -221,7 +222,15 @@ public class ABoxRecomputer { Resource indRes = ResourceFactory.createResource(individualURI); Resource sameAsIndRes = ResourceFactory.createResource(sameAsInd); if(!assertions.contains(indRes, OWL.sameAs, sameAsIndRes)) { - rebuildModel.add(indRes, OWL.sameAs, sameAsIndRes); + if(!rebuildModel.contains(indRes, OWL.sameAs, sameAsIndRes)) { + individualQueue.add(sameAsInd); + rebuildModel.add(indRes, OWL.sameAs, sameAsIndRes); + } + } + } + if(rebuildModel.size() - prevRebuildSize > 0) { + for (String sameAsInd : sameAsInds) { + individualQueue.add(sameAsInd); } } } @@ -528,7 +537,7 @@ public class ABoxRecomputer { return new ByteArrayInputStream(out.toByteArray()); } - private Set getSameAsIndividuals(String individualURI) { + public Set getSameAsIndividuals(String individualURI) { HashSet sameAsInds = new HashSet(); sameAsInds.add(individualURI); getSameAsIndividuals(individualURI, sameAsInds); @@ -540,7 +549,6 @@ public class ABoxRecomputer { try { final List addedURIs = new ArrayList(); StringBuilder builder = new StringBuilder(); - builder.append("SELECT\n") .append(" ?object\n") .append("WHERE {\n") @@ -553,7 +561,6 @@ public class ABoxRecomputer { .append(" } \n") .append(" FILTER (?g != <" + ModelNames.ABOX_INFERENCES + ">)\n") .append("}\n"); - rdfService.sparqlSelectQuery(builder.toString(), new ResultSetConsumer() { @Override protected void processQuerySolution(QuerySolution qs) { @@ -564,32 +571,6 @@ public class ABoxRecomputer { } } }); - - for (String indUri : addedURIs) { - getSameAsIndividuals(indUri, sameAsInds); - } - - addedURIs.clear(); - builder = new StringBuilder(); - - builder.append("SELECT\n") - .append(" ?subject\n") - .append("WHERE\n") - .append("{\n") - .append(" ?subject <" + OWL.sameAs + "> <" + individualUri + "> .\n") - .append("}\n"); - - rdfService.sparqlSelectQuery(builder.toString(), new ResultSetConsumer() { - @Override - protected void processQuerySolution(QuerySolution qs) { - Resource object = qs.getResource("subject"); - if (object != null && !sameAsInds.contains(object.getURI())) { - sameAsInds.add(object.getURI()); - addedURIs.add(object.getURI()); - } - } - }); - for (String indUri : addedURIs) { getSameAsIndividuals(indUri, sameAsInds); } 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 8a278b0d9..97f15c02c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/reasoner/SimpleReasoner.java @@ -198,8 +198,6 @@ public class SimpleReasoner extends StatementListener { } } - private static final int SAFETY_VALVE = 1000000; // one million individuals - private void recomputeIndividuals() { if(recomputer.isRecomputing()) { return; @@ -250,6 +248,16 @@ public class SimpleReasoner extends StatementListener { @Override public void removedStatement(Statement stmt) { doPlugins(ModelUpdate.Operation.RETRACT,stmt); + if(doSameAs && OWL.sameAs.equals(stmt.getPredicate())) { + if (stmt.getSubject().isURIResource()) { + individualURIqueue.addAll(this.recomputer.getSameAsIndividuals( + stmt.getSubject().getURI())); + } + if (stmt.getObject().isURIResource()) { + individualURIqueue.addAll(this.recomputer.getSameAsIndividuals( + stmt.getObject().asResource().getURI())); + } + } listenToStatement(stmt); // try { // handleRemovedStatement(stmt); @@ -1954,5 +1962,4 @@ public class SimpleReasoner extends StatementListener { } - }