SPARQL: как получить метку на доступных языках, если первый вариант недоступен

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

SELECT *
WHERE
{
    ?country wdt:P31 wd:Q6256.
    ?country rdfs:label ?country_name
        FILTER(LANG(?country_name) = 'jbo').
}

ссылка

Как запросить возврат метки на одном из доступных языков, если первый язык не работает?


person CptNemo    schedule 13.07.2016    source источник


Ответы (1)


Во-первых, предпочитайте langMatches для проверки языковые теги. Это особенно важно в вашем случае, поскольку вам может понадобиться, например, метка на английском языке, и langMatches(lang(?label), "en") найдет метку с тегом "en ", или "en-GB", или "en-US" и т. д. Это региональные варианты языка, и langMatches поможет вам их найти.

Обновленное решение на основе комментариев

@svick заметил в комментариях, что исходное решение заканчивается строкой для каждого элемента в декартовом произведении английских имен с неанглийскими именами. Этого можно избежать, используя выбор отдельного. Но есть и лучший способ: просто используйте одну и ту же переменную в двух необязательных; первый проверяет английскую этикетку, а второй проверяет этикетки не на английском языке. Если первое удается, то второе никогда не вызывается. То есть просто сделайте:

select ?country ?label {
   ?country wdt:P31 wd:Q6256 
   optional { 
     ?country rdfs:label ?label
     filter langMatches(lang(?label), "en")
   }
   optional { 
     ?country rdfs:label ?label
   }
}

Другие опции



Оригинальное решение с COALESCE

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

select distinct ?country (coalesce(?enLabel, ?anyLabel) as ?label) {
   ?country wdt:P31 wd:Q6256 
   optional { 
     ?country rdfs:label ?enLabel
     filter langMatches(lang(?enLabel), "en")
   }
   optional { 
     ?country rdfs:label ?anyLabel
   }
}
person Joshua Taylor    schedule 13.07.2016
comment
Мне это не кажется отличным решением. Если метка страны доступна на 270 языках, 3 из которых являются вариантами английского языка, будет возвращено 810 результатов, все из которых содержат одну и ту же метку (поскольку 3 английских одинаковы). Это именно то, что происходит для Канады (добавьте bind (wd:Q16 as ?country) к запросу). - person svick; 14.07.2016
comment
@svick Ах, да, это должно быть выбрать отдельный ... Другой вариант (упомянутый в одном из связанных вопросов / ответов), который, вероятно, так же хорош, - это использовать два параметра, которые связывают одну и ту же переменную. . Я обновил свой ответ лучшим вариантом. - person Joshua Taylor; 14.07.2016