Search in sources :

Example 1 with EntityDefinition

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;
    }
}
Also used : EntityDefinition(org.apache.jena.query.spatial.EntityDefinition) Model(org.apache.jena.rdf.model.Model) Resource(org.apache.jena.rdf.model.Resource) SpatialIndexException(org.apache.jena.query.spatial.SpatialIndexException)

Example 2 with EntityDefinition

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;
    }
}
Also used : EntityDefinition(org.apache.jena.query.spatial.EntityDefinition) Resource(org.apache.jena.rdf.model.Resource) SpatialIndexException(org.apache.jena.query.spatial.SpatialIndexException) IOException(java.io.IOException) File(java.io.File) RDFNode(org.apache.jena.rdf.model.RDFNode) RAMDirectory(org.apache.lucene.store.RAMDirectory) RAMDirectory(org.apache.lucene.store.RAMDirectory) Directory(org.apache.lucene.store.Directory) FSDirectory(org.apache.lucene.store.FSDirectory) SpatialVocab.pDirectory(org.apache.jena.query.spatial.assembler.SpatialVocab.pDirectory)

Example 3 with EntityDefinition

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()));
}
Also used : EntityDefinition(org.apache.jena.query.spatial.EntityDefinition) Test(org.junit.Test)

Example 4 with EntityDefinition

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()));
}
Also used : EntityDefinition(org.apache.jena.query.spatial.EntityDefinition) Test(org.junit.Test)

Example 5 with EntityDefinition

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());
}
Also used : EntityDefinition(org.apache.jena.query.spatial.EntityDefinition) Test(org.junit.Test)

Aggregations

EntityDefinition (org.apache.jena.query.spatial.EntityDefinition)7 Test (org.junit.Test)5 SpatialIndexException (org.apache.jena.query.spatial.SpatialIndexException)2 Resource (org.apache.jena.rdf.model.Resource)2 File (java.io.File)1 IOException (java.io.IOException)1 SpatialVocab.pDirectory (org.apache.jena.query.spatial.assembler.SpatialVocab.pDirectory)1 Model (org.apache.jena.rdf.model.Model)1 RDFNode (org.apache.jena.rdf.model.RDFNode)1 Directory (org.apache.lucene.store.Directory)1 FSDirectory (org.apache.lucene.store.FSDirectory)1 RAMDirectory (org.apache.lucene.store.RAMDirectory)1