Возвращать весь XML-документ & amp; doc-uri со встроенными тройками с использованием Sparql

использовать

$(window).width()

или

$(document).width()

или

$('body').width()
1
задан Aries On The Cusp 13 July 2018 в 23:00
поделиться

3 ответа

Я решил это сам, сделав так. Надеюсь, это поможет кому-то другому. Мне потребовалось более 5 часов чтения документации MarkLogic. Я думаю, теперь у меня есть хорошая ручка. Я не уверен, что это самый быстрый способ, но он принял только 93ms

for $id in  sem:query-results-serialize(  $rez  , 'xml')//s:uri/text()
          return   
  xdmp:node-uri( (cts:search(/blah//sem:triple/*[text() = $id ]  , ()))[1]    ) 
0
ответ дан Aries On The Cusp 17 August 2018 в 12:07
поделиться
  • 1
    Было бы гораздо эффективнее использовать cts: search (doc (), cts: element-value-query (xs: QName («sem: subject»), $ id), «нефильтрованный»). Вы можете развернуть cts: element-value-query в cts: or-query для охвата объекта, предиката и объекта, если это необходимо. – Rob S. 15 July 2018 в 03:28
  • 2
    Я думал, что использовать какое-то выражение xpath, поскольку первый параметр будет быстрее, так как я указываю корневой узел документа (фильтруя набор возможных документов). Это неправильно? – Aries On The Cusp 15 July 2018 в 05:58
  • 3
    Указание корневого узла документа может быть быстрым, но в большинстве случаев, когда он исключает большинство документов. В большинстве случаев // на самом деле дорогой. XPath также может принудительно фильтровать результаты для применения упорядочивания документов, хотя и не совсем уверен, что это также касается путей поиска. Как правило, на производительность влияют многие факторы. Лучше всего измерять и продолжать измерять. – grtjn 16 July 2018 в 07:22

Рассмотрим использование cts:triple-range-query . Его можно использовать в cts:search напрямую и вставить в ваш другой запрос. Это позволяет искать только отдельные троики, хотя ваш пример довольно прост.

Чтобы найти все отчеты AP Newswire и BBC, рассказывающие о посещающих страны Никсона:

query version "1.0-ml";

for $doc in cts:search(
  collection(),
  cts:and-query( (
    cts:element-value-query( xs:QName("source"), ("AP Newswire", "BBC") ),
    cts:triple-range-query(
      sem:iri("http://example.org/news/Nixon"),
      sem:iri("http://example.org/wentTo"),
      ()
    )
  ) )
)[1 to 10]
return (xdmp:node-uri($doc), $doc)

Вы также можете предварительно -execute SPARQL сначала разрешить более сложные запросы SPARQL и передать результат в cts: search с трехдиапазонным запросом. Например: найти все отчеты о конкретных странах, которые посетил Никсон (как сообщается AP Newswire и BBC):

let $countries := sem:sparql('
  SELECT DISTINCT ?country
  WHERE {
    <http://example.org/news/Nixon> <http://example.org/wentTo> ?country
  }
  ',
  (),
  (),
  cts:element-value-query( xs:QName("source"), ("AP Newswire", "BBC") )
) ! map:get(., "country")

for $doc in cts:search(
  collection(),
  cts:triple-range-query(
    sem:iri("http://example.org/news/Nixon"),
    sem:iri("http://example.org/wentTo"),
    $country[1 to 3]
  )
)[1 to 10]
return (xdmp:node-uri($doc), $doc)

Обратите внимание на тонкие различия между двумя приведенными выше примерами.

НТН!

0
ответ дан grtjn 17 August 2018 в 12:07
поделиться
  • 1
    Спасибо, мои запросы SPARQL более сложны, чем тот, который я дал, поэтому я могу попробовать ваш пример с предварительно выполненным запросом. Похоже, что у MarkLogic уже есть документ, когда он выполняет cts: element-value-query () в запросе SPARQL, поэтому дополнительный cts: поиск кажется мне странным. Я хочу, чтобы был способ извлечь узел-uri, когда у него уже есть документ – Aries On The Cusp 17 July 2018 в 17:44
  • 2
    Во время SPARQL существует некоторая осведомленность о доке, но поскольку одна и та же тройка может происходить из нескольких документов, информация о доке теряется в возвращаемых sem-привязках. Следовательно, двойной проход, но поскольку он решает из индексов, вы почти не замечаете. – grtjn 17 July 2018 в 17:49
  • 3
    Небольшое дополнение к моему последнему комментарию: cts: элемент-значение-запрос не разрешен, потянув за фактический документ, он разрешен из так называемого Universal Index. MarkLogic пытается как можно больше разрешить индексы, содержащие ссылки на фрагменты документа. Фактические документы не извлекаются до тех пор, пока не будут использованы или возвращены данные внутри. Это откладывается до конца [1 to 10] в моих примерах. – grtjn 17 July 2018 в 21:29

Может быть более чистый способ (с меньшим количеством кастингов), но я так делал это раньше в XQuery:

xquery version "1.0-ml"; 

import module namespace sem = "http://marklogic.com/semantics" 
      at "/MarkLogic/semantics.xqy";

let $triples := sem:sparql('
SELECT *
WHERE
{ ?subject ?predicate ?object }
')

return sem:database-nodes($triples ! sem:triple(map:get(., "subject"), map:get(., "predicate"), map:get(., "object"))) ! fn:base-uri(.)
0
ответ дан Rob S. 17 August 2018 в 12:07
поделиться
  • 1
    Интересно. Это работает, только если у вас есть предмет, предикат и объект, хотя верно? Если я выбираю только тему, например, я не уверен, что она сможет получить узлы базы данных – Aries On The Cusp 14 July 2018 в 00:05
  • 2
    @AriesOnTheCusp Да, насколько я знаю, вам нужен полный sem: triple object для sem: database-nodes. Однако, это не должно быть сложно построить, поскольку вы указали недостающий объект и предикат в своем запросе. Кроме того, вы можете включить свой URI вашего документа в свои тройки и связать другие троек с ним, чтобы вы могли понять это в SPARQL. – Rob S. 14 July 2018 в 12:47
Другие вопросы по тегам:

Похожие вопросы: