Repository: incubator-rya Updated Branches: refs/heads/master 1efa10093 -> e9488ff69
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/e9488ff6/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java ---------------------------------------------------------------------- diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java index 67d4365..a966a46 100644 --- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java +++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java @@ -1,19 +1,3 @@ -package org.apache.rya.rdftriplestore.inference; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import org.openrdf.model.URI; -import org.openrdf.model.vocabulary.RDF; -import org.openrdf.model.vocabulary.RDFS; -import org.openrdf.model.vocabulary.SESAME; -import org.openrdf.query.algebra.Join; -import org.openrdf.query.algebra.QueryModelNode; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.TupleExpr; -import org.openrdf.query.algebra.Var; - /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -22,9 +6,9 @@ import org.openrdf.query.algebra.Var; * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -32,13 +16,21 @@ import org.openrdf.query.algebra.Var; * specific language governing permissions and limitations * under the License. */ +package org.apache.rya.rdftriplestore.inference; - +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import org.apache.rya.api.RdfCloudTripleStoreConfiguration; -import org.apache.rya.api.utils.NullableStatementImpl; -import org.apache.rya.rdftriplestore.utils.FixedStatementPattern; -import org.apache.rya.rdftriplestore.utils.FixedStatementPattern; +import org.openrdf.model.URI; +import org.openrdf.model.vocabulary.RDF; +import org.openrdf.model.vocabulary.RDFS; +import org.openrdf.model.vocabulary.SESAME; +import org.openrdf.query.algebra.Join; +import org.openrdf.query.algebra.StatementPattern; +import org.openrdf.query.algebra.TupleExpr; +import org.openrdf.query.algebra.Var; /** * All predicates are changed @@ -48,19 +40,19 @@ import org.apache.rya.rdftriplestore.utils.FixedStatementPattern; */ public class PropertyChainVisitor extends AbstractInferVisitor { - public PropertyChainVisitor(RdfCloudTripleStoreConfiguration conf, InferenceEngine inferenceEngine) { + public PropertyChainVisitor(final RdfCloudTripleStoreConfiguration conf, final InferenceEngine inferenceEngine) { super(conf, inferenceEngine); include = true; } @Override - protected void meetSP(StatementPattern node) throws Exception { - StatementPattern sp = node.clone(); + protected void meetSP(final StatementPattern node) throws Exception { + final StatementPattern sp = node.clone(); final Var predVar = sp.getPredicateVar(); - URI pred = (URI) predVar.getValue(); - String predNamespace = pred.getNamespace(); + final URI pred = (URI) predVar.getValue(); + final String predNamespace = pred.getNamespace(); final Var objVar = sp.getObjectVar(); final Var cntxtVar = sp.getContextVar(); @@ -69,45 +61,45 @@ public class PropertyChainVisitor extends AbstractInferVisitor { !SESAME.NAMESPACE.equals(predNamespace) && !RDFS.NAMESPACE.equals(predNamespace) && !EXPANDED.equals(cntxtVar)) { - - URI chainPropURI = (URI) predVar.getValue(); - List<URI> chain = inferenceEngine.getPropertyChain(chainPropURI); - List<StatementPattern> expandedPatterns = new ArrayList<StatementPattern>(); + + final URI chainPropURI = (URI) predVar.getValue(); + final List<URI> chain = inferenceEngine.getPropertyChain(chainPropURI); + final List<StatementPattern> expandedPatterns = new ArrayList<StatementPattern>(); if (chain.size() > 0) { - Var originalSubj = sp.getSubjectVar(); - Var originalObj = sp.getObjectVar(); - - Var nextSubj = originalSubj; - StatementPattern lastStatementPatternAdded = null; - for (URI chainElement : chain ){ - String s = UUID.randomUUID().toString(); - Var currentObj = new Var("c-" + s); + final Var originalSubj = sp.getSubjectVar(); + final Var originalObj = sp.getObjectVar(); + + Var nextSubj = originalSubj; + StatementPattern lastStatementPatternAdded = null; + for (final URI chainElement : chain ){ + final String s = UUID.randomUUID().toString(); + final Var currentObj = new Var("c-" + s); 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()); + statementPattern = new StatementPattern(currentObj, new Var(chainElement.stringValue()), nextSubj, sp.getContextVar()); } - expandedPatterns.add(statementPattern); - lastStatementPatternAdded = statementPattern; + expandedPatterns.add(statementPattern); + lastStatementPatternAdded = statementPattern; nextSubj = currentObj; - - } - lastStatementPatternAdded.setObjectVar(originalObj); - - TupleExpr lastRight = null; - // replace the statement pattern with a series of joins - for (StatementPattern pattern : expandedPatterns){ - if (lastRight == null){ - lastRight = pattern; - } - else { - Join newJoin = new Join(pattern, lastRight); - lastRight = newJoin; - } - } - if (lastRight != null){ - node.replaceWith(lastRight); - } - + + } + lastStatementPatternAdded.setObjectVar(originalObj); + + TupleExpr lastRight = null; + // replace the statement pattern with a series of joins + for (final StatementPattern pattern : expandedPatterns){ + if (lastRight == null){ + lastRight = pattern; + } + else { + final Join newJoin = new Join(pattern, lastRight); + lastRight = newJoin; + } + } + if (lastRight != null){ + node.replaceWith(lastRight); + } + } } } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/e9488ff6/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java ---------------------------------------------------------------------- diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java index 7fb1b4a..1f2fd27 100644 --- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java +++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -18,19 +18,18 @@ */ package org.apache.rya.rdftriplestore.inference; +import java.util.Collection; +import java.util.UUID; + import org.apache.rya.api.RdfCloudTripleStoreConfiguration; import org.apache.rya.api.utils.NullableStatementImpl; import org.apache.rya.rdftriplestore.utils.FixedStatementPattern; -import org.apache.rya.rdftriplestore.utils.FixedStatementPattern; import org.openrdf.model.URI; import org.openrdf.model.vocabulary.RDF; import org.openrdf.model.vocabulary.RDFS; import org.openrdf.query.algebra.StatementPattern; import org.openrdf.query.algebra.Var; -import java.util.Collection; -import java.util.UUID; - /** * Class SubClassOfVisitor * Date: Mar 29, 2011 @@ -38,14 +37,14 @@ import java.util.UUID; */ public class SubClassOfVisitor extends AbstractInferVisitor { - public SubClassOfVisitor(RdfCloudTripleStoreConfiguration conf, InferenceEngine inferenceEngine) { + public SubClassOfVisitor(final RdfCloudTripleStoreConfiguration conf, final InferenceEngine inferenceEngine) { super(conf, inferenceEngine); include = conf.isInferSubClassOf(); } @Override - protected void meetSP(StatementPattern node) throws Exception { - StatementPattern sp = node.clone(); + protected void meetSP(final StatementPattern node) throws Exception { + final StatementPattern sp = node.clone(); final Var predVar = sp.getPredicateVar(); final Var objVar = sp.getObjectVar(); final Var conVar = sp.getContextVar(); @@ -62,19 +61,19 @@ public class SubClassOfVisitor extends AbstractInferVisitor { // join.getProperties().put(InferConstants.INFERRED, InferConstants.TRUE); // node.replaceWith(join); - URI subclassof_uri = (URI) objVar.getValue(); - Collection<URI> parents = inferenceEngine.findParents(inferenceEngine.getSubClassOfGraph(), subclassof_uri); + final URI subclassof_uri = (URI) objVar.getValue(); + final Collection<URI> parents = InferenceEngine.findParents(inferenceEngine.getSubClassOfGraph(), subclassof_uri); if (parents != null && parents.size() > 0) { - String s = UUID.randomUUID().toString(); - Var typeVar = new Var(s); - FixedStatementPattern fsp = new FixedStatementPattern(typeVar, new Var("c-" + s, RDFS.SUBCLASSOF), objVar, conVar); + final String s = UUID.randomUUID().toString(); + final Var typeVar = new Var(s); + final FixedStatementPattern fsp = new FixedStatementPattern(typeVar, new Var("c-" + s, RDFS.SUBCLASSOF), objVar, conVar); parents.add(subclassof_uri); - for (URI u : parents) { + for (final URI u : parents) { fsp.statements.add(new NullableStatementImpl(u, RDFS.SUBCLASSOF, subclassof_uri)); } - StatementPattern rdfType = new DoNotExpandSP(sp.getSubjectVar(), sp.getPredicateVar(), typeVar, conVar); - InferJoin join = new InferJoin(fsp, rdfType); + final StatementPattern rdfType = new DoNotExpandSP(sp.getSubjectVar(), sp.getPredicateVar(), typeVar, conVar); + final InferJoin join = new InferJoin(fsp, rdfType); join.getProperties().put(InferConstants.INFERRED, InferConstants.TRUE); node.replaceWith(join); } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/e9488ff6/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java ---------------------------------------------------------------------- diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java index 9447658..f3a40ab 100644 --- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java +++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java @@ -6,9 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -18,10 +18,12 @@ */ package org.apache.rya.rdftriplestore.inference; +import java.util.Set; +import java.util.UUID; + import org.apache.rya.api.RdfCloudTripleStoreConfiguration; import org.apache.rya.api.utils.NullableStatementImpl; import org.apache.rya.rdftriplestore.utils.FixedStatementPattern; -import org.apache.rya.rdftriplestore.utils.FixedStatementPattern; import org.openrdf.model.URI; import org.openrdf.model.vocabulary.RDF; import org.openrdf.model.vocabulary.RDFS; @@ -29,9 +31,6 @@ import org.openrdf.model.vocabulary.SESAME; import org.openrdf.query.algebra.StatementPattern; import org.openrdf.query.algebra.Var; -import java.util.Set; -import java.util.UUID; - /** * All predicates are changed * Class SubPropertyOfVisitor @@ -40,18 +39,18 @@ import java.util.UUID; */ public class SubPropertyOfVisitor extends AbstractInferVisitor { - public SubPropertyOfVisitor(RdfCloudTripleStoreConfiguration conf, InferenceEngine inferenceEngine) { + public SubPropertyOfVisitor(final RdfCloudTripleStoreConfiguration conf, final InferenceEngine inferenceEngine) { super(conf, inferenceEngine); include = conf.isInferSubPropertyOf(); } @Override - protected void meetSP(StatementPattern node) throws Exception { - StatementPattern sp = node.clone(); + protected void meetSP(final StatementPattern node) throws Exception { + final StatementPattern sp = node.clone(); final Var predVar = sp.getPredicateVar(); - URI pred = (URI) predVar.getValue(); - String predNamespace = pred.getNamespace(); + final URI pred = (URI) predVar.getValue(); + final String predNamespace = pred.getNamespace(); final Var objVar = sp.getObjectVar(); final Var cntxtVar = sp.getContextVar(); @@ -95,21 +94,21 @@ public class SubPropertyOfVisitor extends AbstractInferVisitor { // node.replaceWith(new StatementPattern(subjVar, vc, objVar, node.getContextVar())); // } - URI subprop_uri = (URI) predVar.getValue(); - Set<URI> parents = inferenceEngine.findParents(inferenceEngine.getSubPropertyOfGraph(), subprop_uri); + final URI subprop_uri = (URI) predVar.getValue(); + final Set<URI> parents = InferenceEngine.findParents(inferenceEngine.getSubPropertyOfGraph(), subprop_uri); if (parents != null && parents.size() > 0) { - String s = UUID.randomUUID().toString(); - Var typeVar = new Var(s); - FixedStatementPattern fsp = new FixedStatementPattern(typeVar, new Var("c-" + s, RDFS.SUBPROPERTYOF), predVar, cntxtVar); + final String s = UUID.randomUUID().toString(); + final Var typeVar = new Var(s); + final FixedStatementPattern fsp = new FixedStatementPattern(typeVar, new Var("c-" + s, RDFS.SUBPROPERTYOF), predVar, cntxtVar); // fsp.statements.add(new NullableStatementImpl(subprop_uri, RDFS.SUBPROPERTYOF, subprop_uri)); //add self parents.add(subprop_uri); - for (URI u : parents) { + for (final URI u : parents) { fsp.statements.add(new NullableStatementImpl(u, RDFS.SUBPROPERTYOF, subprop_uri)); } - StatementPattern rdfType = new DoNotExpandSP(sp.getSubjectVar(), typeVar, sp.getObjectVar(), cntxtVar); - InferJoin join = new InferJoin(fsp, rdfType); + final StatementPattern rdfType = new DoNotExpandSP(sp.getSubjectVar(), typeVar, sp.getObjectVar(), cntxtVar); + final InferJoin join = new InferJoin(fsp, rdfType); join.getProperties().put(InferConstants.INFERRED, InferConstants.TRUE); node.replaceWith(join); } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/e9488ff6/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java ---------------------------------------------------------------------- diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java index b50da9c..45f74ed 100644 --- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java +++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java @@ -1,5 +1,3 @@ -package org.apache.rya.rdftriplestore.inference; - /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -8,9 +6,9 @@ package org.apache.rya.rdftriplestore.inference; * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -18,12 +16,10 @@ package org.apache.rya.rdftriplestore.inference; * specific language governing permissions and limitations * under the License. */ - - +package org.apache.rya.rdftriplestore.inference; import org.apache.rya.api.RdfCloudTripleStoreConfiguration; import org.apache.rya.rdftriplestore.utils.TransitivePropertySP; -import org.apache.rya.rdftriplestore.utils.TransitivePropertySP; import org.openrdf.model.URI; import org.openrdf.model.vocabulary.RDF; import org.openrdf.model.vocabulary.RDFS; @@ -39,18 +35,18 @@ import org.openrdf.query.algebra.Var; */ public class TransitivePropertyVisitor extends AbstractInferVisitor { - public TransitivePropertyVisitor(RdfCloudTripleStoreConfiguration conf, InferenceEngine inferenceEngine) { + public TransitivePropertyVisitor(final RdfCloudTripleStoreConfiguration conf, final InferenceEngine inferenceEngine) { super(conf, inferenceEngine); include = conf.isInferTransitiveProperty(); } @Override - protected void meetSP(StatementPattern node) throws Exception { - StatementPattern sp = node.clone(); + protected void meetSP(final StatementPattern node) throws Exception { + final StatementPattern sp = node.clone(); final Var predVar = sp.getPredicateVar(); - URI pred = (URI) predVar.getValue(); - String predNamespace = pred.getNamespace(); + final URI pred = (URI) predVar.getValue(); + final String predNamespace = pred.getNamespace(); final Var objVar = sp.getObjectVar(); final Var cntxtVar = sp.getContextVar(); @@ -60,7 +56,7 @@ public class TransitivePropertyVisitor extends AbstractInferVisitor { !RDFS.NAMESPACE.equals(predNamespace) && !EXPANDED.equals(cntxtVar)) { - URI transPropUri = (URI) predVar.getValue(); + final URI transPropUri = (URI) predVar.getValue(); if (inferenceEngine.isTransitiveProperty(transPropUri)) { node.replaceWith(new TransitivePropertySP(sp.getSubjectVar(), sp.getPredicateVar(), sp.getObjectVar(), sp.getContextVar())); } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/e9488ff6/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java ---------------------------------------------------------------------- diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java index bfefe12..ee63213 100644 --- a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java +++ b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java @@ -1,5 +1,3 @@ -package org.apache.rya.rdftriplestore.utils; - /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -8,9 +6,9 @@ package org.apache.rya.rdftriplestore.utils; * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -18,16 +16,15 @@ package org.apache.rya.rdftriplestore.utils; * specific language governing permissions and limitations * under the License. */ +package org.apache.rya.rdftriplestore.utils; - +import java.util.ArrayList; +import java.util.Collection; import org.openrdf.model.Statement; import org.openrdf.query.algebra.StatementPattern; import org.openrdf.query.algebra.Var; -import java.util.ArrayList; -import java.util.Collection; - /** * StatementPattern gives fixed statements back * @@ -36,24 +33,24 @@ import java.util.Collection; * Time: 2:42:06 PM */ public class FixedStatementPattern extends StatementPattern { - public Collection<Statement> statements = new ArrayList(); + public Collection<Statement> statements = new ArrayList<>(); public FixedStatementPattern() { } - public FixedStatementPattern(Var subject, Var predicate, Var object) { + public FixedStatementPattern(final Var subject, final Var predicate, final Var object) { super(subject, predicate, object); } - public FixedStatementPattern(Scope scope, Var subject, Var predicate, Var object) { + public FixedStatementPattern(final Scope scope, final Var subject, final Var predicate, final Var object) { super(scope, subject, predicate, object); } - public FixedStatementPattern(Var subject, Var predicate, Var object, Var context) { + public FixedStatementPattern(final Var subject, final Var predicate, final Var object, final Var context) { super(subject, predicate, object, context); } - public FixedStatementPattern(Scope scope, Var subjVar, Var predVar, Var objVar, Var conVar) { + public FixedStatementPattern(final Scope scope, final Var subjVar, final Var predVar, final Var objVar, final Var conVar) { super(scope, subjVar, predVar, objVar, conVar); } } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/e9488ff6/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java ---------------------------------------------------------------------- diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java index 556413f..10edf49 100644 --- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java +++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java @@ -1,4 +1,3 @@ -package org.apache.rya.rdftriplestore.inference; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -17,10 +16,12 @@ package org.apache.rya.rdftriplestore.inference; * specific language governing permissions and limitations * under the License. */ +package org.apache.rya.rdftriplestore.inference; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -33,7 +34,6 @@ import org.apache.rya.rdftriplestore.RdfCloudTripleStore; import org.apache.tinkerpop.gremlin.structure.Graph; import org.junit.After; import org.junit.Assert; - import org.junit.Test; import org.openrdf.model.Resource; import org.openrdf.model.URI; @@ -44,12 +44,14 @@ import org.openrdf.query.QueryLanguage; import org.openrdf.repository.sail.SailRepository; import org.openrdf.repository.sail.SailRepositoryConnection; +import com.google.common.collect.Sets; + import junit.framework.TestCase; public class InferenceEngineTest extends TestCase { private Connector connector; private AccumuloRyaDAO dao; - private ValueFactory vf = new ValueFactoryImpl(); + private final ValueFactory vf = new ValueFactoryImpl(); private AccumuloRdfConfiguration conf; private RdfCloudTripleStore store; private InferenceEngine inferenceEngine; @@ -77,6 +79,7 @@ public class InferenceEngineTest extends TestCase { conn = repository.getConnection(); } + @Override @After public void tearDown() throws Exception { conn.close(); @@ -88,7 +91,7 @@ public class InferenceEngineTest extends TestCase { @Test public void testSubClassGraph() throws Exception { - String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + final String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + " <urn:A> rdfs:subClassOf <urn:C> . \n" + " <urn:B> rdfs:subClassOf <urn:C> . \n" + " <urn:C> rdfs:subClassOf <urn:D> . \n" @@ -99,34 +102,33 @@ public class InferenceEngineTest extends TestCase { + "}}"; conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute(); inferenceEngine.refreshGraph(); - Graph graph = inferenceEngine.getSubClassOfGraph(); - URI a = vf.createURI("urn:A"); - URI b = vf.createURI("urn:B"); - URI c = vf.createURI("urn:C"); - URI d = vf.createURI("urn:D"); - URI e = vf.createURI("urn:E"); - URI f = vf.createURI("urn:F"); - URI g = vf.createURI("urn:G"); - URI z = vf.createURI("urn:Z"); - URI missing = vf.createURI("urn:Missing"); - Set<URI> empty = new HashSet<>(); - Set<URI> belowLevel2 = new HashSet<>(Arrays.asList(new URI[] { a, b })); - Set<URI> belowLevel3 = new HashSet<>(Arrays.asList(new URI[] { a, b, c, d, e })); - Set<URI> belowLevel4 = new HashSet<>(Arrays.asList(new URI[] { a, b, c, d, e, f, g })); - Assert.assertEquals(empty, inferenceEngine.findParents(graph, a)); - Assert.assertEquals(empty, inferenceEngine.findParents(graph, b)); - Assert.assertEquals(empty, inferenceEngine.findParents(graph, z)); - Assert.assertEquals(empty, inferenceEngine.findParents(graph, missing)); - Assert.assertEquals(belowLevel2, inferenceEngine.findParents(graph, c)); - Assert.assertEquals(belowLevel3, inferenceEngine.findParents(graph, d)); - Assert.assertEquals(belowLevel3, inferenceEngine.findParents(graph, e)); - Assert.assertEquals(belowLevel4, inferenceEngine.findParents(graph, f)); - Assert.assertEquals(belowLevel4, inferenceEngine.findParents(graph, g)); + final URI a = vf.createURI("urn:A"); + final URI b = vf.createURI("urn:B"); + final URI c = vf.createURI("urn:C"); + final URI d = vf.createURI("urn:D"); + final URI e = vf.createURI("urn:E"); + final URI f = vf.createURI("urn:F"); + final URI g = vf.createURI("urn:G"); + final URI z = vf.createURI("urn:Z"); + final URI missing = vf.createURI("urn:Missing"); + final Set<URI> empty = new HashSet<>(); + final Set<URI> belowLevel2 = new HashSet<>(Arrays.asList(new URI[] { a, b })); + final Set<URI> belowLevel3 = new HashSet<>(Arrays.asList(new URI[] { a, b, c, d, e })); + final Set<URI> belowLevel4 = new HashSet<>(Arrays.asList(new URI[] { a, b, c, d, e, f, g })); + Assert.assertEquals(empty, inferenceEngine.getSubClasses(a)); + Assert.assertEquals(empty, inferenceEngine.getSubClasses(b)); + Assert.assertEquals(empty, inferenceEngine.getSubClasses(z)); + Assert.assertEquals(empty, inferenceEngine.getSubClasses(missing)); + Assert.assertEquals(belowLevel2, inferenceEngine.getSubClasses(c)); + Assert.assertEquals(belowLevel3, inferenceEngine.getSubClasses(d)); + Assert.assertEquals(belowLevel3, inferenceEngine.getSubClasses(e)); + Assert.assertEquals(belowLevel4, inferenceEngine.getSubClasses(f)); + Assert.assertEquals(belowLevel4, inferenceEngine.getSubClasses(g)); } @Test public void testSubPropertyGraph() throws Exception { - String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + final String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + " <urn:p> rdfs:subPropertyOf <urn:q> . \n" + " <urn:p> rdfs:subPropertyOf <urn:r> . \n" + " <urn:r> owl:equivalentProperty <urn:s> . \n" @@ -138,35 +140,35 @@ public class InferenceEngineTest extends TestCase { + "}}"; conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute(); inferenceEngine.refreshGraph(); - Graph graph = inferenceEngine.getSubPropertyOfGraph(); - URI p = vf.createURI("urn:p"); - URI q = vf.createURI("urn:q"); - URI r = vf.createURI("urn:r"); - URI s = vf.createURI("urn:s"); - URI t = vf.createURI("urn:t"); - URI u = vf.createURI("urn:u"); - URI v = vf.createURI("urn:v"); - URI w = vf.createURI("urn:w"); - URI missing = vf.createURI("urn:Missing"); - Set<URI> empty = new HashSet<>(); - Set<URI> belowQ = new HashSet<>(Arrays.asList(new URI[] { p })); - Set<URI> belowR = new HashSet<>(Arrays.asList(new URI[] { p, r, s })); - Set<URI> belowT = new HashSet<>(Arrays.asList(new URI[] { p, q })); - Set<URI> belowU = new HashSet<>(Arrays.asList(new URI[] { p, q, r, s, t, u, v })); - Assert.assertEquals(empty, inferenceEngine.findParents(graph, p)); - Assert.assertEquals(empty, inferenceEngine.findParents(graph, w)); - Assert.assertEquals(empty, inferenceEngine.findParents(graph, missing)); - Assert.assertEquals(belowQ, inferenceEngine.findParents(graph, q)); - Assert.assertEquals(belowR, inferenceEngine.findParents(graph, r)); - Assert.assertEquals(belowR, inferenceEngine.findParents(graph, s)); - Assert.assertEquals(belowT, inferenceEngine.findParents(graph, t)); - Assert.assertEquals(belowU, inferenceEngine.findParents(graph, u)); - Assert.assertEquals(belowU, inferenceEngine.findParents(graph, v)); + final Graph graph = inferenceEngine.getSubPropertyOfGraph(); + final URI p = vf.createURI("urn:p"); + final URI q = vf.createURI("urn:q"); + final URI r = vf.createURI("urn:r"); + final URI s = vf.createURI("urn:s"); + final URI t = vf.createURI("urn:t"); + final URI u = vf.createURI("urn:u"); + final URI v = vf.createURI("urn:v"); + final URI w = vf.createURI("urn:w"); + final URI missing = vf.createURI("urn:Missing"); + final Set<URI> empty = new HashSet<>(); + final Set<URI> belowQ = new HashSet<>(Arrays.asList(new URI[] { p })); + final Set<URI> belowR = new HashSet<>(Arrays.asList(new URI[] { p, r, s })); + final Set<URI> belowT = new HashSet<>(Arrays.asList(new URI[] { p, q })); + final Set<URI> belowU = new HashSet<>(Arrays.asList(new URI[] { p, q, r, s, t, u, v })); + Assert.assertEquals(empty, InferenceEngine.findParents(graph, p)); + Assert.assertEquals(empty, InferenceEngine.findParents(graph, w)); + Assert.assertEquals(empty, InferenceEngine.findParents(graph, missing)); + Assert.assertEquals(belowQ, InferenceEngine.findParents(graph, q)); + Assert.assertEquals(belowR, InferenceEngine.findParents(graph, r)); + Assert.assertEquals(belowR, InferenceEngine.findParents(graph, s)); + Assert.assertEquals(belowT, InferenceEngine.findParents(graph, t)); + Assert.assertEquals(belowU, InferenceEngine.findParents(graph, u)); + Assert.assertEquals(belowU, InferenceEngine.findParents(graph, v)); } @Test public void testDomainRange() throws Exception { - String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + final String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + " <urn:p1> rdfs:subPropertyOf <urn:p2> . \n" + " <urn:p2> rdfs:subPropertyOf <urn:p3> . \n" + " <urn:q1> rdfs:subPropertyOf <urn:q2> . \n" @@ -187,25 +189,25 @@ public class InferenceEngineTest extends TestCase { + "}}"; conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute(); inferenceEngine.refreshGraph(); - Set<URI> hasDomainD1 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D1")); - Set<URI> hasDomainD2 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D2")); - Set<URI> hasDomainD3 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D3")); - Set<URI> hasRangeD1 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D1")); - Set<URI> hasRangeD2 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D2")); - Set<URI> hasRangeD3 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D3")); - Set<URI> hasDomainR1 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R1")); - Set<URI> hasDomainR2 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R2")); - Set<URI> hasDomainR3 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R3")); - Set<URI> hasRangeR1 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R1")); - Set<URI> hasRangeR2 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R2")); - Set<URI> hasRangeR3 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R3")); - Set<URI> empty = new HashSet<>(); - Set<URI> expectedForward = new HashSet<>(); + final Set<URI> hasDomainD1 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D1")); + final Set<URI> hasDomainD2 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D2")); + final Set<URI> hasDomainD3 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D3")); + final Set<URI> hasRangeD1 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D1")); + final Set<URI> hasRangeD2 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D2")); + final Set<URI> hasRangeD3 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D3")); + final Set<URI> hasDomainR1 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R1")); + final Set<URI> hasDomainR2 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R2")); + final Set<URI> hasDomainR3 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R3")); + final Set<URI> hasRangeR1 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R1")); + final Set<URI> hasRangeR2 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R2")); + final Set<URI> hasRangeR3 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R3")); + final Set<URI> empty = new HashSet<>(); + final Set<URI> expectedForward = new HashSet<>(); expectedForward.add(vf.createURI("urn:p2")); expectedForward.add(vf.createURI("urn:p1")); expectedForward.add(vf.createURI("urn:q2")); expectedForward.add(vf.createURI("urn:q1")); - Set<URI> expectedInverse = new HashSet<>(); + final Set<URI> expectedInverse = new HashSet<>(); expectedInverse.add(vf.createURI("urn:i1")); expectedInverse.add(vf.createURI("urn:i2")); expectedInverse.add(vf.createURI("urn:j1")); @@ -226,7 +228,7 @@ public class InferenceEngineTest extends TestCase { @Test public void testAllValuesFrom() throws Exception { - String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + final String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + " <urn:Dog> owl:onProperty <urn:relative> ; owl:allValuesFrom <urn:Dog> .\n" + " <urn:Retriever> rdfs:subClassOf <urn:Dog> .\n" + " <urn:Terrier> rdfs:subClassOf <urn:Dog> .\n" @@ -257,7 +259,7 @@ public class InferenceEngineTest extends TestCase { @Test public void testHasValueGivenProperty() throws Exception { - String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + final String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + " <urn:Biped> owl:onProperty <urn:walksUsingLegs> . \n" + " <urn:Biped> owl:hasValue \"2\" . \n" + " <urn:Mammal> owl:onProperty <urn:taxon> . \n" @@ -288,7 +290,7 @@ public class InferenceEngineTest extends TestCase { @Test public void testHasValueGivenType() throws Exception { - String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + final String insert = "INSERT DATA { GRAPH <http://updated/test> {\n" + " <urn:Biped> owl:onProperty <urn:walksUsingLegs> . \n" + " <urn:Biped> owl:hasValue \"2\" . \n" + " <urn:Mammal> owl:onProperty <urn:taxon> . \n" @@ -352,11 +354,10 @@ public class InferenceEngineTest extends TestCase { + "}}"; conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute(); inferenceEngine.refreshGraph(); - Graph subClassGraph = inferenceEngine.getSubClassOfGraph(); - Set<URI> subClassesA = inferenceEngine.findParents(subClassGraph, vf.createURI("urn:A")); - Set<URI> subClassesB = inferenceEngine.findParents(subClassGraph, vf.createURI("urn:B")); - Set<URI> expectedA = new HashSet<>(); - Set<URI> expectedB = new HashSet<>(); + final Set<URI> subClassesA = inferenceEngine.getSubClasses(vf.createURI("urn:A")); + final Set<URI> subClassesB = inferenceEngine.getSubClasses(vf.createURI("urn:B")); + final Set<URI> expectedA = new HashSet<>(); + final Set<URI> expectedB = new HashSet<>(); expectedB.add(vf.createURI("urn:Y")); expectedB.add(vf.createURI("urn:SubY")); expectedB.add(vf.createURI("urn:Z")); @@ -365,4 +366,76 @@ public class InferenceEngineTest extends TestCase { Assert.assertEquals(expectedA, subClassesA); Assert.assertEquals(expectedB, subClassesB); } + + public void testIntersectionOf() throws Exception { + final String ontology = "INSERT DATA { GRAPH <http://updated/test> {\n" + + " <urn:Mother> owl:intersectionOf _:bnode1 . \n" + + " _:bnode1 rdf:first <urn:Woman> . \n" + + " _:bnode1 rdf:rest _:bnode2 . \n" + + " _:bnode2 rdf:first <urn:Parent> . \n" + + " _:bnode2 rdf:rest rdf:nil . \n" + + " <urn:Father> owl:intersectionOf _:bnode3 . \n" + + " _:bnode3 rdf:first <urn:Man> . \n" + + " _:bnode3 rdf:rest _:bnode4 . \n" + + " _:bnode4 rdf:first <urn:Parent> . \n" + + " _:bnode4 rdf:rest rdf:nil . \n" + + " <urn:Mom> owl:intersectionOf _:bnode5 . \n" + + " _:bnode5 rdf:first <urn:Woman> . \n" + + " _:bnode5 rdf:rest _:bnode6 . \n" + + " _:bnode6 rdf:first <urn:Parent> . \n" + + " _:bnode6 rdf:rest rdf:nil . \n" + + " <urn:Mother> rdfs:subClassOf <urn:ImmediateFamilyMember> . \n" + + " <urn:ImmediateFamilyMember> rdfs:subClassOf <urn:Relative> . \n" + + "}}"; + + conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute(); + inferenceEngine.refreshGraph(); + + final URI mother = vf.createURI("urn:Mother"); + final URI father = vf.createURI("urn:Father"); + final URI woman = vf.createURI("urn:Woman"); + final URI parent = vf.createURI("urn:Parent"); + final URI man = vf.createURI("urn:Man"); + final URI mom = vf.createURI("urn:Mom"); + final URI immediateFamilyMember = vf.createURI("urn:ImmediateFamilyMember"); + final URI relative = vf.createURI("urn:Relative"); + + final List<Set<Resource>> intersectionsImplyingMother = Arrays.asList(Sets.newHashSet(woman, parent)); + Assert.assertEquals(intersectionsImplyingMother, inferenceEngine.getIntersectionsImplying(mother)); + final List<Set<Resource>> intersectionsImplyingFather = Arrays.asList(Sets.newHashSet(man, parent)); + Assert.assertEquals(intersectionsImplyingFather, inferenceEngine.getIntersectionsImplying(father)); + + // Check that Mother is a subclassOf Parent and Woman and + // ImmediateFamilyMember and Relative. Also, Mother is a subclassOf + // Mother and Mom through inferring equivalentClass. + final Set<URI> motherSuperClassUris = inferenceEngine.getSuperClasses(mother); + Assert.assertNotNull(motherSuperClassUris); + Assert.assertEquals(6, motherSuperClassUris.size()); + Assert.assertTrue(motherSuperClassUris.contains(parent)); + Assert.assertTrue(motherSuperClassUris.contains(woman)); + Assert.assertTrue(motherSuperClassUris.contains(immediateFamilyMember)); + Assert.assertTrue(motherSuperClassUris.contains(relative)); + Assert.assertTrue(motherSuperClassUris.contains(mother)); + Assert.assertTrue(motherSuperClassUris.contains(mom)); + // Check that Father is a subclassOf Parent and Man + final Set<URI> fatherSuperClassUris = inferenceEngine.getSuperClasses(father); + Assert.assertNotNull(fatherSuperClassUris); + Assert.assertEquals(2, fatherSuperClassUris.size()); + Assert.assertTrue(fatherSuperClassUris.contains(parent)); + Assert.assertTrue(fatherSuperClassUris.contains(man)); + + // Check that Mom is a subclassOf Parent and Woman and + // ImmediateFamilyMember and Relative. The last 2 should be inferred + // from having the same intersection as Mother. Also, Mom is a + // subclassOf Mother and Mom through inferring equivalentClass. + final Set<URI> momSuperClassUris = inferenceEngine.getSuperClasses(mom); + Assert.assertNotNull(momSuperClassUris); + Assert.assertEquals(6, momSuperClassUris.size()); + Assert.assertTrue(momSuperClassUris.contains(parent)); + Assert.assertTrue(momSuperClassUris.contains(woman)); + Assert.assertTrue(momSuperClassUris.contains(immediateFamilyMember)); + Assert.assertTrue(momSuperClassUris.contains(relative)); + Assert.assertTrue(momSuperClassUris.contains(mother)); + Assert.assertTrue(momSuperClassUris.contains(mom)); + } } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/e9488ff6/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java ---------------------------------------------------------------------- diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java index 7d6f7d1..dcda8a9 100644 --- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java +++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java @@ -50,7 +50,7 @@ import junit.framework.TestCase; public class InferenceIT extends TestCase { private Connector connector; private AccumuloRyaDAO dao; - private ValueFactory vf = new ValueFactoryImpl(); + private final ValueFactory vf = new ValueFactoryImpl(); private AccumuloRdfConfiguration conf; private RdfCloudTripleStore store; private InferenceEngine inferenceEngine; @@ -84,20 +84,23 @@ public class InferenceIT extends TestCase { @Override public void endQueryResult() throws TupleQueryResultHandlerException { } @Override - public void handleBoolean(boolean arg0) throws QueryResultHandlerException { } + public void handleBoolean(final boolean value) throws QueryResultHandlerException { } @Override - public void handleLinks(List<String> arg0) throws QueryResultHandlerException { } + public void handleLinks(final List<String> linkUrls) throws QueryResultHandlerException { } @Override - public void handleSolution(BindingSet arg0) throws TupleQueryResultHandlerException { - solutions.add(arg0); + public void handleSolution(final BindingSet bindingSet) throws TupleQueryResultHandlerException { + if (bindingSet != null && bindingSet.iterator().hasNext()) { + solutions.add(bindingSet); + } } @Override - public void startQueryResult(List<String> arg0) throws TupleQueryResultHandlerException { + public void startQueryResult(final List<String> bindingNames) throws TupleQueryResultHandlerException { solutions.clear(); } }; } + @Override @After public void tearDown() throws Exception { conn.close(); @@ -131,12 +134,12 @@ public class InferenceIT extends TestCase { inferenceEngine.refreshGraph(); conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute(); conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler); - Set<Value> expected = new HashSet<>(); + final Set<Value> expected = new HashSet<>(); expected.add(vf.createURI("urn:Alice")); expected.add(vf.createURI("urn:Bob")); expected.add(vf.createURI("urn:Eve")); - Set<Value> returned = new HashSet<>(); - for (BindingSet bs : solutions) { + final Set<Value> returned = new HashSet<>(); + for (final BindingSet bs : solutions) { returned.add(bs.getBinding("x").getValue()); } Assert.assertEquals(expected, returned); @@ -174,13 +177,13 @@ public class InferenceIT extends TestCase { inferenceEngine.refreshGraph(); conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute(); conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler); - Set<Value> expected = new HashSet<>(); + final Set<Value> expected = new HashSet<>(); expected.add(vf.createURI("urn:Professor1")); expected.add(vf.createURI("urn:Professor2")); expected.add(vf.createURI("urn:Professor3")); expected.add(vf.createURI("urn:Professor4")); - Set<Value> returned = new HashSet<>(); - for (BindingSet bs : solutions) { + final Set<Value> returned = new HashSet<>(); + for (final BindingSet bs : solutions) { returned.add(bs.getBinding("x").getValue()); } Assert.assertEquals(expected, returned); @@ -249,14 +252,14 @@ public class InferenceIT extends TestCase { inferenceEngine.refreshGraph(); conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute(); conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler); - Set<Value> expected = new HashSet<>(); + final Set<Value> expected = new HashSet<>(); expected.add(vf.createURI("urn:Alice")); expected.add(vf.createURI("urn:Bob")); expected.add(vf.createURI("urn:Carol")); expected.add(vf.createURI("urn:Dan")); expected.add(vf.createURI("urn:Lucy")); - Set<Value> returned = new HashSet<>(); - for (BindingSet bs : solutions) { + final Set<Value> returned = new HashSet<>(); + for (final BindingSet bs : solutions) { returned.add(bs.getBinding("x").getValue()); } Assert.assertEquals(expected, returned); @@ -286,8 +289,8 @@ public class InferenceIT extends TestCase { conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute(); inferenceEngine.refreshGraph(); conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler); - Set<BindingSet> expected = new HashSet<BindingSet>(); - List<String> varNames = new LinkedList<>(); + final Set<BindingSet> expected = new HashSet<BindingSet>(); + final List<String> varNames = new LinkedList<>(); varNames.add("individual"); varNames.add("taxon"); expected.add(new ListBindingSet(varNames, vf.createURI("urn:Alice"), vf.createURI("urn:Hominidae"))); @@ -324,15 +327,77 @@ public class InferenceIT extends TestCase { inferenceEngine.refreshGraph(); conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute(); conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler); - Set<Value> expected = new HashSet<>(); + final Set<Value> expected = new HashSet<>(); expected.add(vf.createURI("urn:Bob")); expected.add(vf.createURI("urn:Carol")); expected.add(vf.createURI("urn:Eve")); - Set<Value> returned = new HashSet<>(); - for (BindingSet bs : solutions) { + final Set<Value> returned = new HashSet<>(); + for (final BindingSet bs : solutions) { returned.add(bs.getBinding("x").getValue()); } Assert.assertEquals(expected, returned); Assert.assertEquals(expected.size(), solutions.size()); } + + public void testIntersectionOfQuery() throws Exception { + final String ontology = "INSERT DATA { GRAPH <http://updated/test> {\n" + + " <urn:Mother> owl:intersectionOf _:bnode1 . \n" + + " _:bnode1 rdf:first <urn:Woman> . \n" + + " _:bnode1 rdf:rest _:bnode2 . \n" + + " _:bnode2 rdf:first <urn:Parent> . \n" + + " _:bnode2 rdf:rest rdf:nil . \n" + + " <urn:Father> owl:intersectionOf _:bnode3 . \n" + + " _:bnode3 rdf:first <urn:Man> . \n" + + " _:bnode3 rdf:rest _:bnode4 . \n" + + " _:bnode4 rdf:first <urn:Parent> . \n" + + " _:bnode4 rdf:rest rdf:nil . \n" + + "}}"; + final String instances = "INSERT DATA { GRAPH <http://updated/test> {\n" + + " <urn:Susan> a <urn:Mother> . \n" + + " <urn:Bob> a <urn:Man> . \n" + + " <urn:Bob> a <urn:Parent> . \n" + + "}}"; + conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute(); + conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute(); + inferenceEngine.refreshGraph(); + + final List<String> varNames = new LinkedList<>(); + varNames.add("individual"); + + // Find all <urn:Mother> types (expect 1 result) + final String motherQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Mother> } } \n"; + conn.prepareTupleQuery(QueryLanguage.SPARQL, motherQuery).evaluate(resultHandler); + final Set<BindingSet> expectedMothers = new HashSet<>(); + expectedMothers.add(new ListBindingSet(varNames, vf.createURI("urn:Susan"))); + Assert.assertEquals(expectedMothers, new HashSet<>(solutions)); + + // Find all <urn:Father> types (expect 1 result) + final String fatherQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Father> } } \n"; + conn.prepareTupleQuery(QueryLanguage.SPARQL, fatherQuery).evaluate(resultHandler); + final Set<BindingSet> expectedFathers = new HashSet<>(); + expectedFathers.add(new ListBindingSet(varNames, vf.createURI("urn:Bob"))); + Assert.assertEquals(expectedFathers, new HashSet<>(solutions)); + + // Find all <urn:Parent> types (expect 2 results) + final String parentQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Parent> } } \n"; + conn.prepareTupleQuery(QueryLanguage.SPARQL, parentQuery).evaluate(resultHandler); + final Set<BindingSet> expectedParents = new HashSet<>(); + expectedParents.add(new ListBindingSet(varNames, vf.createURI("urn:Bob"))); + expectedParents.add(new ListBindingSet(varNames, vf.createURI("urn:Susan"))); + Assert.assertEquals(expectedParents, new HashSet<>(solutions)); + + // Find all <urn:Woman> types (expect 1 result) + final String womanQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Woman> } } \n"; + conn.prepareTupleQuery(QueryLanguage.SPARQL, womanQuery).evaluate(resultHandler); + final Set<BindingSet> expectedWomen = new HashSet<>(); + expectedWomen.add(new ListBindingSet(varNames, vf.createURI("urn:Susan"))); + Assert.assertEquals(expectedWomen, new HashSet<>(solutions)); + + // Find all <urn:Man> types (expect 1 result) + final String manQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Man> } } \n"; + conn.prepareTupleQuery(QueryLanguage.SPARQL, manQuery).evaluate(resultHandler); + final Set<BindingSet> expectedMen = new HashSet<>(); + expectedMen.add(new ListBindingSet(varNames, vf.createURI("urn:Bob"))); + Assert.assertEquals(expectedMen, new HashSet<>(solutions)); + } } http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/e9488ff6/sail/src/test/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitorTest.java ---------------------------------------------------------------------- diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitorTest.java new file mode 100644 index 0000000..58551a5 --- /dev/null +++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitorTest.java @@ -0,0 +1,235 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.rya.rdftriplestore.inference; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.rya.accumulo.AccumuloRdfConfiguration; +import org.junit.Test; +import org.openrdf.model.Resource; +import org.openrdf.model.URI; +import org.openrdf.model.ValueFactory; +import org.openrdf.model.impl.ValueFactoryImpl; +import org.openrdf.model.vocabulary.RDF; +import org.openrdf.query.algebra.Join; +import org.openrdf.query.algebra.Projection; +import org.openrdf.query.algebra.ProjectionElem; +import org.openrdf.query.algebra.ProjectionElemList; +import org.openrdf.query.algebra.StatementPattern; +import org.openrdf.query.algebra.Union; +import org.openrdf.query.algebra.Var; + +import com.google.common.collect.Sets; + +/** + * Tests the methods of {@link IntersectionOfVisitor}. + */ +public class IntersectionOfVisitorTest { + private final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration(); + private static final ValueFactory VF = new ValueFactoryImpl(); + + private static final URI MOTHER = VF.createURI("urn:Mother"); + private static final URI FATHER = VF.createURI("urn:Father"); + + // Definition #1: :Mother owl:intersectionOf(:Animal, :Female, :Parent) + private static final URI ANIMAL = VF.createURI("urn:Animal"); + private static final URI FEMALE = VF.createURI("urn:Female"); + private static final URI PARENT = VF.createURI("urn:Parent"); + + // Definition #2: :Mother owl:intersectionOf(:Female, :Leader, :Nun) + private static final URI NUN = VF.createURI("urn:Nun"); + private static final URI LEADER = VF.createURI("urn:Leader"); + + // Definition #3: :Father owl:intersectionOf(:Man, :Parent) + private static final URI MAN = VF.createURI("urn:Man"); + + @Test + public void testIntersectionOf() throws Exception { + // Configure a mock instance engine with an ontology: + final InferenceEngine inferenceEngine = mock(InferenceEngine.class); + final Map<Resource, List<Set<Resource>>> intersections = new HashMap<>(); + final List<Set<Resource>> motherIntersections = Arrays.asList( + Sets.newHashSet(ANIMAL, FEMALE, PARENT), + Sets.newHashSet(FEMALE, LEADER, NUN) + ); + final List<Set<Resource>> fatherIntersections = Arrays.asList( + Sets.newHashSet(MAN, PARENT) + ); + intersections.put(MOTHER, motherIntersections); + when(inferenceEngine.getIntersectionsImplying(MOTHER)).thenReturn(motherIntersections); + when(inferenceEngine.getIntersectionsImplying(FATHER)).thenReturn(fatherIntersections); + // Query for a specific type and rewrite using the visitor: + final Projection query = new Projection( + new StatementPattern(new Var("s"), new Var("p", RDF.TYPE), new Var("o", MOTHER)), + new ProjectionElemList(new ProjectionElem("s", "subject"))); + query.visit(new IntersectionOfVisitor(conf, inferenceEngine)); + // Expected structure: a union whose members are the original + // statement pattern and a nested union of statement patterns and joins. + // This will join both intersections of Mother together. The nested + // union tree is unioned with the original statement pattern. + // The nested union of Mother should be: + // Union( + // Join( + // SP(Animal), + // Join( + // SP(Female), + // SP(Parent) + // ) + // ), + // Join( + // SP(Female), + // Join( + // SP(Leader), + // SP(Nun) + // ) + // ) + // ) + // + // Collect the arguments to the union: + assertTrue(query.getArg() instanceof Union); + final Union union1 = (Union) query.getArg(); + assertTrue(union1.getLeftArg() instanceof Union); + final Union union2 = (Union) union1.getLeftArg(); + + assertTrue(union2.getLeftArg() instanceof Join); + final Join join1 = (Join) union2.getLeftArg(); + assertTrue(join1.getLeftArg() instanceof StatementPattern); + final StatementPattern animalSp = (StatementPattern) join1.getLeftArg(); + assertStatementPattern(animalSp, ANIMAL); + assertTrue(join1.getRightArg() instanceof Join); + final Join join2 = (Join) join1.getRightArg(); + assertTrue(join2.getLeftArg() instanceof StatementPattern); + final StatementPattern femaleSp = (StatementPattern) join2.getLeftArg(); + assertStatementPattern(femaleSp, FEMALE); + assertTrue(join2.getRightArg() instanceof StatementPattern); + final StatementPattern parentSp = (StatementPattern) join2.getRightArg(); + assertStatementPattern(parentSp, PARENT); + + assertTrue(union2.getRightArg() instanceof Join); + final Join join3 = (Join) union2.getRightArg(); + assertTrue(join3.getLeftArg() instanceof StatementPattern); + final StatementPattern femaleSp2 = (StatementPattern) join3.getLeftArg(); + assertStatementPattern(femaleSp2, FEMALE); + assertTrue(join3.getRightArg() instanceof Join); + final Join join4 = (Join) join3.getRightArg(); + assertTrue(join4.getLeftArg() instanceof StatementPattern); + final StatementPattern leaderSp = (StatementPattern) join4.getLeftArg(); + assertStatementPattern(leaderSp, LEADER); + assertTrue(join4.getRightArg() instanceof StatementPattern); + final StatementPattern nunSp = (StatementPattern) join4.getRightArg(); + assertStatementPattern(nunSp, NUN); + + assertTrue(union1.getRightArg() instanceof StatementPattern); + final StatementPattern actualMotherSp = (StatementPattern) union1.getRightArg(); + final StatementPattern expectedMotherSp = new StatementPattern(new Var("s"), new Var("p", RDF.TYPE), new Var("o", MOTHER)); + assertEquals(expectedMotherSp, actualMotherSp); + + + // Query for a specific type and rewrite using the visitor: + final Projection query2 = new Projection( + new StatementPattern(new Var("s"), new Var("p", RDF.TYPE), new Var("o", FATHER)), + new ProjectionElemList(new ProjectionElem("s", "subject"))); + query2.visit(new IntersectionOfVisitor(conf, inferenceEngine)); + // Since Father produces only one intersection it creates a nested join + // that gets union with the original statement pattern. + // The nested join of Father should be: + // Join( + // SP(Man), + // SP(Parent) + // ) + // Collect the arguments to the union: + assertTrue(query2.getArg() instanceof Union); + final Union union3 = (Union) query2.getArg(); + assertTrue(union3.getLeftArg() instanceof Join); + final Join join5 = (Join) union3.getLeftArg(); + assertTrue(join5.getLeftArg() instanceof StatementPattern); + final StatementPattern manSp = (StatementPattern) join5.getLeftArg(); + assertStatementPattern(manSp, MAN); + assertTrue(join5.getRightArg() instanceof StatementPattern); + final StatementPattern parentSp2 = (StatementPattern) join5.getRightArg(); + assertStatementPattern(parentSp2, PARENT); + + assertTrue(union3.getRightArg() instanceof StatementPattern); + final StatementPattern actualFatherSp = (StatementPattern) union3.getRightArg(); + final StatementPattern expectedFatherSp = new StatementPattern(new Var("s"), new Var("p", RDF.TYPE), new Var("o", FATHER)); + assertEquals(expectedFatherSp, actualFatherSp); + } + + @Test + public void testIntersectionOfDisabled() throws Exception { + // Configure a mock instance engine with an ontology: + final InferenceEngine inferenceEngine = mock(InferenceEngine.class); + final Map<Resource, List<Set<Resource>>> intersections = new HashMap<>(); + final List<Set<Resource>> motherIntersections = Arrays.asList( + Sets.newHashSet(ANIMAL, FEMALE, PARENT), + Sets.newHashSet(FEMALE, LEADER, NUN) + ); + final List<Set<Resource>> fatherIntersections = Arrays.asList( + Sets.newHashSet(MAN, PARENT) + ); + intersections.put(MOTHER, motherIntersections); + when(inferenceEngine.getIntersectionsImplying(MOTHER)).thenReturn(motherIntersections); + when(inferenceEngine.getIntersectionsImplying(FATHER)).thenReturn(fatherIntersections); + // Query for a specific type and rewrite using the visitor: + final Projection query = new Projection( + new StatementPattern(new Var("s"), new Var("p", RDF.TYPE), new Var("o", MOTHER)), + new ProjectionElemList(new ProjectionElem("s", "subject"))); + + final AccumuloRdfConfiguration disabledConf = conf.clone(); + disabledConf.setInferIntersectionOf(false); + + query.visit(new IntersectionOfVisitor(disabledConf, inferenceEngine)); + + // Expected structure: the original statement: + assertTrue(query.getArg() instanceof StatementPattern); + final StatementPattern actualMotherSp = (StatementPattern) query.getArg(); + final StatementPattern expectedMotherSp = new StatementPattern(new Var("s"), new Var("p", RDF.TYPE), new Var("o", MOTHER)); + assertEquals(expectedMotherSp, actualMotherSp); + + + // Query for a specific type and rewrite using the visitor: + final Projection query2 = new Projection( + new StatementPattern(new Var("s"), new Var("p", RDF.TYPE), new Var("o", FATHER)), + new ProjectionElemList(new ProjectionElem("s", "subject"))); + query2.visit(new IntersectionOfVisitor(disabledConf, inferenceEngine)); + + // Expected structure: the original statement: + assertTrue(query2.getArg() instanceof StatementPattern); + final StatementPattern actualFatherSp = (StatementPattern) query2.getArg(); + final StatementPattern expectedFatherSp = new StatementPattern(new Var("s"), new Var("p", RDF.TYPE), new Var("o", FATHER)); + assertEquals(expectedFatherSp, actualFatherSp); + } + + private static void assertStatementPattern(final StatementPattern statementPattern, final URI uri) { + assertNotNull(statementPattern.getPredicateVar()); + assertEquals(RDF.TYPE, statementPattern.getPredicateVar().getValue()); + assertNotNull(statementPattern.getObjectVar()); + assertEquals(uri, statementPattern.getObjectVar().getValue()); + } +} \ No newline at end of file