SPARQL Querying Transitive для разных версий arq

По сути, я получил приведенный ниже запрос 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 }

person Sam    schedule 21.01.2012    source источник


Ответы (1)


Вы используете функцию 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 в список.

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

person RobV    schedule 21.01.2012