Search in sources :

Example 16 with QueryRoot

use of org.eclipse.rdf4j.query.algebra.QueryRoot in project incubator-rya by apache.

the class PipelineQueryIT method testTriplePipeline.

@Test
public void testTriplePipeline() throws Exception {
    final IRI alice = VF.createIRI("urn:Alice");
    final IRI bob = VF.createIRI("urn:Bob");
    final IRI eve = VF.createIRI("urn:Eve");
    final IRI friend = VF.createIRI("urn:friend");
    final IRI knows = VF.createIRI("urn:knows");
    final IRI year = VF.createIRI("urn:year");
    final Literal yearLiteral = VF.createLiteral("2017", XMLSchema.GYEAR);
    final String query = "CONSTRUCT {\n" + "    ?x <urn:knows> ?y .\n" + "    ?x <urn:year> \"2017\"^^<" + XMLSchema.GYEAR + "> .\n" + "} WHERE { ?x <urn:friend> ?y }";
    insert(alice, friend, bob);
    insert(bob, knows, eve);
    insert(eve, knows, alice);
    // Prepare query and convert to pipeline
    final QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
    final SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
    queryTree.visit(visitor);
    // Get pipeline, add triple conversion, and verify that the result is a
    // properly serialized statement
    Assert.assertTrue(queryTree.getArg() instanceof AggregationPipelineQueryNode);
    final AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
    final List<Bson> triplePipeline = pipelineNode.getTriplePipeline(System.currentTimeMillis(), false);
    final SimpleMongoDBStorageStrategy strategy = new SimpleMongoDBStorageStrategy();
    final List<Statement> results = new LinkedList<>();
    for (final Document doc : getRyaCollection().aggregate(triplePipeline)) {
        final RyaStatement rstmt = strategy.deserializeDocument(doc);
        final Statement stmt = RyaToRdfConversions.convertStatement(rstmt);
        results.add(stmt);
    }
    Assert.assertEquals(2, results.size());
    Assert.assertTrue(results.contains(VF.createStatement(alice, knows, bob)));
    Assert.assertTrue(results.contains(VF.createStatement(alice, year, yearLiteral)));
}
Also used : IRI(org.eclipse.rdf4j.model.IRI) RyaStatement(org.apache.rya.api.domain.RyaStatement) Statement(org.eclipse.rdf4j.model.Statement) RyaStatement(org.apache.rya.api.domain.RyaStatement) Document(org.bson.Document) LinkedList(java.util.LinkedList) Bson(org.bson.conversions.Bson) QueryRoot(org.eclipse.rdf4j.query.algebra.QueryRoot) Literal(org.eclipse.rdf4j.model.Literal) SimpleMongoDBStorageStrategy(org.apache.rya.mongodb.dao.SimpleMongoDBStorageStrategy) Test(org.junit.Test)

Example 17 with QueryRoot

use of org.eclipse.rdf4j.query.algebra.QueryRoot in project incubator-rya by apache.

the class PipelineQueryIT method testRequiredDerivationLevel.

@Test
public void testRequiredDerivationLevel() throws Exception {
    // Insert data
    final IRI person = VF.createIRI("urn:Person");
    final IRI livingThing = VF.createIRI("urn:LivingThing");
    final IRI human = VF.createIRI("urn:Human");
    final IRI programmer = VF.createIRI("urn:Programmer");
    final IRI thing = VF.createIRI("urn:Thing");
    insert(programmer, RDFS.SUBCLASSOF, person);
    insert(person, RDFS.SUBCLASSOF, FOAF.PERSON);
    insert(FOAF.PERSON, RDFS.SUBCLASSOF, person);
    insert(person, OWL.EQUIVALENTCLASS, human);
    insert(person, RDFS.SUBCLASSOF, livingThing);
    insert(livingThing, RDFS.SUBCLASSOF, thing);
    insert(thing, RDFS.SUBCLASSOF, OWL.THING, 1);
    insert(OWL.THING, RDFS.SUBCLASSOF, thing);
    dao.flush();
    // Define query and expected results
    final String query = "SELECT ?A ?B WHERE {\n" + "  ?A rdfs:subClassOf ?B .\n" + "  ?B rdfs:subClassOf ?A .\n" + "}";
    final List<String> varNames = Arrays.asList("A", "B");
    Multiset<BindingSet> expectedSolutions = HashMultiset.create();
    expectedSolutions.add(new ListBindingSet(varNames, person, FOAF.PERSON));
    expectedSolutions.add(new ListBindingSet(varNames, FOAF.PERSON, person));
    expectedSolutions.add(new ListBindingSet(varNames, thing, OWL.THING));
    expectedSolutions.add(new ListBindingSet(varNames, OWL.THING, thing));
    // Prepare query and convert to pipeline
    final QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
    final SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
    queryTree.visit(visitor);
    Assert.assertTrue(queryTree.getArg() instanceof AggregationPipelineQueryNode);
    final AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
    // Extend the pipeline by requiring a derivation level of zero (should have no effect)
    pipelineNode.requireSourceDerivationDepth(0);
    Multiset<BindingSet> solutions = HashMultiset.create();
    CloseableIteration<BindingSet, QueryEvaluationException> iter = pipelineNode.evaluate(new QueryBindingSet());
    while (iter.hasNext()) {
        solutions.add(iter.next());
    }
    Assert.assertEquals(expectedSolutions, solutions);
    // Extend the pipeline by requiring a derivation level of one (should produce the thing/thing pair)
    expectedSolutions = HashMultiset.create();
    expectedSolutions.add(new ListBindingSet(varNames, thing, OWL.THING));
    expectedSolutions.add(new ListBindingSet(varNames, OWL.THING, thing));
    pipelineNode.requireSourceDerivationDepth(1);
    solutions = HashMultiset.create();
    iter = pipelineNode.evaluate(new QueryBindingSet());
    while (iter.hasNext()) {
        solutions.add(iter.next());
    }
    Assert.assertEquals(expectedSolutions, solutions);
}
Also used : IRI(org.eclipse.rdf4j.model.IRI) ListBindingSet(org.eclipse.rdf4j.query.impl.ListBindingSet) QueryBindingSet(org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet) EmptyBindingSet(org.eclipse.rdf4j.query.impl.EmptyBindingSet) BindingSet(org.eclipse.rdf4j.query.BindingSet) ListBindingSet(org.eclipse.rdf4j.query.impl.ListBindingSet) QueryRoot(org.eclipse.rdf4j.query.algebra.QueryRoot) QueryEvaluationException(org.eclipse.rdf4j.query.QueryEvaluationException) QueryBindingSet(org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet) Test(org.junit.Test)

Example 18 with QueryRoot

use of org.eclipse.rdf4j.query.algebra.QueryRoot in project incubator-rya by apache.

the class PipelineQueryIT method testRequiredTimestamp.

@Test
public void testRequiredTimestamp() throws Exception {
    // Insert data
    final IRI person = VF.createIRI("urn:Person");
    final IRI livingThing = VF.createIRI("urn:LivingThing");
    final IRI human = VF.createIRI("urn:Human");
    final IRI programmer = VF.createIRI("urn:Programmer");
    final IRI thing = VF.createIRI("urn:Thing");
    insert(programmer, RDFS.SUBCLASSOF, person);
    insert(person, RDFS.SUBCLASSOF, FOAF.PERSON, 2);
    insert(FOAF.PERSON, RDFS.SUBCLASSOF, person);
    insert(person, OWL.EQUIVALENTCLASS, human);
    insert(person, RDFS.SUBCLASSOF, livingThing);
    insert(livingThing, RDFS.SUBCLASSOF, thing);
    insert(thing, RDFS.SUBCLASSOF, OWL.THING);
    insert(OWL.THING, RDFS.SUBCLASSOF, thing);
    dao.flush();
    // Define query and expected results
    final String query = "SELECT ?A ?B WHERE {\n" + "  ?A rdfs:subClassOf ?B .\n" + "  ?B rdfs:subClassOf ?A .\n" + "}";
    final List<String> varNames = Arrays.asList("A", "B");
    final Multiset<BindingSet> expectedSolutions = HashMultiset.create();
    expectedSolutions.add(new ListBindingSet(varNames, person, FOAF.PERSON));
    expectedSolutions.add(new ListBindingSet(varNames, FOAF.PERSON, person));
    expectedSolutions.add(new ListBindingSet(varNames, thing, OWL.THING));
    expectedSolutions.add(new ListBindingSet(varNames, OWL.THING, thing));
    // Prepare query and convert to pipeline
    final QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
    final SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
    queryTree.visit(visitor);
    Assert.assertTrue(queryTree.getArg() instanceof AggregationPipelineQueryNode);
    final AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
    // Extend the pipeline by requiring a timestamp of zero (should have no effect)
    pipelineNode.requireSourceTimestamp(0);
    final Multiset<BindingSet> solutions = HashMultiset.create();
    CloseableIteration<BindingSet, QueryEvaluationException> iter = pipelineNode.evaluate(new QueryBindingSet());
    while (iter.hasNext()) {
        solutions.add(iter.next());
    }
    Assert.assertEquals(expectedSolutions, solutions);
    // Extend the pipeline by requiring a future timestamp (should produce no results)
    final long delta = 1000 * 60 * 60 * 24;
    pipelineNode.requireSourceTimestamp(System.currentTimeMillis() + delta);
    iter = pipelineNode.evaluate(new QueryBindingSet());
    Assert.assertFalse(iter.hasNext());
}
Also used : IRI(org.eclipse.rdf4j.model.IRI) ListBindingSet(org.eclipse.rdf4j.query.impl.ListBindingSet) QueryBindingSet(org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet) EmptyBindingSet(org.eclipse.rdf4j.query.impl.EmptyBindingSet) BindingSet(org.eclipse.rdf4j.query.BindingSet) ListBindingSet(org.eclipse.rdf4j.query.impl.ListBindingSet) QueryBindingSet(org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet) QueryRoot(org.eclipse.rdf4j.query.algebra.QueryRoot) QueryEvaluationException(org.eclipse.rdf4j.query.QueryEvaluationException) Test(org.junit.Test)

Example 19 with QueryRoot

use of org.eclipse.rdf4j.query.algebra.QueryRoot in project incubator-rya by apache.

the class SparqlToPipelineTransformVisitorTest method testEmptyProjection.

@Test
public void testEmptyProjection() throws Exception {
    StatementPattern isClass = new StatementPattern(constant(UNDERGRAD), constant(RDF.TYPE), constant(OWL.CLASS));
    QueryRoot queryTree = new QueryRoot(new Projection(isClass, new ProjectionElemList()));
    SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(collection);
    queryTree.visit(visitor);
    Assert.assertTrue(queryTree.getArg() instanceof Projection);
    Projection projectNode = (Projection) queryTree.getArg();
    Assert.assertTrue(projectNode.getArg() instanceof AggregationPipelineQueryNode);
    AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) projectNode.getArg();
    Assert.assertEquals(Sets.newHashSet(), pipelineNode.getAssuredBindingNames());
}
Also used : ProjectionElemList(org.eclipse.rdf4j.query.algebra.ProjectionElemList) StatementPattern(org.eclipse.rdf4j.query.algebra.StatementPattern) QueryRoot(org.eclipse.rdf4j.query.algebra.QueryRoot) MultiProjection(org.eclipse.rdf4j.query.algebra.MultiProjection) Projection(org.eclipse.rdf4j.query.algebra.Projection) Test(org.junit.Test)

Example 20 with QueryRoot

use of org.eclipse.rdf4j.query.algebra.QueryRoot in project incubator-rya by apache.

the class SparqlToPipelineTransformVisitorTest method testMultiProjection.

@Test
public void testMultiProjection() throws Exception {
    StatementPattern isUndergrad = new StatementPattern(new Var("x"), constant(RDF.TYPE), constant(UNDERGRAD));
    StatementPattern isCourse = new StatementPattern(new Var("course"), constant(RDF.TYPE), constant(COURSE));
    StatementPattern hasEdge = new StatementPattern(new Var("x"), new Var("p"), new Var("course"));
    ProjectionElemList courseHasRelation = new ProjectionElemList(new ProjectionElem("p", "relation"), new ProjectionElem("course"));
    ProjectionElemList studentHasRelation = new ProjectionElemList(new ProjectionElem("p", "relation"), new ProjectionElem("x", "student"));
    QueryRoot queryTree = new QueryRoot(new MultiProjection(new Join(new Join(isCourse, hasEdge), isUndergrad), Arrays.asList(courseHasRelation, studentHasRelation)));
    SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(collection);
    queryTree.visit(visitor);
    Assert.assertTrue(queryTree.getArg() instanceof AggregationPipelineQueryNode);
    AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
    Assert.assertEquals(Sets.newHashSet("relation"), pipelineNode.getAssuredBindingNames());
    Assert.assertEquals(Sets.newHashSet("relation", "course", "student"), pipelineNode.getBindingNames());
}
Also used : ProjectionElemList(org.eclipse.rdf4j.query.algebra.ProjectionElemList) StatementPattern(org.eclipse.rdf4j.query.algebra.StatementPattern) QueryRoot(org.eclipse.rdf4j.query.algebra.QueryRoot) Var(org.eclipse.rdf4j.query.algebra.Var) Join(org.eclipse.rdf4j.query.algebra.Join) MultiProjection(org.eclipse.rdf4j.query.algebra.MultiProjection) ProjectionElem(org.eclipse.rdf4j.query.algebra.ProjectionElem) Test(org.junit.Test)

Aggregations

QueryRoot (org.eclipse.rdf4j.query.algebra.QueryRoot)27 Test (org.junit.Test)13 ParsedQuery (org.eclipse.rdf4j.query.parser.ParsedQuery)11 QueryParser (org.eclipse.rdf4j.query.parser.QueryParser)11 SPARQLParser (org.eclipse.rdf4j.query.parser.sparql.SPARQLParser)11 StatementPattern (org.eclipse.rdf4j.query.algebra.StatementPattern)9 Var (org.eclipse.rdf4j.query.algebra.Var)8 BindingSet (org.eclipse.rdf4j.query.BindingSet)5 QueryEvaluationException (org.eclipse.rdf4j.query.QueryEvaluationException)5 Join (org.eclipse.rdf4j.query.algebra.Join)5 QueryBindingSet (org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet)5 EmptyBindingSet (org.eclipse.rdf4j.query.impl.EmptyBindingSet)5 TupleExpr (org.eclipse.rdf4j.query.algebra.TupleExpr)4 IRI (org.eclipse.rdf4j.model.IRI)3 Projection (org.eclipse.rdf4j.query.algebra.Projection)3 ListBindingSet (org.eclipse.rdf4j.query.impl.ListBindingSet)3 RyaDAOException (org.apache.rya.api.persist.RyaDAOException)2 QueryJoinOptimizer (org.apache.rya.rdftriplestore.evaluation.QueryJoinOptimizer)2 InverseOfVisitor (org.apache.rya.rdftriplestore.inference.InverseOfVisitor)2 Extension (org.eclipse.rdf4j.query.algebra.Extension)2