QName для троек (MarkLogic) - PullRequest
       20

QName для троек (MarkLogic)

0 голосов
/ 19 февраля 2019

Я пытался различными способами получить доступ к 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 "DESCRIBE"

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

Я видел похожий случай в этой теме Как создавать и использовать индексы GeoSpatialв Marklogic из Sparql

, где к Qname обращались с использованием

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

Однако я получилпустой запрос, который не кажется правильным.Буду признателен за любой совет. Спасибо.

=== Обновление === Наконец-то он заработал, как было предложено grtjin.Геопространственный индекс был добавлен с использованием пути

/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, используя путь, указанный для достижения определенной широты и долготы.Вместо этого я получил пустой запрос.Я здесь что-то не так понимаю?

1 Ответ

0 голосов
/ 19 февраля 2019

Было бы неплохо, если бы вы могли это сделать, но индекс пары элементов, к сожалению, не работает таким образом.

Во-первых, дочерние элементы должны быть прямыми потомками указанного предка, поэтомуговорит о родителе, а не о предке.

Во-вторых, вы не можете ориентироваться на значения элементов, подобные этому.Элементы, содержащие значения lat и long, являются элементами sem:object.

Я бы предложил вместо этого использовать индекс геопространственного пути для чего-то, что содержит точку, и у вас это есть.Это как ссылка на путь должна работать, я думаю:

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

HTH!

...