Шаблон запроса SPARQL с языковыми фильтрами - PullRequest
1 голос
/ 19 июня 2019

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

SELECT distinct ?s ?p ?o WHERE {      
  ?this :is :something. // this pattern is passed as argument 
                        // to the js func that manage the 
                        // query
  {
   bind(?this as ?s)
   ?s ?p ?o.       
   // here i putted my filters
  }
}

Фильтр, который я хочу добавить, должен обеспечивать способ возврата только «английской версии» для шаблонов с литералами. если английская версия не указана, верните непомеченную - всегда есть непомеченная.

Основываясь на решениях для подобных вопросов, я попытался с этим:

filter(!isLiteral(?o) || (langMatches(lang(?o), 'en')) || lang(?o)='')

но - конечно же - в итоге возвращаются и английские, и непомеченные литералы.

Другим способом, который решил проблему для кого-то, является использование двух OPTIONAL паттернов, таких как здесь :

optional { 
  ?country rdfs:label ?label
  filter langMatches(lang(?label), "en")
}
optional { 
  ?country rdfs:label ?label
}

но у меня есть шаблон ?s ?p ?o в моем шаблоне, который уже возвращает все тройки, связанные с конкретным объектом, тогда дополнительные шаблоны здесь кажутся бесполезными.

Я читал другие вопросы, подобные этим, но, похоже, никто не подходит к моему шаблону запроса, поэтому, если кто-то может помочь мне понять это, я буду благодарен.

1 Ответ

1 голос
/ 20 июня 2019

Если я правильно истолковываю ваш вопрос, это можно сделать, используя один FILTER с несколькими расхождениями, упорядоченными в порядке предпочтения, например:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
select * where { 
    bind(skos:member as ?s)
        ?s ?p ?o .
        filter (
            !isLiteral(?o) ||
            langmatches(lang(?o), "en") 
            || (langmatches(lang(?o), "") && not exists {
                    ?s ?p ?other. 
                    filter(isLiteral(?other) && langmatches(lang(?other), "en")) 
                }))

} 
  • , он пройдет для любогонелитеральное значение bount ot ?o
  • , затем для литералов с языковым тегом, которые соответствуют @en
  • и, наконец, литералы без языкового тега, для которых нет оператора с тем же предметоми предикат, который имеет литерал с @en tag

HTH

, использование skos:member в приведенном выше запросе просто для привязки чего-либо к ?s иэто произвол ...

...