blob: 8ba0901e9caff0538ca839fac76f08d1d7d20c59 [file] [log] [blame]
/*
* 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.jena.tdb.store;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.apache.jena.query.* ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.rdf.model.ModelFactory ;
import org.apache.jena.rdf.model.Property ;
import org.apache.jena.rdf.model.Resource ;
import org.apache.jena.riot.Lang ;
import org.apache.jena.riot.RDFDataMgr ;
import org.apache.jena.sparql.core.Quad ;
import org.apache.jena.sparql.sse.SSE ;
import org.apache.jena.tdb.TDB ;
import org.apache.jena.tdb.TDBFactory ;
import org.junit.Test ;
/** Tests of datasets, prefixes, special URIs etc (see also {@link org.apache.jena.sparql.graph.GraphsTests} */
public class TestDatasetTDB
{
private static Dataset create()
{
return TDBFactory.createDataset() ;
}
private static void load(Model model, String file)
{
RDFDataMgr.read(model, file) ;
}
private static String base1 = "http://example/" ;
private static String baseNS = "http://example/ns#" ;
private static void load1(Model model)
{
model.setNsPrefix("", base1) ;
Resource r1 = model.createResource(base1+"r1") ;
Property p1 = model.createProperty(baseNS+"p1") ;
model.add(r1, p1, "x1") ;
model.add(r1, p1, "x2") ;
}
private static void load2(Model model)
{
Resource r2 = model.createResource(base1+"r2") ;
Property p1 = model.createProperty(baseNS+"p1") ;
model.add(r2, p1, "x1") ;
model.add(r2, p1, "x2") ;
}
private static void load3(Model model)
{
Resource r3 = model.createResource(base1+"r3") ;
Property p1 = model.createProperty(baseNS+"p2") ;
model.add(r3, p1, "x1") ;
model.add(r3, p1, "x2") ;
}
@Test public void prefix1()
{
Dataset ds = create() ;
Model m = ds.getDefaultModel() ;
load1(m) ;
String x = m.expandPrefix(":x") ;
assertEquals(x, base1+"x") ;
}
@Test public void prefix2()
{
Dataset ds = create() ;
Model m = ds.getDefaultModel() ;
load1(m) ;
Model m2 = ds.getNamedModel("http://example/graph/") ;
String x = m2.expandPrefix(":x") ;
assertEquals(x, ":x") ;
}
@Test public void query1()
{
Dataset ds = create() ;
Model m = ds.getDefaultModel() ;
load1(m) ;
String qs = "CONSTRUCT {?s ?p ?o } WHERE {?s ?p ?o}" ;
Query q = QueryFactory.create(qs) ;
QueryExecution qExec = QueryExecutionFactory.create(q, ds) ;
Model m2 = qExec.execConstruct() ;
assertTrue(m.isIsomorphicWith(m2)) ;
}
@Test public void query2()
{
Dataset ds = create() ;
Model m = ds.getDefaultModel() ;
load1(m) ;
String qs = "CONSTRUCT {?s ?p ?o } WHERE { GRAPH <http://example/graph/> {?s ?p ?o}}" ;
Query q = QueryFactory.create(qs) ;
QueryExecution qExec = QueryExecutionFactory.create(q, ds) ;
Model m2 = qExec.execConstruct() ;
assertTrue(m2.isEmpty()) ;
}
static String defaultGraph = Quad.defaultGraphIRI.getURI() ;
static String unionGraph = Quad.unionGraph.getURI() ;
@Test public void special1()
{
Dataset ds = create() ;
Model m = ds.getDefaultModel() ;
load1(m) ;
String qs = "CONSTRUCT {?s ?p ?o } WHERE { GRAPH <"+defaultGraph+"> {?s ?p ?o}}" ;
Query q = QueryFactory.create(qs) ;
QueryExecution qExec = QueryExecutionFactory.create(q, ds) ;
Model m2 = qExec.execConstruct() ;
assertTrue(m.isIsomorphicWith(m2)) ;
}
@Test public void special2()
{
Dataset ds = create() ;
load1(ds.getDefaultModel()) ;
load2(ds.getNamedModel("http://example/graph1")) ;
load3(ds.getNamedModel("http://example/graph2")) ;
Model m = ModelFactory.createDefaultModel() ;
load2(m) ;
load3(m) ;
String qs = "CONSTRUCT {?s ?p ?o } WHERE { GRAPH <"+unionGraph+"> {?s ?p ?o}}" ;
Query q = QueryFactory.create(qs) ;
QueryExecution qExec = QueryExecutionFactory.create(q, ds) ;
Model m2 = qExec.execConstruct() ;
assertTrue(m.isIsomorphicWith(m2)) ;
}
@Test public void special3()
{
Dataset ds = create() ;
load1(ds.getDefaultModel()) ;
load2(ds.getNamedModel("http://example/graph1")) ;
load3(ds.getNamedModel("http://example/graph2")) ;
Model m = ModelFactory.createDefaultModel() ;
load2(m) ;
load3(m) ;
String qs = "CONSTRUCT {?s ?p ?o } WHERE { ?s ?p ?o }" ;
Query q = QueryFactory.create(qs) ;
QueryExecution qExec = QueryExecutionFactory.create(q, ds) ;
qExec.getContext().set(TDB.symUnionDefaultGraph, true) ;
Model m2 = qExec.execConstruct() ;
if ( ! m.isIsomorphicWith(m2) )
{
System.out.println("---- ----") ;
SSE.write(ds.asDatasetGraph()) ;
System.out.println("-- Expected") ;
m.write(System.out, "TTL") ;
System.out.println("-- Actual") ;
m2.write(System.out, "TTL") ;
System.out.println("---- ----") ;
}
assertTrue(m.isIsomorphicWith(m2)) ;
}
@Test public void special4()
{
Dataset ds = create() ;
load1(ds.getDefaultModel()) ;
load2(ds.getNamedModel("http://example/graph1")) ;
load3(ds.getNamedModel("http://example/graph2")) ;
Model m = ModelFactory.createDefaultModel() ;
load2(m) ;
load3(m) ;
String qs = "PREFIX : <"+baseNS+"> SELECT (COUNT(?x) as ?c) WHERE { ?x (:p1|:p2) 'x1' }" ;
Query q = QueryFactory.create(qs) ;
long c_m ;
// Model
try (QueryExecution qExec = QueryExecutionFactory.create(q, m)) {
c_m = qExec.execSelect().next().getLiteral("c").getLong() ;
}
// dataset
long c_ds ;
try (QueryExecution qExec = QueryExecutionFactory.create(q, ds)) {
qExec.getContext().set(TDB.symUnionDefaultGraph, true) ;
c_ds = qExec.execSelect().next().getLiteral("c").getLong() ;
}
// String qs2 = "PREFIX : <"+baseNS+"> SELECT * WHERE { ?x (:p1|:p2) 'x1' }" ;
// Query q2 = QueryFactory.create(qs2) ;
// qExec = QueryExecutionFactory.create(q2, ds) ;
// qExec.getContext().set(TDB.symUnionDefaultGraph, true) ;
// ResultSetFormatter.out(qExec.execSelect()) ;
//
// qExec = QueryExecutionFactory.create(q2, m) ;
// ResultSetFormatter.out(qExec.execSelect()) ;
// --------
assertEquals(c_m, c_ds) ;
}
@Test public void special5()
{
Dataset ds = create() ;
//load1(ds.getDefaultModel()) ;
load1(ds.getNamedModel("http://example/graph1")) ; // Same triples, different graph
load1(ds.getNamedModel("http://example/graph2")) ;
Model m = ds.getNamedModel(unionGraph) ;
assertEquals(2, m.size()) ;
}
// Put a model into a general dataset and use it.
@Test public void generalDataset1()
{
Dataset ds = create() ;
load1(ds.getDefaultModel()) ;
load2(ds.getNamedModel("http://example/graph1")) ;
load3(ds.getNamedModel("http://example/graph2")) ;
Model m = ds.getNamedModel("http://example/graph2") ;
// Use graph2 as default model.
Dataset ds2 = DatasetFactory.createGeneral() ;
ds2.setDefaultModel(ds.getNamedModel("http://example/graph2")) ;
String qs = "CONSTRUCT {?s ?p ?o } WHERE { ?s ?p ?o}" ;
Query q = QueryFactory.create(qs) ;
QueryExecution qExec = QueryExecutionFactory.create(q, ds2) ;
Model m2 = qExec.execConstruct() ;
assertTrue(m.isIsomorphicWith(m2)) ;
}
@Test public void generalDataset2()
{
Dataset ds = create() ;
load1(ds.getDefaultModel()) ;
load2(ds.getNamedModel("http://example/graph1")) ;
load3(ds.getNamedModel("http://example/graph2")) ;
Model m = ds.getNamedModel("http://example/graph2") ;
// Use graph1 as a differently named model.
Dataset ds2 = DatasetFactory.createGeneral() ;
ds2.addNamedModel("http://example/graphOther", m) ;
String qs = "CONSTRUCT {?s ?p ?o } WHERE { {?s ?p ?o} UNION { GRAPH <http://example/graphOther> {?s ?p ?o} } }" ;
Query q = QueryFactory.create(qs) ;
QueryExecution qExec = QueryExecutionFactory.create(q, ds2) ;
Model m2 = qExec.execConstruct() ;
if ( ! m.isIsomorphicWith(m2) )
{
System.out.println(m.getGraph().getClass().getSimpleName()+"/"+m.size()+" : "+m2.getGraph().getClass().getSimpleName()+"/"+m2.size()) ;
System.out.println("---- Different:" ) ;
RDFDataMgr.write(System.out, m, Lang.TTL) ;
System.out.println("---- ----" ) ;
RDFDataMgr.write(System.out, m2, Lang.TTL) ;
System.out.println("---- ----") ;
}
assertTrue(m.isIsomorphicWith(m2)) ;
}
@Test public void generalDataset3()
{
Dataset ds = create() ;
load1(ds.getDefaultModel()) ;
load2(ds.getNamedModel("http://example/graph1")) ;
load3(ds.getNamedModel("http://example/graph2")) ;
Model m = ds.getDefaultModel() ;
// Use the default model in one dataset as a named model in another.
Dataset ds2 = DatasetFactory.createGeneral() ;
ds2.addNamedModel("http://example/graphOther", m) ;
String qs = "CONSTRUCT {?s ?p ?o } WHERE { {?s ?p ?o} UNION { GRAPH <http://example/graphOther> {?s ?p ?o} } }" ;
Query q = QueryFactory.create(qs) ;
QueryExecution qExec = QueryExecutionFactory.create(q, ds2) ;
Model m2 = qExec.execConstruct() ;
assertTrue(m.isIsomorphicWith(m2)) ;
}
// removeAll
}