Как фильтровать объекты по свойствам в Викиданных с помощью SPARQL?

Я не могу найти способ фильтровать объекты по имени. Например, этот запрос должен ограничивать объекты страны только теми, у кого официальное название «Канада»:

SELECT DISTINCT ?country ?official_name WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en,fr". }
  ?country wdt:P31 wd:Q6256.
  ?country wdt:P1448 ?official_name.
  ?country wdt:P1448 "Canada".
}
LIMIT 100

Здесь находится прямая ссылка на запрос.

Любые идеи?


person Onkeltem    schedule 25.09.2018    source источник
comment
отсутствует языковой тег: ?country wdt:P1448 "Canada"@en.   -  person UninformedUser    schedule 25.09.2018
comment
@AKSW: это действительно работает и возвращает две строки. Знаете ли вы, почему FILTER (?official_name="Canada"@en) , а также VALUES ?official_name {"Canada"} возвращают только одну запись (вместо строки ?country wdt:P1448 "Canada"@en)?   -  person Cleb    schedule 25.09.2018
comment
@Cleb, имена на английском и французском языках являются официальными. "Canada"@en один из них, есть еще "Canada"@fr.   -  person Stanislav Kralin    schedule 25.09.2018
comment
И, вероятно, вы могли бы использовать другое свойство, а не P1448 из-за проблем с качеством данных. Однако значение P1488 должно быть на исходном языке этого региона, см. . грамм. Q159   -  person Stanislav Kralin    schedule 25.09.2018
comment
@StanislavKralin: Как же тогда получить их оба, не используя части @en и @fr, используя VALUES?   -  person Cleb    schedule 25.09.2018
comment
@Клеб, filter(str(?official_name) = "Canada")?   -  person Stanislav Kralin    schedule 25.09.2018
comment
@StanislavKralin: Да, это работает. Есть ли вариант с использованием VALUES? Это будет работать, но тогда нужно указать часть @: VALUES ?official_name {"Canada"@en "Canada"@fr}.   -  person Cleb    schedule 25.09.2018
comment
@Клеб, values (?official_name_str) {("Canada")} ... filter(str(?official_name)=?official_name_str)?   -  person Stanislav Kralin    schedule 25.09.2018
comment
@StanislavKralin: Это работает, спасибо. Вероятно, менее эффективна, чем просто версия filter, но просто любопытно с технической точки зрения.   -  person Cleb    schedule 25.09.2018


Ответы (1)


Зная, как обстоят дела, вы, вероятно, будете более довольны этим несколько нечетким фильтром, чем тестом на точное совпадение... но вы можете изменить filter ( contains (str(?official_name), "Canada") ) ниже на filter ( str(?official_name) = "Canada")

SELECT DISTINCT ?country ?official_name WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en,fr". }
  ?country wdt:P31 wd:Q6256.
  ?country wdt:P1448 ?official_name.
# ?country wdt:P1448 "Canada".
  filter ( contains (str(?official_name), "Canada") )
}
LIMIT 100
person TallTed    schedule 25.09.2018