How to create and use GeoSpatial indexes in Marklogic from Sparql

為{幸葍}努か 提交于 2019-12-11 16:22:54

问题


I have loaded the geospatial data from geonames.org into Marklogic using RDF import.

When using the Query Console to explore the data, I see the data has been loaded into an xml document and looks like this:

<sem:triple>
<sem:subject>http://sws.geonames.org/2736540/</sem:subject>
<sem:predicate>http://www.w3.org/2003/01/geo/wgs84_pos#lat</sem:predicate>
<sem:object datatype="http://www.w3.org/2001/XMLSchema#string">40.41476</sem:object>
</sem:triple>
<sem:triple>
<sem:subject>http://sws.geonames.org/2736540/</sem:subject>
<sem:predicate>http://www.w3.org/2003/01/geo/wgs84_pos#long</sem:predicate>
<sem:object datatype="http://www.w3.org/2001/XMLSchema#string">-8.54304</sem:object>
</sem:triple>

I am able to do a SPARQL DESCRIBE and see data. Here is an example.

@prefix geonames: <http://www.geonames.org/ontology#> .
@prefix xs: <http://www.w3.org/2001/XMLSchema#> .
@prefix p0: <http://www.w3.org/2003/01/geo/wgs84_pos#> .
<http://sws.geonames.org/2736540/> geonames:parentCountry <http://sws.geonames.org/2264397/> ;
                                   geonames:countryCode "PT"^^xs:string ;
                                   p0:long "-8.54304"^^xs:string ;
                                   geonames:featureCode <http://www.geonames.org/ontology#P.PPL> ;
                                   geonames:parentADM1 <http://sws.geonames.org/2742610/> ;
                                   geonames:parentFeature <http://sws.geonames.org/2742610/> ;
                                   <http://www.w3.org/2000/01/rdf-schema#isDefinedBy> "http://sws.geonames.org/2736540/about.rdf"^^xs:string ;
                                   a geonames:Feature ;
                                   geonames:locationMap <http://www.geonames.org/2736540/pedreira-de-vilarinho.html> ;
                                   geonames:name "Pedreira de Vilarinho"^^xs:string ;
                                   geonames:nearbyFeatures <http://sws.geonames.org/2736540/nearby.rdf> ;
                                   geonames:featureClass geonames:P ;
                                   p0:lat "40.41476"^^xs:string .

I want to query over this data using SPARQL QUERY as my Query Type in a way where I can take advantage of the geospatial indexes that MarkLogic can create.

I have been having trouble with two aspects of this.

  1. How to correctly create the geospatial indexes for the wgs84_pos#lat and wgs84_pos#long predicates?
  2. How do I access those indexes from SPARQL QUERY?

I would like to have a sparql query that would be able to find subjects within some range of a Point.

=====================================

Followup:

After following David Ennis's Answer (Which worked nicely, thanks!) I ended up with this sample Xquery that was able to select data out of documents via geosearch and then use those IRI's in a sparql values query.

Example:

xquery version "1.0-ml";
import module namespace sem = "http://marklogic.com/semantics"
       at "/MarkLogic/semantics.xqy";

let $matches := cts:search(//rdf:RDF,
  cts:element-pair-geospatial-query (
    fn:QName("http://www.geonames.org/ontology#","Feature"),
    fn:QName("http://www.w3.org/2003/01/geo/wgs84_pos#", "lat"),
    fn:QName ("http://www.w3.org/2003/01/geo/wgs84_pos#","long"),
    cts:circle(10, cts:point(19.8,99.8))))

let $iris := sem:iri($matches//@rdf:about)

let $bindings := (fn:map(function($n) { map:entry("featureIRI", $n) }, $iris))

let $sparql := '
  PREFIX wgs: <http://www.w3.org/2003/01/geo/wgs84_pos#>
  SELECT *
  WHERE {
    ?featureIRI wgs:lat ?lat;
                wgs:long ?long.
  }
'

return sem:sparql-values($sparql, $bindings)

This xquery queries the geospatial index, finds matching documents and then selects the IRI in the rdf:about attribute of the xml document. It then maps over all of those IRIs and creates map entries that can be passed in the bindings parameter of the sem:sparql-values function.


回答1:


I do not believe you can do what you want via just native SPARQL. Geospacial queries in any SPARQL implementation are extensions like geoSPARQL, Apache Jena geospacial queries etc.

My suggested approach in MarkLogic:

  1. Insert the geonames subjects into MarkLogic as unmanaged triples (an XML or JSON document with embedded triples for each one)
  2. In the same document, include the geo-spacial data in one of the acceptable MarkLogic formats. This essentially adds geo-spacial metadata to the triple since it is in the same fragment.
  3. Add geo-spacial path-range-indexes for the geospacial data.
  4. Use SPARQL inside of MarkLogic with a cts query restriction.

The Building Blocks for above:

  • Understanding unmanaged triples
  • Understanding Geo-spacial Region Types
  • Understanding Geo-spacial Indexes
  • Understanding Geo-spacial Queries
  • Understanding Semantics with cts search

Another approach to the final query could be the Optic API but I do not see how it would negate the need to do steps 1-3



来源:https://stackoverflow.com/questions/47296551/how-to-create-and-use-geospatial-indexes-in-marklogic-from-sparql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!