SPARQL Запрос транзитивных различных версий arq - PullRequest
3 голосов
/ 21 января 2012

В основном я получил запрос SPARQL ниже, который работает с arq 2.8.8, но не работает с arq2.8.4, так как он не распознает символ +.Я действительно хочу запрос, который может работать на версии arq 2.8.4, который похож на тот, который я опубликовал.Запрос, который я разместил, в основном находит все элементы, которые одинаковы друг с другом.Например, если a - это то же самое, что и b, а b - это то же самое, что и c, запрос возвращает b и c для a.

PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT * WHERE { ?x owl:sameas+ ?y }

1 Ответ

3 голосов
/ 22 января 2012

Используемая вами функция - SPARQL 1.1, поэтому она не поддерживалась в более ранних версиях ARQ. Единственный способ написать запрос, близкий к тому, что вы делаете, - это выполнить одно из следующих действий.

Объединение путей разной длины

PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT *
WHERE
{
  { ?x owl:sameAs ?y }
  UNION
  { ?s owl:sameAs [ owl:sameAs ?y ] . }
  UNION
  { ?s owl:sameAs [ owl:sameAs [ owl:sameAs ?y ] ] . }
  # Repeat the above pattern up to whatever limit you want
}

Использовать код на стороне клиента

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

PREFIX owl: <http://www.w3.org/2002/07/owl#> 
SELECT * WHERE { ?x owl:sameAs ?y }

Составьте список ?y значений, затем для каждого значения выдайте запрос вида:

PREFIX owl: <http://www.w3.org/2002/07/owl#> 
SELECT * WHERE { <constant> owl:sameAs ?y }

Где вы подставляете <constant> одно из значений из списка каждый раз, а затем добавляете новые значения ?y в список.

Единственное, с чем вам следует быть осторожным при таком подходе, это отслеживать значения, для которых вы уже выполнили второй запрос, чтобы сохранить повторяющиеся запросы.

...