Во-первых, предпочитайте 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