如何从Sparql在Marklogic中创建和使用地理空间索引

如何从Sparql在Marklogic中创建和使用地理空间索引,sparql,geospatial,marklogic,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:predic

我已经使用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>

http://sws.geonames.org/2736540/
http://www.w3.org/2003/01/geo/wgs84_pos#lat
40.41476
http://sws.geonames.org/2736540/
http://www.w3.org/2003/01/geo/wgs84_pos#long
-8.54304
我能够做SPARQL描述和查看数据。这里有一个例子

@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 .
@前缀geonames:。
@前缀xs:。
@前缀p0:。
地理名称:母国;
地理名称:国家代码“PT”^^xs:string;
p0:long“-8.54304”^^xs:string;
地理名称:特征代码;
地理名称:parentADM1;
地理名称:父特征;
"http://sws.geonames.org/2736540/about.rdf“^^xs:string;
a地理名称:特征;
地理名称:位置图;
地理名称:名称“Pedreira de Vilarinho”^^xs:string;
地理名称:近距离特征;
地理名称:featureClass地理名称:P;
p0:lat“40.41476”^^xs:string。
我想使用SPARQL查询作为我的查询类型来查询这些数据,这样我就可以利用MarkLogic可以创建的地理空间索引

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

  • 如何正确创建wgs84_pos#lat和wgs84_pos#long谓词的地理空间索引
  • 如何从SPARQL查询访问这些索引
  • 我希望有一个sparql查询,能够在某个点的某个范围内找到主题

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

    后续行动:

    在遵循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版本“1.0-ml”;
    导入模块命名空间sem=”http://marklogic.com/semantics"
    位于“/MarkLogic/semantics.xqy”;
    让$matches:=cts:search(//rdf:rdf,
    cts:元素对地理空间查询(
    fn:QName(“http://www.geonames.org/ontology#“,“功能”),
    fn:QName(“http://www.w3.org/2003/01/geo/wgs84_pos#“,“lat”),
    fn:QName(“http://www.w3.org/2003/01/geo/wgs84_pos#“,”长“),
    电流互感器:圆(10,电流互感器:点(19.8,99.8)))
    let$iris:=sem:iri($matches/@rdf:about)
    让$bindings:=(fn:map(函数($n){map:entry(“featureIRI”,$n)},$iris))
    让$sparql:='
    前缀wgs:
    挑选*
    在哪里{
    ?特征:纬度?纬度;
    长?长。
    }
    '
    返回sem:sparql值($sparql,$bindings)
    
    此xquery查询地理空间索引,查找匹配的文档,然后在xml文档的
    rdf:about
    属性中选择IRI。
    然后,它映射到所有这些IRI,并创建映射条目,这些条目可以在
    sem:sparql values
    函数的bindings参数中传递。

    我不相信您可以仅通过本机sparql来做您想做的事情。任何SPARQL实现中的Geospacial查询都是geoSPARQL、ApacheJena Geospacial查询等扩展

    我建议的MarkLogic方法:

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

    • 理解力
    • 理解力
    • 理解力
    • 理解力
    • 理解力

    最终查询的另一种方法可能是,但我不认为它会否定执行步骤1-3的必要性

    谢谢,这让我走上了一条我认为对我有用的道路!我很高兴他的帮助。很好地将这对元素用于索引。。但是,请确保你确实在你需要的地方。您是否仍在使用MarkLogic的XML文档(我认为每个文档有100个三元组),或者您是否制作了自己的文档—每个实体有一个文档和所有相关的三元组。依赖MarkLogic的三元组xml文档可能无法保证正确的三元组在正确的xml文档中。我创建的新xml文档中没有三元组。所以我有两份数据。一个是xml文档,一个是marklogic创建的三元组文档(托管三元组)。根据您的用例,它们不需要在标记逻辑中分开。