Modified:
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/AbstractDatabase.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/Data.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/DataException.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/Database.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/Results.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/Utils.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/DatasourceDatabase.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/FileDatabase.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/LarqIndexedDatabase.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/RdfFileFilter.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/SDBAbstractDatabase.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/SDBDatabase.java
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/Scratch.java
/trunk/Caboto/database/src/test/java/org
/trunk/Caboto/database/src/test/java/org/caboto
/trunk/Caboto/database/src/test/java/org/caboto/jena
/trunk/Caboto/database/src/test/java/org/caboto/jena/db
/trunk/Caboto/database/src/test/java/org/caboto/jena/db/impl
/trunk/Caboto/database/src/test/java/org/caboto/jena/db/impl/LarqIndexedDatabaseTest.java
/trunk/Caboto/database/src/test/resources/graphs
/trunk/Caboto/database/src/test/resources/graphs/test
=======================================
---
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/AbstractDatabase.java
Wed Mar 25 06:25:30 2009
+++
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/AbstractDatabase.java
Fri Jan 15 03:36:53 2010
@@ -40,14 +40,28 @@
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
+import com.hp.hpl.jena.rdf.model.InfModel;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
+import com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner;
+import com.hp.hpl.jena.reasoner.rulesys.Rule;
+import com.hp.hpl.jena.reasoner.rulesys.Rule.Parser;
import com.hp.hpl.jena.sparql.util.Context;
import com.hp.hpl.jena.sparql.util.Symbol;
+import com.hp.hpl.jena.util.FileManager;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
/**
* A useful database abstraction that implements the details of the
queries,
@@ -58,9 +72,12 @@
*/
public abstract class AbstractDatabase implements Database {
+ final static Log log = LogFactory.getLog(AbstractDatabase.class);
+
private Context context;
-
- /**
+ private GenericRuleReasoner reasoner;
+
+ /**
* Gets the data object of the database for querying
*
* @return The data object
@@ -142,10 +159,12 @@
*/
public boolean addModel(String uri, Model model) {
try {
+ log.info("Adding data to model: " + uri + " " + reasoner);
Data data = getData();
Model m = data.getModel(uri);
m.withDefaultMappings(model);
m.add(model);
+ if (reasoner != null) redoInferred(uri, m, false);
m.close();
data.close();
return true;
@@ -161,10 +180,12 @@
*/
public boolean deleteModel(String uri, Model model) {
try {
+ log.info("Deleteing data in model: " + uri + " " + reasoner);
Data data = getData();
Model m = data.getModel(uri);
m.withDefaultMappings(model);
m.remove(model);
+ if (reasoner != null) redoInferred(uri, m, true);
m.close();
data.close();
return true;
@@ -176,9 +197,11 @@
public boolean deleteAll(String uri) {
try {
+ log.info("Deleting model: " + uri + " " + reasoner);
Data data = getData();
Model m = data.getModel(uri);
m.removeAll();
+ if (reasoner != null) redoInferred(uri, m, true);
m.close();
data.close();
return true;
@@ -198,6 +221,7 @@
public boolean updateProperty(String uri, String resourceUri,
Property property, RDFNode value) {
try {
+ log.info("Updting property in model: " + uri + " " + reasoner);
Data data = getData();
Model m = data.getModel(uri);
if (!m.containsResource(
@@ -230,4 +254,28 @@
}
public Context getQueryContext() { return this.context; }
-}
+
+ public void setRules(String rulesFile) {
+ try {
+ log.info("Trying to load rule file: " + rulesFile);
+ InputStream rulesStream = FileManager.get().open(rulesFile);
+ Parser rules = Rule.rulesParserFromReader(
+ new BufferedReader(
+ new InputStreamReader(rulesStream, "UTF-8")));
+ reasoner = new GenericRuleReasoner(Rule.parseRules(rules));
+ log.info("Loaded!");
+ } catch (Throwable ex) {
+ log.error("Problem loading rules <" + rulesFile + ">", ex);
+ }
+ }
+
+ public void redoInferred(String uri, Model m, boolean nonMon) throws
DataException {
+ log.info("Running inferences on " + uri);
+ Data data = getData();
+ Model infData = data.getModel(uri + "-inferred");
+ if (nonMon) infData.removeAll(); // Truth maintenance grossly
simplified
+ InfModel inf = ModelFactory.createInfModel(reasoner, m);
+ infData.add(inf.getDeductionsModel());
+ log.info("Inferencing done");
+ }
+}
=======================================
--- /trunk/Caboto/database/src/main/java/org/caboto/jena/db/Database.java
Wed Mar 25 06:25:30 2009
+++ /trunk/Caboto/database/src/main/java/org/caboto/jena/db/Database.java
Fri Jan 15 03:36:53 2010
@@ -144,4 +144,11 @@
* @return
*/
Context getQueryContext();
-}
+
+ /**
+ * Set rules to be run over database
+ *
+ * @param rulesFile Rules file to load
+ */
+ void setRules(String rulesFile);
+}
=======================================
---
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/LarqIndexedDatabase.java
Fri Mar 20 03:55:59 2009
+++
/trunk/Caboto/database/src/main/java/org/caboto/jena/db/impl/LarqIndexedDatabase.java
Fri Jan 15 03:36:53 2010
@@ -217,6 +217,10 @@
private void setIndex(IndexLARQ index) {
database.setQueryContext(LARQ.indexKey, cacheIfRequired(index));
}
+
+ public void setRules(String rulesFile) {
+ database.setRules(rulesFile);
+ }
static class IndexLARQCacher extends IndexLARQ {
=======================================
---
/trunk/Caboto/database/src/test/java/org/caboto/jena/db/impl/LarqIndexedDatabaseTest.java
Fri Mar 20 03:55:59 2009
+++
/trunk/Caboto/database/src/test/java/org/caboto/jena/db/impl/LarqIndexedDatabaseTest.java
Fri Jan 15 03:36:53 2010
@@ -230,6 +230,10 @@
public Context getQueryContext() {
return context;
}
+
+ public void setRules(String rulesFile) {
+ throw new UnsupportedOperationException("Not supported
yet.");
+ }
}
}