如何在Sparql中创建和使用Marklogic中的GeoSpatial索引

时间:2017-11-14 22:48:25

标签: sparql geospatial marklogic

我已使用RDF导入将geonames.org的地理空间数据加载到Marklogic中。

使用查询控制台浏览数据时,我看到数据已加载到xml文档中,如下所示:

<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>

我能够执行SPARQL DESCRIBE并查看数据。这是一个例子。

@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 .

我希望使用SPARQL QUERY作为我的查询类型查询此数据,以便我可以利用MarkLogic可以创建的地理空间索引。

我在这两个方面遇到了麻烦。

  1. 如何正确创建wgs84_pos#lat和wgs84_pos #long谓词的地理空间索引?
  2. 如何从SPARQL QUERY访问这些索引?
  3. 我想有一个sparql查询,可以找到某个Point范围内的主题。

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

    跟进:

    在关注David Ennis的答案之后(感谢很好,谢谢!)我最终得到了这个样本Xquery,它能够通过geosearch从文档中选择数据,然后在sparql中使用这些IRI值查询。

    示例:

    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)
    

    此xquery查询地理空间索引,查找匹配的文档,然后在xml文档的rdf:about属性中选择IRI。 然后映射所有这些IRI并创建可以在sem:sparql-values函数的bindings参数中传递的映射条目。

1 个答案:

答案 0 :(得分:1)

我不相信你可以通过原生SPARQL做你想做的事。任何SPARQL实现中的Geospacial查询都是geoSPARQL,Apache Jena geospacial查询等扩展。

我建议的MarkLogic方法:

  1. 将geonames主题作为非托管三元组插入MarkLogic(一个XML或JSON文档,每个文档都包含三元组)
  2. 在同一文档中,以一种可接受的MarkLogic格式包含地理空间数据。这实质上是为三元组添加了地理空间元数据,因为它位于同一个片段中。
  3. 为地理数据添加地理空间路径范围索引。
  4. 使用带有cts查询限制的MarkLogic内部的SPARQL。
  5. 以上构建基块:

    最终查询的另一种方法可能是Optic API,但我不知道如何否定执行步骤1-3的必要性