Эквивалентны ли эти два запроса SPARQL 1.0? - PullRequest
0 голосов
/ 18 июня 2020

Я запрашиваю тройное хранилище Mulgara с помощью следующих двух запросов, пытаясь вернуть предметы, которые не соответствуют определенным значениям. Я ограничен теми частями SPARQL 1.0, которые реализует Mulgara, и мне любопытно, являются ли эти два запроса фактически одинаковыми или есть различия в поведении, которых я не вижу в своих результатах.

Заранее благодарим за ваше время и помощь.

Запрос 1:

PREFIX fedora-model:        <info:fedora/fedora-system:def/model#>
PREFIX fedora-rels-ext: <info:fedora/fedora-system:def/relations-external#>

SELECT ?pids
FROM <#ri>
WHERE {
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp_large_image_cmodel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:bookCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:collectionCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:compoundCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp-audioCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp_videoCModel> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp_basic_image> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:sp_pdf> }
    UNION
    { ?pids fedora-model:hasModel <info:fedora/islandora:oralhistoriesCModel> }
}

и запрос 2:

PREFIX fedora-model:     <info:fedora/fedora-system:def/model#>
PREFIX fedora-rels-ext:  <info:fedora/fedora-system:def/relations-external#>

SELECT ?pids
FROM <#ri>
WHERE {
  ?pids fedora-model:hasModel ?models .
  FILTER (!regex(str(?models), "pageCModel") &&
          !regex(str(?models), "FedoraObject-3.0") &&
          !regex(str(?models), "transformCModel") &&
          !regex(str(?models), "ContentModel-3.0")) .
}

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

В общем, нет, они не эквивалентны. Некоторые из причин, по которым нужно включать:

  • Первый имеет явный список значений модели, чтобы включать , тогда как последний пытается исключить значения. В зависимости от данных, два запроса могут возвращать очень разные результаты
  • Последний запрос использует REGEX для строкового значения? Models, но не:
    • проверяет, что значения? Models - это IRI (например, это может быть литерал, удовлетворяющий условиям фильтра)
    • убедитесь, что REGEX совпадает с концом строки (я предполагаю, что это намерение)

И, как уже упоминалось в комментарии выше, использование REGEX, вероятно, также окажет значительное влияние на производительность запроса.

0 голосов
/ 19 июня 2020

Единственный способ узнать наверняка, эквивалентны ли запросы, - это запустить «исследовательские» запросы.

Вот запрос, чтобы узнать все модели:

SELECT distinct ?models FROM <#ri> WHERE 
{ ?pids fedora-model:hasModel ?models}

С этим у вас будут все модели. Затем вы сможете узнать, не указаны ли другие модели.

Альтернативой использованию '=' является использование функции sameTerm. Функция sameTerm работает с IRI, тогда как '=' сравнивает и строки, и литералы. Использование sameTerm дает немного лучшее время отклика.

PREFIX fedora-model:     <info:fedora/fedora-system:def/model#>
PREFIX fedora-rels-ext:  <info:fedora/fedora-system:def/relations-external#>
SELECT ?pids
FROM <#ri>
WHERE {
  ?pids fedora-model:hasModel ?models .
  FILTER (!sameTerm(?models, <info:fedora/islandora:pageCModel> ) &&
          !sameTerm(?models, <info:fedora/islandora:pageCModel> )) 
}
...