blob: 57f9fed95874d4f46af7f24c3085c3d015686ab7 [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 examples;
import java.io.File ;
import java.io.IOException ;
import org.apache.jena.atlas.lib.StrUtils ;
import org.apache.jena.atlas.logging.LogCtl ;
import org.apache.jena.query.* ;
import org.apache.jena.query.spatial.* ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.rdf.model.ResourceFactory ;
import org.apache.jena.riot.RDFDataMgr ;
import org.apache.jena.sparql.util.QueryExecUtils ;
import org.apache.jena.tdb.TDBFactory ;
import org.apache.lucene.store.Directory ;
import org.apache.lucene.store.FSDirectory ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
/** Build a spatial search dataset */
public class JenaSpatialExample1 {
static {
LogCtl.setLog4j();
}
static Logger log = LoggerFactory.getLogger("JenaSpatialExample");
private static final String LUCENE_INDEX_PATH = "target/test/TDBDatasetWithLuceneSpatialIndex";
private static final File LUCENE_INDEX_DIR = new File(LUCENE_INDEX_PATH);
private static final String LUCENE_TDB_PATH = "target/test/TDB";
private static final File LUCENE_TDB_DIR = new File(LUCENE_TDB_PATH);
private static final String SOLR_DATA_PATH = "src/test/resources/SolrHome/SolrARQCollection/data";
private static final File SOLR_DATA_DIR = new File(SOLR_DATA_PATH);
public static void main(String... argv) throws IOException {
Dataset spatialDataset = initInMemoryDatasetWithLuceneSpatitalIndex(LUCENE_INDEX_DIR);
//Dataset spatialDataset = initTDBDatasetWithLuceneSpatitalIndex(indexDir, TDBDir);
//Dataset spatialDataset = createLuceneAssembler() ;
//Dataset spatialDataset = createSolrAssembler() ;
loadData(spatialDataset, "src/test/resources/geoarq-data-1.ttl");
queryData(spatialDataset);
destroy(spatialDataset);
}
private static void destroy(Dataset spatialDataset){
SpatialIndex index = (SpatialIndex)spatialDataset.getContext().get(SpatialQuery.spatialIndex);
if (index instanceof SpatialIndexLucene){
deleteOldFiles(LUCENE_INDEX_DIR);
deleteOldFiles(LUCENE_TDB_DIR);
}
// else if (index instanceof SpatialIndexSolr){
// SolrServer server = ((SpatialIndexSolr)index).getServer();
//
// if (server instanceof EmbeddedSolrServer){
// server.shutdown();
// deleteOldFiles(SOLR_DATA_DIR);
// }
// }
}
private static void emptyAndDeleteDirectory(File dir) {
File[] contents = dir.listFiles() ;
if (contents != null) {
for (File content : contents) {
if (content.isDirectory()) {
emptyAndDeleteDirectory(content) ;
} else {
content.delete() ;
}
}
}
dir.delete() ;
}
private static Dataset initInMemoryDatasetWithLuceneSpatitalIndex(File indexDir) throws IOException{
deleteOldFiles(indexDir);
indexDir.mkdirs();
return createDatasetByCode(indexDir);
}
private static Dataset initTDBDatasetWithLuceneSpatitalIndex(File indexDir, File TDBDir) throws IOException{
deleteOldFiles(indexDir);
deleteOldFiles(TDBDir);
indexDir.mkdirs();
TDBDir.mkdir();
return createDatasetByCode(indexDir, TDBDir);
}
private static void deleteOldFiles(File indexDir) {
if (indexDir.exists())
emptyAndDeleteDirectory(indexDir);
}
private static Dataset createDatasetByCode(File indexDir) throws IOException {
// Base data
Dataset ds1 = DatasetFactory.create();
return joinDataset(ds1, indexDir);
}
private static Dataset createDatasetByCode(File indexDir, File TDBDir) throws IOException {
// Base data
Dataset ds1 = TDBFactory.createDataset(TDBDir.getAbsolutePath());
return joinDataset(ds1, indexDir);
}
private static Dataset joinDataset(Dataset baseDataset, File indexDir) throws IOException{
EntityDefinition entDef = new EntityDefinition("entityField", "geoField");
// you need JTS lib in the classpath to run the examples
entDef.setSpatialContextFactory(SpatialQuery.JTS_SPATIAL_CONTEXT_FACTORY_CLASS);
// set custom goe predicates
entDef.addSpatialPredicatePair(ResourceFactory.createResource("http://localhost/jena_example/#latitude_1"), ResourceFactory.createResource("http://localhost/jena_example/#longitude_1"));
entDef.addSpatialPredicatePair(ResourceFactory.createResource("http://localhost/jena_example/#latitude_2"), ResourceFactory.createResource("http://localhost/jena_example/#longitude_2"));
entDef.addWKTPredicate(ResourceFactory.createResource("http://localhost/jena_example/#wkt_1"));
entDef.addWKTPredicate(ResourceFactory.createResource("http://localhost/jena_example/#wkt_2"));
// Lucene, index in File system.
Directory dir = FSDirectory.open(indexDir);
// Join together into a dataset
Dataset ds = SpatialDatasetFactory.createLucene(baseDataset, dir, entDef);
return ds;
}
public static Dataset createLuceneAssembler() {
log.info("Construct lucene spatial dataset using an assembler description");
Dataset ds = DatasetFactory.assemble("src/test/resources/spatial-config.ttl",
"http://localhost/jena_example/#spatial_dataset");
return ds;
}
public static Dataset createSolrAssembler() {
log.info("Construct solr spatial dataset using an assembler description");
Dataset ds = DatasetFactory.assemble("src/test/resources/spatial-solr-config.ttl",
"http://localhost/jena_example/#spatial_dataset");
return ds;
}
public static void loadData(Dataset spatialDataset, String file) {
log.info("Start loading");
long startTime = System.nanoTime();
spatialDataset.begin(ReadWrite.WRITE);
try {
Model m = spatialDataset.getDefaultModel();
RDFDataMgr.read(m, file);
// RDFDataMgr.read(dataset, "D.ttl") ;
spatialDataset.commit();
} finally {
spatialDataset.end();
}
long finishTime = System.nanoTime();
double time = (finishTime - startTime) / 1.0e6;
log.info(String.format("Finish loading - %.2fms", time));
}
public static void queryData(Dataset spatialDataset) {
log.info("START");
long startTime = System.nanoTime();
String pre = StrUtils.strjoinNL("PREFIX : <http://example/>",
"PREFIX spatial: <http://jena.apache.org/spatial#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>");
System.out.println("nearby");
String qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:nearby (51.3000 -2.71000 100.0 'miles') ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
long finishTime = System.nanoTime();
double time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
System.out.println("withinCircle");
startTime = System.nanoTime();
qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:withinCircle (51.3000 -2.71000 100.0 'miles' 3) ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
finishTime = System.nanoTime();
time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
System.out.println("withinBox");
startTime = System.nanoTime();
qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:withinBox (51.1000 -4.0000 51.4000 0.0000 -1) ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
finishTime = System.nanoTime();
time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
System.out.println("interesectBox");
startTime = System.nanoTime();
qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:intersectBox (51.1000 -4.0000 51.4000 0.0000) ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
finishTime = System.nanoTime();
time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
System.out.println("north");
startTime = System.nanoTime();
qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:north (51.3000 0.0000) ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
finishTime = System.nanoTime();
time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
System.out.println("south");
startTime = System.nanoTime();
qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:south (51.3000 0.0000) ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
finishTime = System.nanoTime();
time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
System.out.println("east");
startTime = System.nanoTime();
qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:east (51.3000 0.0000) ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
finishTime = System.nanoTime();
time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
System.out.println("west");
startTime = System.nanoTime();
qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:west (51.3000 0.0000) ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
finishTime = System.nanoTime();
time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
System.out.println("west2");
startTime = System.nanoTime();
qs = StrUtils.strjoinNL("SELECT * ",
" { ?s spatial:withinBox (51.1 -180.0000 51.9 0.0000) ;",
" rdfs:label ?label", " }");
spatialDataset.begin(ReadWrite.READ);
try {
Query q = QueryFactory.create(pre + "\n" + qs);
QueryExecution qexec = QueryExecutionFactory.create(q, spatialDataset);
QueryExecUtils.executeQuery(q, qexec);
} finally {
spatialDataset.end();
}
finishTime = System.nanoTime();
time = (finishTime - startTime) / 1.0e6;
log.info(String.format("FINISH - %.2fms", time));
}
}