SPARQL выберите опционально с языком

У меня есть несколько троек, которые выглядят так:

test:thing rdfs:label "Non-Language Label"
test:thing rdfs:label "English Label"@en
test:thing rdfs:label "French Label"@fr

Я хотел бы сформировать запрос sparql, который дает мне «Неязыковую метку» И «Французскую метку», если таковая существует.

Я пробовал это, и это не работает:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel
WHERE {
   test:thing rdfs:label ?label 
   OPTIONAL {
     test:thing rdfs:label ?preferredLabel . 
     FILTER (regex(str(?preferredLabel), '(^|\\\\W)fr', 'i'))
   }
}

Заранее спасибо!


person Devin McQueeney    schedule 29.10.2011    source источник


Ответы (2)


Я не понимаю, зачем тебе здесь OPTIONAL. Запрос Яна терпит неудачу, потому что между внешним шаблоном и дополнительным шаблоном нет общей переменной, поэтому вы пытаетесь вычислить перекрестное произведение каждой метки для test:thing с каждой не / французской меткой test:thing, которая может быть огромной, и почему обработчик запросов дает сбой.

Вам просто нужно что-то вроде следующего, если я не понял ваш вопрос неправильно

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label
WHERE 
{
   test:thing rdfs:label ?label 
   FILTER(LANG(?label) = "" || LANGMATCHES(LANG(?label), "fr"))
}

Если вам нужны две метки отдельно, вы можете сделать что-то вроде:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT ?label ?preferredLabel
WHERE 
{
  {
   test:thing rdfs:label ?label . FILTER(LANG(?label) = "")
  }
  UNION
  {
   test:thing rdfs:label ?preferredLabel . FILTER(LANGMATCHES(LANG(?label), "fr"))
  }
}
person RobV    schedule 29.10.2011

Самый простой способ проверить язык литералов - использовать функцию lang (). Используя это, ваш запрос может быть записан как:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX test: <http://test#> 
SELECT ?label ?preferredLabel 
WHERE { 
   test:thing rdfs:label ?label 
   OPTIONAL { 
     test:thing rdfs:label ?preferredLabel . 
     FILTER (lang(?preferredLabel) = "" || lang(?preferredLabel) = "fr") 
   } 
}
person Jan    schedule 29.10.2011
comment
Привет - спасибо за помощь. Вы правы, добавляя где-то логику фильтрации, и это выглядит хорошо. Этот запрос просто ошибся для меня. Я думаю, что проблема начинается с того, что я дважды выбираю одни и те же данные (как? Label и как? ПредпочтительныйLabel). Я бы хотел, чтобы метки «?» И «предпочтительные метки» были в одной записи. Я был немного озадачен этим - казалось бы простым, но не так уж и много! Спасибо за помощь - person Devin McQueeney; 29.10.2011