You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by pu...@apache.org on 2016/09/27 15:36:17 UTC
[2/3] incubator-rya git commit: RYA-168 adding test and support for
alternate representation
RYA-168 adding test and support for alternate representation
Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/5edfd65e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/5edfd65e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/5edfd65e
Branch: refs/heads/master
Commit: 5edfd65e58f97f1ff6188a69c1d719f9701a94e4
Parents: da8a2e6
Author: pujav65 <pu...@gmail.com>
Authored: Mon Sep 26 12:30:05 2016 -0400
Committer: pujav65 <pu...@gmail.com>
Committed: Tue Sep 27 11:25:20 2016 -0400
----------------------------------------------------------------------
.../mvm/rya/sail/config/RyaSailFactory.java | 5 +-
.../src/main/java/MongoRyaDirectExample.java | 51 +++++++++
.../src/main/java/RyaDirectExample.java | 22 ++++
.../inference/InferenceEngine.java | 57 ++++++++++
.../rdftriplestore/inference/InverseURI.java | 46 ++++++++
.../inference/PropertyChainVisitor.java | 9 +-
.../inference/PropertyChainTest.java | 106 +++++++++++++++++++
7 files changed, 290 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5edfd65e/extras/indexing/src/main/java/mvm/rya/sail/config/RyaSailFactory.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/mvm/rya/sail/config/RyaSailFactory.java b/extras/indexing/src/main/java/mvm/rya/sail/config/RyaSailFactory.java
index afffb68..b0a719b 100644
--- a/extras/indexing/src/main/java/mvm/rya/sail/config/RyaSailFactory.java
+++ b/extras/indexing/src/main/java/mvm/rya/sail/config/RyaSailFactory.java
@@ -89,9 +89,8 @@ public class RyaSailFactory {
final MongoRyaInstanceDetailsRepository ryaDetailsRepo = new MongoRyaInstanceDetailsRepository(client, mongoConfig.getCollectionName());
RyaDetailsToConfiguration.addRyaDetailsToConfiguration(ryaDetailsRepo.getRyaInstanceDetails(), mongoConfig);
} catch (final RyaDetailsRepositoryException e) {
- LOG.info("Instance does not have a rya details collection, skipping.");
- }
- dao = getMongoDAO((MongoDBRdfConfiguration)rdfConfig, client);
+ LOG.info("Instance does not have a rya details collection, skipping.");
+ } dao = getMongoDAO((MongoDBRdfConfiguration)rdfConfig, client);
} else {
rdfConfig = new AccumuloRdfConfiguration(config);
user = rdfConfig.get(ConfigUtils.CLOUDBASE_USER);
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5edfd65e/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
----------------------------------------------------------------------
diff --git a/extras/indexingExample/src/main/java/MongoRyaDirectExample.java b/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
index 2bc0924..8a2bac5 100644
--- a/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
+++ b/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
@@ -89,6 +89,7 @@ public class MongoRyaDirectExample {
if (USE_INFER){
testInfer(conn, sail);
testPropertyChainInference(conn, sail);
+ testPropertyChainInferenceAltRepresentation(conn, sail);
}
log.info("TIME: " + (System.currentTimeMillis() - start) / 1000.);
@@ -324,6 +325,55 @@ public class MongoRyaDirectExample {
Validate.isTrue(resultHandler.getCount() == 0);
}
+
+ public static void testPropertyChainInferenceAltRepresentation(SailRepositoryConnection conn, Sail sail) throws MalformedQueryException, RepositoryException,
+ UpdateExecutionException, QueryEvaluationException, TupleQueryResultHandlerException, InferenceEngineException {
+
+ // Add data
+ String query = "INSERT DATA\n"//
+ + "{ GRAPH <http://updated/test> {\n"//
+ + " <urn:jenGreatGranMother> <urn:Motherof> <urn:jenGranMother> . "
+ + " <urn:jenGranMother> <urn:isChildOf> <urn:jenGreatGranMother> . "
+ + " <urn:jenGranMother> <urn:Motherof> <urn:jenMother> . "
+ + " <urn:jenMother> <urn:isChildOf> <urn:jenGranMother> . "
+ + " <urn:jenMother> <urn:Motherof> <urn:jen> . "
+ + " <urn:jen> <urn:isChildOf> <urn:jenMother> . "
+ + " <urn:jen> <urn:Motherof> <urn:jenDaughter> . }}";
+
+ log.info("Performing Query");
+
+ Update update = conn.prepareUpdate(QueryLanguage.SPARQL, query);
+ update.execute();
+
+ query = "select ?p { GRAPH <http://updated/test> {?s <urn:Motherof>/<urn:Motherof> ?p}}";
+ CountingResultHandler resultHandler = new CountingResultHandler();
+ TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, query);
+ tupleQuery.evaluate(resultHandler);
+ log.info("Result count : " + resultHandler.getCount());
+
+
+ // try adding a property chain and querying for it
+ query = "INSERT DATA\n"//
+ + "{ GRAPH <http://updated/test> {\n"//
+ + " <urn:greatMother> owl:propertyChainAxiom <urn:12342> . " +
+ " <urn:12342> <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:node1atjakcvbx15023 . " +
+ " _:node1atjakcvbx15023 <http://www.w3.org/2002/07/owl#inverseOf> <urn:isChildOf> . " +
+ " <urn:12342> <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:node1atjakcvbx15123 . " +
+ " _:node1atjakcvbx15123 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . " +
+ " _:node1atjakcvbx15123 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <urn:MotherOf> . }}";
+ update = conn.prepareUpdate(QueryLanguage.SPARQL, query);
+ update.execute();
+ ((RdfCloudTripleStore) sail).getInferenceEngine().refreshGraph();
+
+ resultHandler.resetCount();
+ query = "select ?x { GRAPH <http://updated/test> {<urn:jenGreatGranMother> <urn:greatMother> ?x}}";
+ resultHandler = new CountingResultHandler();
+ tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, query);
+ tupleQuery.evaluate(resultHandler);
+ log.info("Result count : " + resultHandler.getCount());
+
+ }
+
public static void testPropertyChainInference(SailRepositoryConnection conn, Sail sail) throws MalformedQueryException, RepositoryException,
UpdateExecutionException, QueryEvaluationException, TupleQueryResultHandlerException, InferenceEngineException {
@@ -480,6 +530,7 @@ public class MongoRyaDirectExample {
@Override
public void handleSolution(BindingSet arg0) throws TupleQueryResultHandlerException {
count++;
+ System.out.println(arg0);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5edfd65e/extras/indexingExample/src/main/java/RyaDirectExample.java
----------------------------------------------------------------------
diff --git a/extras/indexingExample/src/main/java/RyaDirectExample.java b/extras/indexingExample/src/main/java/RyaDirectExample.java
index 03712ba..acc5617 100644
--- a/extras/indexingExample/src/main/java/RyaDirectExample.java
+++ b/extras/indexingExample/src/main/java/RyaDirectExample.java
@@ -17,7 +17,10 @@
* under the License.
*/
+import java.io.File;
+import java.io.FileInputStream;
import java.net.UnknownHostException;
+import java.util.Collection;
import java.util.List;
import org.apache.accumulo.core.client.AccumuloException;
@@ -33,6 +36,7 @@ import org.apache.log4j.Logger;
import org.apache.rya.indexing.pcj.storage.PcjException;
import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
import org.apache.rya.indexing.pcj.storage.accumulo.PcjVarOrderFactory;
+import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.impl.LiteralImpl;
@@ -52,6 +56,10 @@ import org.openrdf.query.UpdateExecutionException;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.sail.SailRepositoryConnection;
+import org.openrdf.rio.RDFFormat;
+import org.openrdf.rio.RDFParser;
+import org.openrdf.rio.Rio;
+import org.openrdf.rio.helpers.StatementCollector;
import org.openrdf.sail.Sail;
import org.openrdf.sail.SailException;
@@ -81,6 +89,20 @@ public class RyaDirectExample {
private static final String AUTHS = "U";
public static void main(final String[] args) throws Exception {
+
+ File inputFile = new File("C:\\SPARTADEV\\propChain.ttl");
+ RDFParser parser = Rio.createParser(RDFFormat.TURTLE);
+ StatementCollector coll = new StatementCollector();
+ parser.setRDFHandler(coll);
+ parser.parse(new FileInputStream(inputFile), "");
+ Collection<Statement> statements = coll.getStatements();
+ System.out.println("Start");
+ for (Statement statement : statements){
+ System.out.println(statement);
+ }
+ System.out.println("End");
+ System.exit(-1);
+
final Configuration conf = getConf();
conf.setBoolean(ConfigUtils.DISPLAY_QUERY_PLAN, PRINT_QUERIES);
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5edfd65e/sail/src/main/java/mvm/rya/rdftriplestore/inference/InferenceEngine.java
----------------------------------------------------------------------
diff --git a/sail/src/main/java/mvm/rya/rdftriplestore/inference/InferenceEngine.java b/sail/src/main/java/mvm/rya/rdftriplestore/inference/InferenceEngine.java
index c323892..b7288b2 100644
--- a/sail/src/main/java/mvm/rya/rdftriplestore/inference/InferenceEngine.java
+++ b/sail/src/main/java/mvm/rya/rdftriplestore/inference/InferenceEngine.java
@@ -303,6 +303,63 @@ public class InferenceEngine {
}
propertyChainPropertyToChain.put(propertyChainProperty, properties);
}
+
+ // could also be represented as a list of properties (some of which may be blank nodes)
+ for (URI propertyChainProperty : propertyChainPropertiesToBNodes.keySet()){
+ List<URI> existingChain = propertyChainPropertyToChain.get(propertyChainProperty);
+ // if we didn't get a chain, try to get it through following the collection
+ if ((existingChain == null) || existingChain.isEmpty()) {
+
+ CloseableIteration<Statement, QueryEvaluationException> iter2 = RyaDAOHelper.query(ryaDAO, propertyChainPropertiesToBNodes.get(propertyChainProperty), RDF.FIRST,
+ null, conf);
+ List<URI> properties = new ArrayList<URI>();
+ URI previousBNode = propertyChainPropertiesToBNodes.get(propertyChainProperty);
+ if (iter2.hasNext()) {
+ Statement iter2Statement = iter2.next();
+ Value currentPropValue = iter2Statement.getObject();
+ while ((currentPropValue != null) && (!currentPropValue.stringValue().equalsIgnoreCase(RDF.NIL.stringValue()))){
+ if (currentPropValue instanceof URI){
+ iter2 = RyaDAOHelper.query(ryaDAO, vf.createURI(currentPropValue.stringValue()), RDF.FIRST,
+ null, conf);
+ if (iter2.hasNext()){
+ iter2Statement = iter2.next();
+ if (iter2Statement.getObject() instanceof URI){
+ properties.add((URI)iter2Statement.getObject());
+ }
+ }
+ // otherwise see if there is an inverse declaration
+ else {
+ iter2 = RyaDAOHelper.query(ryaDAO, vf.createURI(currentPropValue.stringValue()), OWL.INVERSEOF,
+ null, conf);
+ if (iter2.hasNext()){
+ iter2Statement = iter2.next();
+ if (iter2Statement.getObject() instanceof URI){
+ properties.add(new InverseURI((URI)iter2Statement.getObject()));
+ }
+ }
+ }
+ // get the next prop pointer
+ iter2 = RyaDAOHelper.query(ryaDAO, previousBNode, RDF.REST,
+ null, conf);
+ if (iter2.hasNext()){
+ iter2Statement = iter2.next();
+ previousBNode = (URI)currentPropValue;
+ currentPropValue = iter2Statement.getObject();
+ }
+ else {
+ currentPropValue = null;
+ }
+ }
+ else {
+ currentPropValue = null;
+ }
+
+ }
+ propertyChainPropertyToChain.put(propertyChainProperty, properties);
+ }
+ }
+ }
+
} catch (QueryEvaluationException e) {
throw new InferenceEngineException(e);
}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5edfd65e/sail/src/main/java/mvm/rya/rdftriplestore/inference/InverseURI.java
----------------------------------------------------------------------
diff --git a/sail/src/main/java/mvm/rya/rdftriplestore/inference/InverseURI.java b/sail/src/main/java/mvm/rya/rdftriplestore/inference/InverseURI.java
new file mode 100644
index 0000000..c182fb5
--- /dev/null
+++ b/sail/src/main/java/mvm/rya/rdftriplestore/inference/InverseURI.java
@@ -0,0 +1,46 @@
+package mvm.rya.rdftriplestore.inference;
+
+import org.openrdf.model.URI;
+import org.openrdf.model.impl.URIImpl;
+
+public class InverseURI implements URI {
+
+ private URI impl;
+
+ public InverseURI(URI uri) {
+ this.impl = uri;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((impl == null) ? 0 : impl.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof InverseURI){
+ return impl.equals(((InverseURI) obj).impl);
+ }
+ return false;
+ }
+
+ @Override
+ public String stringValue() {
+ return impl.stringValue();
+ }
+
+ @Override
+ public String getNamespace() {
+ return impl.getNamespace();
+ }
+
+ @Override
+ public String getLocalName() {
+ return impl.getLocalName();
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5edfd65e/sail/src/main/java/mvm/rya/rdftriplestore/inference/PropertyChainVisitor.java
----------------------------------------------------------------------
diff --git a/sail/src/main/java/mvm/rya/rdftriplestore/inference/PropertyChainVisitor.java b/sail/src/main/java/mvm/rya/rdftriplestore/inference/PropertyChainVisitor.java
index 06d557f..6e487b2 100644
--- a/sail/src/main/java/mvm/rya/rdftriplestore/inference/PropertyChainVisitor.java
+++ b/sail/src/main/java/mvm/rya/rdftriplestore/inference/PropertyChainVisitor.java
@@ -82,10 +82,14 @@ public class PropertyChainVisitor extends AbstractInferVisitor {
for (URI chainElement : chain ){
String s = UUID.randomUUID().toString();
Var currentObj = new Var("c-" + s);
- StatementPattern statementPattern = new StatementPattern(nextSubj, new Var(chainElement.stringValue()), currentObj, sp.getContextVar());
+ StatementPattern statementPattern = new StatementPattern(nextSubj, new Var(chainElement.stringValue()), currentObj, sp.getContextVar());
+ if (chainElement instanceof InverseURI){
+ statementPattern = new StatementPattern(currentObj, new Var(chainElement.stringValue()), nextSubj, sp.getContextVar());
+ }
expandedPatterns.add(statementPattern);
lastStatementPatternAdded = statementPattern;
- nextSubj = statementPattern.getObjectVar();
+ nextSubj = currentObj;
+
}
lastStatementPatternAdded.setObjectVar(originalObj);
@@ -99,7 +103,6 @@ public class PropertyChainVisitor extends AbstractInferVisitor {
Join newJoin = new Join(pattern, lastRight);
lastRight = newJoin;
}
- System.out.println(pattern);
}
if (lastRight != null){
node.replaceWith(lastRight);
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5edfd65e/sail/src/test/java/mvm/rya/triplestore/inference/PropertyChainTest.java
----------------------------------------------------------------------
diff --git a/sail/src/test/java/mvm/rya/triplestore/inference/PropertyChainTest.java b/sail/src/test/java/mvm/rya/triplestore/inference/PropertyChainTest.java
new file mode 100644
index 0000000..8592e0a
--- /dev/null
+++ b/sail/src/test/java/mvm/rya/triplestore/inference/PropertyChainTest.java
@@ -0,0 +1,106 @@
+package mvm.rya.triplestore.inference;
+
+import java.util.List;
+
+import org.apache.accumulo.core.Constants;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.admin.SecurityOperations;
+import org.apache.accumulo.core.client.mock.MockInstance;
+import org.apache.accumulo.core.security.Authorizations;
+import org.apache.accumulo.core.security.TablePermission;
+import org.junit.Assert;
+import org.junit.Test;
+import org.openrdf.model.URI;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.ValueFactoryImpl;
+import org.openrdf.query.QueryLanguage;
+import org.openrdf.query.Update;
+import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.repository.sail.SailRepositoryConnection;
+
+import junit.framework.TestCase;
+import mvm.rya.accumulo.AccumuloRdfConfiguration;
+import mvm.rya.accumulo.AccumuloRyaDAO;
+import mvm.rya.api.RdfCloudTripleStoreConstants;
+import mvm.rya.rdftriplestore.RdfCloudTripleStore;
+import mvm.rya.rdftriplestore.inference.InferenceEngine;
+import mvm.rya.rdftriplestore.inference.InverseURI;
+
+public class PropertyChainTest extends TestCase {
+ private String user = "user";
+ private String pwd = "pwd";
+ private String instance = "myinstance";
+ private String tablePrefix = "t_";
+ private Authorizations auths = Constants.NO_AUTHS;
+ private Connector connector;
+ private AccumuloRyaDAO ryaDAO;
+ private ValueFactory vf = new ValueFactoryImpl();
+ private String namespace = "urn:test#";
+ private AccumuloRdfConfiguration conf;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ connector = new MockInstance(instance).getConnector(user, pwd.getBytes());
+ connector.tableOperations().create(tablePrefix + RdfCloudTripleStoreConstants.TBL_SPO_SUFFIX);
+ connector.tableOperations().create(tablePrefix + RdfCloudTripleStoreConstants.TBL_PO_SUFFIX);
+ connector.tableOperations().create(tablePrefix + RdfCloudTripleStoreConstants.TBL_OSP_SUFFIX);
+ connector.tableOperations().create(tablePrefix + RdfCloudTripleStoreConstants.TBL_NS_SUFFIX);
+ SecurityOperations secOps = connector.securityOperations();
+ secOps.createUser(user, pwd.getBytes(), auths);
+ secOps.grantTablePermission(user, tablePrefix + RdfCloudTripleStoreConstants.TBL_SPO_SUFFIX, TablePermission.READ);
+ secOps.grantTablePermission(user, tablePrefix + RdfCloudTripleStoreConstants.TBL_PO_SUFFIX, TablePermission.READ);
+ secOps.grantTablePermission(user, tablePrefix + RdfCloudTripleStoreConstants.TBL_OSP_SUFFIX, TablePermission.READ);
+ secOps.grantTablePermission(user, tablePrefix + RdfCloudTripleStoreConstants.TBL_NS_SUFFIX, TablePermission.READ);
+
+ conf = new AccumuloRdfConfiguration();
+ ryaDAO = new AccumuloRyaDAO();
+ ryaDAO.setConnector(connector);
+ conf.setTablePrefix(tablePrefix);
+ ryaDAO.setConf(conf);
+ ryaDAO.init();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ connector.tableOperations().delete(tablePrefix + RdfCloudTripleStoreConstants.TBL_SPO_SUFFIX);
+ connector.tableOperations().delete(tablePrefix + RdfCloudTripleStoreConstants.TBL_PO_SUFFIX);
+ connector.tableOperations().delete(tablePrefix + RdfCloudTripleStoreConstants.TBL_OSP_SUFFIX);
+ connector.tableOperations().delete(tablePrefix + RdfCloudTripleStoreConstants.TBL_NS_SUFFIX);
+ }
+
+ @Test
+ public void testGraphConfiguration() throws Exception {
+ // build a connection
+ RdfCloudTripleStore store = new RdfCloudTripleStore();
+ store.setConf(conf);
+ store.setRyaDAO(ryaDAO);
+ InferenceEngine inferenceEngine = new InferenceEngine();
+ inferenceEngine.setRyaDAO(ryaDAO);
+ store.setInferenceEngine(inferenceEngine);
+ inferenceEngine.refreshGraph();
+ store.initialize();
+ SailRepository repository = new SailRepository(store);
+ SailRepositoryConnection conn = repository.getConnection();
+
+
+
+ String query = "INSERT DATA\n"//
+ + "{ GRAPH <http://updated/test> {\n"//
+ + " <urn:greatMother> owl:propertyChainAxiom <urn:12342> . " +
+ " <urn:12342> <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:node1atjakcvbx15023 . " +
+ " _:node1atjakcvbx15023 <http://www.w3.org/2002/07/owl#inverseOf> <urn:isChildOf> . " +
+ " <urn:12342> <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:node1atjakcvbx15123 . " +
+ " _:node1atjakcvbx15123 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> . " +
+ " _:node1atjakcvbx15123 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <urn:MotherOf> . }}";
+ Update update = conn.prepareUpdate(QueryLanguage.SPARQL, query);
+ update.execute();
+ inferenceEngine.refreshGraph();
+ List<URI> chain = inferenceEngine.getPropertyChain(vf.createURI("urn:greatMother"));
+ Assert.assertEquals(chain.size(), 2);
+ Assert.assertEquals(chain.get(0), new InverseURI(vf.createURI("urn:isChildOf")));
+ Assert.assertEquals(chain.get(1), vf.createURI("urn:MotherOf"));
+
+ }
+}