blob: e4e3fb65b29492172bc37270bb154da77e4a48c3 [file] [log] [blame]
package org.apache.rya;
/*
* 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.
*/
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.accumulo.core.client.Connector;
import org.apache.accumulo.core.client.Instance;
import org.apache.accumulo.core.client.mock.MockInstance;
import org.apache.rya.accumulo.AccumuloRdfConfiguration;
import org.apache.rya.accumulo.AccumuloRyaDAO;
import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
import org.apache.rya.rdftriplestore.RyaSailRepository;
import org.apache.rya.rdftriplestore.inference.InferenceEngine;
import org.apache.rya.rdftriplestore.namespace.NamespaceManager;
import org.eclipse.rdf4j.query.MalformedQueryException;
import org.eclipse.rdf4j.query.QueryEvaluationException;
import org.eclipse.rdf4j.query.QueryLanguage;
import org.eclipse.rdf4j.query.TupleQuery;
import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
import org.eclipse.rdf4j.repository.Repository;
import org.eclipse.rdf4j.repository.RepositoryConnection;
import org.eclipse.rdf4j.repository.RepositoryException;
import org.eclipse.rdf4j.rio.RDFFormat;
import org.eclipse.rdf4j.rio.RDFParseException;
import junit.framework.TestCase;
/**
* The purpose of this is to provide a test case that illustrates a failure that is being encountered. A working test is
* provided as well to demonstrate that a successful query can be made.
*/
public class ArbitraryLengthQueryTest extends TestCase {
/**
* The repository used for the tests.
*/
private Repository repository;
@Override
public void setUp() throws Exception {
super.setUp();
final RdfCloudTripleStore store = new MockRdfCloudStore();
final NamespaceManager nm = new NamespaceManager(store.getRyaDAO(), store.getConf());
store.setNamespaceManager(nm);
repository = new RyaSailRepository(store);
repository.initialize();
load();
}
@Override
public void tearDown() throws Exception {
super.tearDown();
repository.shutDown();
}
/**
* This test works. The expected result is 6 rows ranging from "Model1Class 1" through "Model1Class 6".
*
* @throws RepositoryException
* @throws QueryEvaluationException
* @throws TupleQueryResultHandlerException
*
* @throws MalformedQueryException
*/
public void testWithoutSubquery() throws RepositoryException, QueryEvaluationException, TupleQueryResultHandlerException, MalformedQueryException {
final String query = "SELECT ?i ?i_label ?i_class ?i_v1"
+ "WHERE {"
+ "?i <http://www.w3.org/2000/01/rdf-schema#label> ?i_label ."
+ "?i a ?i_class ."
+ "?i_class <http://www.w3.org/2000/01/rdf-schema#subClassOf>* <http://dragon-research.com/cham/model/model1#Model1Class> ."
+ "OPTIONAL { ?i <http://dragon-research.com/cham/model/model1#name> ?i_v1 } ."
+ "}"
+ "ORDER BY ?i_label";
final RepositoryConnection conn = repository.getConnection();
final TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, query);
RdfCloudTripleStoreConnectionTest.CountTupleHandler countTupleHandler = new RdfCloudTripleStoreConnectionTest.CountTupleHandler();
tupleQuery.evaluate(countTupleHandler);
assertEquals(6, countTupleHandler.getCount());
conn.close();
}
/**
* This test fails. The expected result is 6 rows ranging from "Model1Class 1 Event" to "Model1Class 6 Event". The
* current result is a RejectedExecutionException.
*
* @throws RepositoryException
* @throws QueryEvaluationException
* @throws TupleQueryResultHandlerException
*
* @throws MalformedQueryException
*/
public void testWithSubquery() throws RepositoryException, QueryEvaluationException, TupleQueryResultHandlerException, MalformedQueryException {
final String query = "SELECT ?i ?i_label ?i_class ?i_v1 ?i_v2 ?i_v2_label ?i_v2_class ?i_v2_v1"
+ "WHERE {"
+ "?i <http://www.w3.org/2000/01/rdf-schema#label> ?i_label ."
+ "?i a ?i_class ."
+ "?i_class <http://www.w3.org/2000/01/rdf-schema#subClassOf>* <http://dragon-research.com/cham/model/model1#Event> ."
+ "OPTIONAL { ?i <http://dragon-research.com/cham/model/model1#name> ?i_v1 } ."
+ "?i <http://dragon-research.com/cham/model/model1#hasTemporalEntity> ?i_v2 ."
+ "{"
+ "SELECT ?i_v2 ?i_v2_label ?i_v2_class ?i_v2_v1"
+ "WHERE {"
+ "?i_v2 <http://www.w3.org/2000/01/rdf-schema#label> ?i_v2_label ."
+ "?i_v2 a ?i_v2_class ."
+ "?i_v2_class <http://www.w3.org/2000/01/rdf-schema#subClassOf>* <http://dragon-research.com/cham/model/model1#TemporalInstant> ."
+ "OPTIONAL { ?i_v2 <http://dragon-research.com/cham/model/model1#dateTime> ?i_v2_v1 } ."
+ "}"
+ "ORDER BY ?i_v2_label"
+ "}"
+ "}"
+ "ORDER BY ?i_label";
final RepositoryConnection conn = repository.getConnection();
final TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, query);
RdfCloudTripleStoreConnectionTest.CountTupleHandler countTupleHandler = new RdfCloudTripleStoreConnectionTest.CountTupleHandler();
tupleQuery.evaluate(countTupleHandler);
assertEquals(6, countTupleHandler.getCount());
conn.close();
}
/**
* Load the t-box and a-box turtle from strings defined within this class.
*
* @throws RepositoryException
* @throws RDFParseException
* @throws IOException
*/
private void load() throws RepositoryException, RDFParseException, IOException {
final RepositoryConnection conn = repository.getConnection();
// T-Box
String ttlString = MODEL_TTL;
InputStream stringInput = new ByteArrayInputStream(ttlString.getBytes());
conn.add(stringInput, "http://dragon-research.com/cham/model/model1", RDFFormat.TURTLE);
// A-Box
ttlString = BUCKET_TTL;
stringInput = new ByteArrayInputStream(ttlString.getBytes());
conn.add(stringInput, "http://dragon-research.com/cham/bucket/bucket1", RDFFormat.TURTLE);
conn.commit();
conn.close();
}
/**
* Mock RDF cloud store for one shot testing.
*/
public class MockRdfCloudStore extends RdfCloudTripleStore {
public MockRdfCloudStore() {
super();
final Instance instance = new MockInstance();
try {
final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
setConf(conf);
final Connector connector = instance.getConnector("", "");
final AccumuloRyaDAO cdao = new AccumuloRyaDAO();
cdao.setConf(conf);
cdao.setConnector(connector);
setRyaDAO(cdao);
inferenceEngine = new InferenceEngine();
inferenceEngine.setRyaDAO(cdao);
inferenceEngine.setRefreshGraphSchedule(5000); //every 5 sec
inferenceEngine.setConf(conf);
setInferenceEngine(inferenceEngine);
} catch (final Exception e) {
e.printStackTrace();
}
}
}
/**
* The ontology t-box in turtle.
*/
private static String MODEL_TTL = "@prefix : <http://dragon-research.com/cham/model/model1#> ."
+ "@prefix cham: <http://dragon-research.com/cham/schema#> ."
+ "@prefix dc: <http://purl.org/dc/elements/1.1/> ."
+ "@prefix owl: <http://www.w3.org/2002/07/owl#> ."
+ "@prefix qudt: <http://data.nasa.gov/qudt/owl/qudt#> ."
+ "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ."
+ "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> ."
+ "@prefix unit: <http://data.nasa.gov/qudt/owl/unit#> ."
+ "@prefix xml: <http://www.w3.org/XML/1998/namespace> ."
+ "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> ."
+ ""
+ "<http://dragon-research.com/cham/model/model1>"
+ " rdf:type owl:Ontology ;"
+ " rdfs:label \"Model1 Ontology\"^^xsd:string ;"
+ " :versionInfo \"0.1\"^^xsd:string ;"
+ " dc:title \"Model1 Ontology\"^^xsd:string ."
+ ""
+ ":ModelClassD"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"ModelClassD\"^^xsd:string ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:maxQualifiedCardinality"
+ " \"1\"^^xsd:nonNegativeInteger ;"
+ " owl:onDataRange xsd:string ;"
+ " owl:onProperty :name"
+ " ] ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:allValuesFrom :Model1ClassAssoc ;"
+ " owl:onProperty :hasModel1ClassAssoc"
+ " ] ."
+ ""
+ ":ModelClassC"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"ModelClassC\"^^xsd:string ;"
+ " rdfs:subClassOf :ModelClassD ."
+ ""
+ ":Modle1ClassB"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"Modle1ClassB\"^^xsd:string ;"
+ " rdfs:subClassOf :ModelClassC ."
+ ""
+ ":Model1ClassA"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"Model1ClassA\"^^xsd:string ;"
+ " rdfs:subClassOf :Modle1ClassB ."
+ ""
+ ":Model1Class"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"Model1Class\"^^xsd:string ;"
+ " rdfs:subClassOf :Model1ClassA ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:maxQualifiedCardinality"
+ " \"1\"^^xsd:nonNegativeInteger ;"
+ " owl:onDataRange xsd:string ;"
+ " owl:onProperty :model1ClassId"
+ " ] ."
+ ""
+ ":Model1Event"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"Model1Event\"^^xsd:string ;"
+ " rdfs:subClassOf :Event ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:allValuesFrom :Model1ClassA ;"
+ " owl:onProperty :hasModel1ClassA"
+ " ] ."
+ ""
+ ":Model1ClassAssoc"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"Model1ClassAssoc\"^^xsd:string ;"
+ " rdfs:subClassOf owl:Thing ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:maxQualifiedCardinality"
+ " \"1\"^^xsd:nonNegativeInteger ;"
+ " owl:onDataRange xsd:string ;"
+ " owl:onProperty :name"
+ " ] ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:maxQualifiedCardinality"
+ " \"1\"^^xsd:nonNegativeInteger ;"
+ " owl:onClass :ModelClassD ;"
+ " owl:onProperty :hasEntity"
+ " ] ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:allValuesFrom :ModelClassD ;"
+ " owl:onProperty :hasEntity"
+ " ] ."
+ ""
+ ":TemporalEntity"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"TemporalEntity\"^^xsd:string ;"
+ " rdfs:subClassOf owl:Thing ."
+ ""
+ ":TemporalInstant"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"TemporalInstant\"^^xsd:string ;"
+ " rdfs:subClassOf :TemporalEntity ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:maxQualifiedCardinality"
+ " \"1\"^^xsd:nonNegativeInteger ;"
+ " owl:onDataRange xsd:dateTime ;"
+ " owl:onProperty :dateTime"
+ " ] ."
+ ""
+ ":model1ClassId"
+ " rdf:type owl:DatatypeProperty ;"
+ " rdfs:domain :Model1Class ;"
+ " rdfs:label \"model1ClassId\"^^xsd:string ;"
+ " rdfs:range xsd:string ."
+ ""
+ ":hasModel1ClassAssoc"
+ " rdf:type owl:ObjectProperty ;"
+ " rdfs:domain :ModelClassD ;"
+ " rdfs:label \"hasModel1ClassAssoc\"^^xsd:string ;"
+ " rdfs:range :Model1ClassAssoc ."
+ ""
+ ":name"
+ " rdf:type owl:DatatypeProperty ;"
+ " rdfs:domain :Model1ClassAssoc , :ModelClassD ;"
+ " rdfs:label \"name\"^^xsd:string ;"
+ " rdfs:range xsd:string ."
+ ""
+ ":hasTemporalEntity"
+ " rdf:type owl:ObjectProperty ;"
+ " rdfs:domain :ThreatAnalysis , :Event , :TrackingData , :Threat , :Vulnerability ;"
+ " rdfs:label \"hasTemporalEntity\"^^xsd:string ;"
+ " rdfs:range :TemporalEntity ."
+ ""
+ ":hasEntity"
+ " rdf:type owl:ObjectProperty ;"
+ " rdfs:domain :Model1ClassAssoc ;"
+ " rdfs:label \"hasEntity\"^^xsd:string ;"
+ " rdfs:range :ModelClassD ."
+ ""
+ ":dateTime"
+ " rdf:type owl:DatatypeProperty ;"
+ " rdfs:domain :TemporalInstant ;"
+ " rdfs:label \"dateTime\"^^xsd:string ;"
+ " rdfs:range xsd:dateTime ."
+ ""
+ ":Event"
+ " rdf:type owl:Class ;"
+ " rdfs:label \"Event\"^^xsd:string ;"
+ " rdfs:subClassOf :ModelClassD ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:allValuesFrom :TemporalEntity ;"
+ " owl:onProperty :hasTemporalEntity"
+ " ] ;"
+ " rdfs:subClassOf"
+ " [ rdf:type owl:Restriction ;"
+ " owl:maxQualifiedCardinality"
+ " \"1\"^^xsd:nonNegativeInteger ;"
+ " owl:onClass :TemporalEntity ;"
+ " owl:onProperty :hasTemporalEntity"
+ " ] ."
+ ""
+ ":hasModel1ClassA"
+ " rdf:type owl:ObjectProperty ;"
+ " rdfs:domain :Model1Event ;"
+ " rdfs:label \"hasModel1ClassA\"^^xsd:string ;"
+ " rdfs:range :Model1ClassA ."
+ ""
+ "rdfs:label"
+ " rdf:type owl:AnnotationProperty ."
+ ""
+ "xsd:date"
+ " rdf:type rdfs:Datatype ."
+ ""
+ "xsd:time"
+ " rdf:type rdfs:Datatype .";
/**
* The ontology a-box in turtle.
*/
private static String BUCKET_TTL = "@prefix : <http://dragon-research.com/cham/bucket/bucket1#> ."
+ "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> ."
+ "@prefix owl: <http://www.w3.org/2002/07/owl#> ."
+ "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> ."
+ "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ."
+ "@prefix model1: <http://dragon-research.com/cham/model/model1#> ."
+ ""
+ ":i1 a model1:Model1Class ;"
+ " rdfs:label \"Model1Class 1\"^^xsd:string ;"
+ " model1:name \"Model1Class 1\"^^xsd:string ;"
+ " model1:hasModel1ClassAssoc :i1-assoc ;"
+ " model1:model1ClassId \"ID01\"^^xsd:string ."
+ " "
+ ":i1-assoc a model1:Model1ClassAssoc ;"
+ " rdfs:label \"Model1Class 1 Assoc\"^^xsd:string ;"
+ " model1:hasEntity :i1-event ."
+ " "
+ ":i1-event a model1:Model1Event ;"
+ " rdfs:label \"Model1Class 1 Event\"^^xsd:string ;"
+ " model1:hasTemporalEntity :i1-time ."
+ ""
+ ":i1-time a model1:TemporalInstant ;"
+ " rdfs:label \"Model1Class 1 Time\"^^xsd:string ;"
+ " model1:dateTime \"1994-02-07T21:47:01.000Z\"^^xsd:dateTime ."
+ " "
+ ":i2 a model1:Model1Class ;"
+ " rdfs:label \"Model1Class 2\"^^xsd:string ;"
+ " model1:name \"Model1Class 2\"^^xsd:string ;"
+ " model1:hasModel1ClassAssoc :i2-assoc ;"
+ " model1:model1ClassId \"ID02\"^^xsd:string ."
+ ""
+ ":i2-assoc a model1:Model1ClassAssoc ;"
+ " rdfs:label \"Model1Class 2 Assoc\"^^xsd:string ;"
+ " model1:hasEntity :i2-event ."
+ " "
+ ":i2-event a model1:Model1Event ;"
+ " rdfs:label \"Model1Class 2 Event\"^^xsd:string ;"
+ " model1:hasTemporalEntity :i2-time ."
+ ""
+ ":i2-time a model1:TemporalInstant ;"
+ " rdfs:label \"Model1Class 2 Time\"^^xsd:string ;"
+ " model1:dateTime \"1995-11-06T05:15:01.000Z\"^^xsd:dateTime ."
+ " "
+ ":i3 a model1:Model1Class ;"
+ " rdfs:label \"Model1Class 3\"^^xsd:string ;"
+ " model1:name \"Model1Class 3\"^^xsd:string ;"
+ " model1:hasModel1ClassAssoc :i3-assoc ;"
+ " model1:model1ClassId \"ID03\"^^xsd:string ."
+ ""
+ ":i3-assoc a model1:Model1ClassAssoc ;"
+ " rdfs:label \"Model1Class 3 Assoc\"^^xsd:string ;"
+ " model1:hasEntity :i3-event ."
+ " "
+ ":i3-event a model1:Model1Event ;"
+ " rdfs:label \"Model1Class 3 Event\"^^xsd:string ;"
+ " model1:hasTemporalEntity :i3-time ."
+ ""
+ ":i3-time a model1:TemporalInstant ;"
+ " rdfs:label \"Model1Class 3 Time\"^^xsd:string ;"
+ " model1:dateTime \"1999-04-30T16:30:00.000Z\"^^xsd:dateTime ."
+ " "
+ ":i4 a model1:Model1Class ;"
+ " rdfs:label \"Model1Class 4\"^^xsd:string ;"
+ " model1:name \"Model1Class 4\"^^xsd:string ;"
+ " model1:hasModel1ClassAssoc :i4-assoc ;"
+ " model1:model1ClassId \"ID04\"^^xsd:string ."
+ ""
+ ":i4-assoc a model1:Model1ClassAssoc ;"
+ " rdfs:label \"Model1Class 4 Assoc\"^^xsd:string ;"
+ " model1:hasEntity :i4-event ."
+ " "
+ ":i4-event a model1:Model1Event ;"
+ " rdfs:label \"Model1Class 4 Event\"^^xsd:string ;"
+ " model1:hasTemporalEntity :i4-time ."
+ ""
+ ":i4-time a model1:TemporalInstant ;"
+ " rdfs:label \"Model1Class 4 Time\"^^xsd:string ;"
+ " model1:dateTime \"2001-02-27T21:20:00.000Z\"^^xsd:dateTime ."
+ " "
+ ":i5 a model1:Model1Class ;"
+ " rdfs:label \"Model1Class 5\"^^xsd:string ;"
+ " model1:name \"Model1Class 5\"^^xsd:string ;"
+ " model1:hasModel1ClassAssoc :i5-assoc ;"
+ " model1:model1ClassId \"ID05\"^^xsd:string ."
+ ""
+ ":i5-assoc a model1:Model1ClassAssoc ;"
+ " rdfs:label \"Model1Class 5 Assoc\"^^xsd:string ;"
+ " model1:hasEntity :i5-event ."
+ " "
+ ":i5-event a model1:Model1Event ;"
+ " rdfs:label \"Model1Class 5 Event\"^^xsd:string ;"
+ " model1:hasTemporalEntity :i5-time ."
+ ""
+ ":i5-time a model1:TemporalInstant ;"
+ " rdfs:label \"Model1Class 5 Time\"^^xsd:string ;"
+ " model1:dateTime \"2002-01-16T00:30:00.000Z\"^^xsd:dateTime ."
+ " "
+ ":i6 a model1:Model1Class ;"
+ " rdfs:label \"Model1Class 6\"^^xsd:string ;"
+ " model1:name \"Model1Class 6\"^^xsd:string ;"
+ " model1:hasModel1ClassAssoc :i6-assoc ;"
+ " model1:model1ClassId \"ID06\"^^xsd:string ."
+ ""
+ ":i6-assoc a model1:Model1ClassAssoc ;"
+ " rdfs:label \"Model1Class 6 Assoc\"^^xsd:string ;"
+ " model1:hasEntity :i6-event ."
+ " "
+ ":i6-event a model1:Model1Event ;"
+ " rdfs:label \"Model1Class 6 Event\"^^xsd:string ;"
+ " model1:hasTemporalEntity :i6-time ."
+ ""
+ ":i6-time a model1:TemporalInstant ;"
+ " rdfs:label \"Model1Class 6 Time\"^^xsd:string ;"
+ " model1:dateTime \"2003-04-08T13:43:00.000Z\"^^xsd:dateTime .";
}