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)));
}
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);
}
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());
}
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());
}
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());
}
Aggregations