代码之家  ›  专栏  ›  技术社区  ›  WhiteSolstice

三元组的QName(MarkLogic)

  •  0
  • WhiteSolstice  · 技术社区  · 6 年前

    我一直在尝试各种方法从我的三胞胎中获取lat和long QName。我的三重数据的一个例子是

    <?xml  version="1.0" encoding="UTF-8"?>
    <sem:triples xmlns:sem="http://marklogic.com/semantics">
      <sem:triple>
        <sem:subject>http://dbpedia.org/resource/Slantsy</sem:subject>
        <sem:predicate>http://www.w3.org/1999/02/22-rdf-syntax-ns#type</sem:predicate>
        <sem:object>http://www.opengis.net/gml/_Feature</sem:object>
      </sem:triple>
      <sem:triple>
        <sem:subject>http://dbpedia.org/resource/Slantsy</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#double">59.11666666666667</sem:object>
      </sem:triple>
      <sem:triple>
        <sem:subject>http://dbpedia.org/resource/Slantsy</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#double">28.083333333333332</sem:object>
      </sem:triple>
      <sem:triple>
        <sem:subject>http://dbpedia.org/resource/Slantsy</sem:subject>
        <sem:predicate>http://www.georss.org/georss/point</sem:predicate>
        <sem:object xml:lang="en">59.11666666666667 28.083333333333332</sem:object>
      </sem:triple>
    </sem:triples>
    

    SPARQL“描述”的输出

    @prefix xs: <http://www.w3.org/2001/XMLSchema#> .
    @prefix p2: <http://www.w3.org/2003/01/geo/wgs84_pos#> .
    <http://dbpedia.org/resource/Slantsy> <http://www.georss.org/georss/point> "59.11666666666667 28.083333333333332"@en ;
                                          a <http://www.opengis.net/gml/_Feature> ;
                                          p2:long "28.0833333333333"^^xs:double ;
                                          p2:lat "59.1166666666667"^^xs:double .
    

    我在这篇文章中也看到过类似的案例 How to create and use GeoSpatial indexes in Marklogic from Sparql

    fn:QName("http://www.w3.org/2003/01/geo/wgs84_pos#", "lat")
    

    因此,我尝试了类似的方法

    cts:search(/sem:triples,
       cts:element-pair-geospatial-query(
         xs:QName("sem:triples"),
         fn:QName("http://www.w3.org/2001/01/geo/wgs84_pos#", "lat"),
         fn:QName("http://www.w3.org/2001/01/geo/wgs84_pos#", "long"),
         cts:circle(2000, cts:point(59,28)))
    )
    

    但是,我收到了一个空查询,似乎不正确。如有任何建议,将不胜感激。

    ==更新=== 终于按照格特金的建议成功了。地理空间索引是使用路径添加的

    /sem:triples/sem:triple[sem:predicate = 'http://www.georss.org/georss/point']/sem:object
    

    并使用

    cts:search(fn:doc(),
      cts:path-geospatial-query(
      "/sem:triples/sem:triple[sem:predicate = 'http://www.georss.org/georss/point']/sem:object",
      cts:circle(10, cts:point(59,28))
      )
    )
    

    它可以工作并返回正确的结果。

    不过,我也尝试使用

    cts:search(fn:doc()/sem:triples,
      cts:path-geospatial-query(
      "/sem:triple[sem:predicate = 'http://www.georss.org/georss/point']/sem:object",
      cts:circle(10, cts:point(59,28))
      )
    )
    

    尽管我希望这样做,因为我应该使用指定的路径查询每个sem:triples项,以到达特定的lat,long点。我收到了一个空的查询。我理解这里有什么不对吗?

    0 回复  |  直到 6 年前
        1
  •  1
  •   grtjn    6 年前

    如果你能做到这一点就好了,但是不幸的是元素对索引不能这样工作。

    首先,子元素必须是指定祖先的直接子元素,这就是为什么它提到父元素而不是祖先。

    其次,不能以这样的元素值为目标。包含lat和long的元素都是 sem:object 元素。

    sem:triple[sem:predicate = "http://www.georss.org/georss/point"]/sem:object
    

    啊!