use of org.apache.jena.query.spatial.EntityDefinition in project jena by apache.
the class EntityDefinitionAssembler method open.
// V1
/*
<#definition> a spatial:EntityDefinition ;
spatial:entityField "uri" ;
spatial:geoField "geo" ;
spatial:hasSpatialPredicatePairs (
[ spatial:latitude <#latitude_1> ; spatial:longitude <#longitude_1> ]
[ spatial:latitude <#latitude_2> ; spatial:longitude <#longitude_2> ]
) ;
spatial:hasWKTPredicates (<#wkt_1> <#wkt_2>) ;
spatial:spatialContextFactory
"org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory" .
*/
@Override
public EntityDefinition open(Assembler a, Resource root, Mode mode) {
String prologue = "PREFIX : <" + NS + "> PREFIX list: <http://jena.apache.org/ARQ/list#> ";
Model model = root.getModel();
String qs1 = StrUtils.strjoinNL(prologue, "SELECT * {", " ?definition :entityField ?entityField ;", " :geoField ?geoField", "}");
ParameterizedSparqlString pss = new ParameterizedSparqlString(qs1);
pss.setIri("definition", root.getURI());
Query query1 = QueryFactory.create(pss.toString());
QueryExecution qexec1 = QueryExecutionFactory.create(query1, model);
ResultSet rs1 = qexec1.execSelect();
List<QuerySolution> results = ResultSetFormatter.toList(rs1);
if (results.size() == 0) {
//Log.warn(this, "Failed to find a valid EntityDefinition for : "+root) ;
throw new SpatialIndexException("Failed to find a valid EntityDefinition for : " + root);
}
if (results.size() != 1) {
Log.warn(this, "Multiple matches for EntityMap for : " + root);
throw new SpatialIndexException("Multiple matches for EntityDefinition for : " + root);
}
QuerySolution qsol1 = results.get(0);
String entityField = qsol1.getLiteral("entityField").getLexicalForm();
String geoField = qsol1.getLiteral("geoField").getLexicalForm();
EntityDefinition docDef = new EntityDefinition(entityField, geoField);
String qs2 = StrUtils.strjoinNL("SELECT * { ?definition :hasSpatialPredicatePairs [ list:member [ :latitude ?latitude ; :longitude ?longitude ] ]}");
Query query2 = QueryFactory.create(prologue + " " + qs2);
QueryExecution qexec2 = QueryExecutionFactory.create(query2, model, qsol1);
ResultSet rs2 = qexec2.execSelect();
List<QuerySolution> mapEntries = ResultSetFormatter.toList(rs2);
for (QuerySolution qsol : mapEntries) {
Resource latitude = qsol.getResource("latitude");
Resource longitude = qsol.getResource("longitude");
docDef.addSpatialPredicatePair(latitude, longitude);
}
String qs3 = StrUtils.strjoinNL("SELECT * { ?definition :hasWKTPredicates [ list:member ?wkt ] }");
Query query3 = QueryFactory.create(prologue + " " + qs3);
QueryExecution qexec3 = QueryExecutionFactory.create(query3, model, qsol1);
ResultSet rs3 = qexec3.execSelect();
mapEntries = ResultSetFormatter.toList(rs3);
for (QuerySolution qsol : mapEntries) {
Resource wkt = qsol.getResource("wkt");
docDef.addWKTPredicate(wkt);
}
String qs4 = StrUtils.strjoinNL("SELECT * { ?definition :spatialContextFactory ?factory }");
Query query4 = QueryFactory.create(prologue + " " + qs4);
QueryExecution qexec4 = QueryExecutionFactory.create(query4, model, qsol1);
ResultSet rs4 = qexec4.execSelect();
List<QuerySolution> results4 = ResultSetFormatter.toList(rs4);
if (results4.size() == 0) {
return docDef;
} else if (results4.size() != 1) {
Log.warn(this, "Multiple matches for SpatialContextFactory for : " + root);
throw new SpatialIndexException("Multiple matches for SpatialContextFactory for : " + root);
} else {
QuerySolution qsol4 = results4.get(0);
String spatialContextFactory = qsol4.getLiteral("factory").getLexicalForm();
try {
docDef.setSpatialContextFactory(spatialContextFactory);
} catch (NoClassDefFoundError e) {
Log.warn(this, "Custom SpatialContextFactory lib is not ready in classpath:" + e.getMessage());
}
return docDef;
}
}
use of org.apache.jena.query.spatial.EntityDefinition in project jena by apache.
the class SpatialIndexLuceneAssembler method open.
/*
<#index> a :SpatialIndexLucene ;
#spatial:directory "mem" ;
spatial:directory <file:DIR> ;
spatial:definition <#definition> ;
.
*/
@SuppressWarnings("resource")
@Override
public SpatialIndex open(Assembler a, Resource root, Mode mode) {
try {
if (!GraphUtils.exactlyOneProperty(root, pDirectory))
throw new SpatialIndexException("No 'spatial:directory' property on " + root);
Directory directory;
RDFNode n = root.getProperty(pDirectory).getObject();
if (n.isLiteral()) {
if (!"mem".equals(n.asLiteral().getLexicalForm()))
throw new SpatialIndexException("No 'spatial:directory' property on " + root + " is a literal and not \"mem\"");
directory = new RAMDirectory();
} else {
Resource x = n.asResource();
String path = IRILib.IRIToFilename(x.getURI());
File dir = new File(path);
directory = FSDirectory.open(dir.toPath());
}
Resource r = GraphUtils.getResourceValue(root, pDefinition);
EntityDefinition docDef = (EntityDefinition) a.open(r);
return SpatialDatasetFactory.createLuceneIndex(directory, docDef);
} catch (IOException e) {
IO.exception(e);
return null;
}
}
use of org.apache.jena.query.spatial.EntityDefinition in project jena by apache.
the class TestEntityDefinitionAssembler method EntityHasMultiplePairsAndWKTs.
@Test
public void EntityHasMultiplePairsAndWKTs() {
EntityDefinitionAssembler emAssembler = new EntityDefinitionAssembler();
EntityDefinition entityDef = emAssembler.open(null, spec2, null);
assertEquals(2, entityDef.getCustomSpatialPredicatePairCount());
assertEquals(true, entityDef.hasSpatialPredicatePair(SPEC2_LATITUDE_1.asNode(), SPEC2_LONGITUDE_1.asNode()));
assertEquals(true, entityDef.hasSpatialPredicatePair(SPEC2_LATITUDE_2.asNode(), SPEC2_LONGITUDE_2.asNode()));
assertEquals(false, entityDef.hasSpatialPredicatePair(SPEC2_LATITUDE_1.asNode(), SPEC2_LONGITUDE_2.asNode()));
assertEquals(false, entityDef.hasSpatialPredicatePair(SPEC2_LATITUDE_2.asNode(), SPEC2_LONGITUDE_1.asNode()));
assertEquals(2, entityDef.getCustomWKTPredicateCount());
assertEquals(true, entityDef.isWKTPredicate(SPEC2_WKT_1.asNode()));
assertEquals(true, entityDef.isWKTPredicate(SPEC2_WKT_2.asNode()));
assertEquals(false, entityDef.isWKTPredicate(SPEC1_WKT.asNode()));
}
use of org.apache.jena.query.spatial.EntityDefinition in project jena by apache.
the class TestEntityDefinitionAssembler method EntityHasWKT.
@Test
public void EntityHasWKT() {
EntityDefinitionAssembler emAssembler = new EntityDefinitionAssembler();
EntityDefinition entityDef = emAssembler.open(null, spec1, null);
assertEquals(1, entityDef.getCustomWKTPredicateCount());
assertEquals(true, entityDef.isWKTPredicate(SPEC1_WKT.asNode()));
}
use of org.apache.jena.query.spatial.EntityDefinition in project jena by apache.
the class TestEntityDefinitionAssembler method EntityHasGeoield.
@Test
public void EntityHasGeoield() {
EntityDefinitionAssembler emAssembler = new EntityDefinitionAssembler();
EntityDefinition entityDef = emAssembler.open(null, spec0, null);
assertEquals(SPEC0_GEO_FIELD, entityDef.getGeoField());
}
Aggregations