#python #sparql #mediawiki #wikidata #mediawiki-api
#python #sparql #mediawiki #викиданные #mediawiki-api
Вопрос:
У меня есть несколько запросов SPARQL для запуска в викиданных на python, и мне нужно получить возвращаемое имя / метку объекта вместо URI. Например, учитывая приведенный ниже фрагмент python:
from qwikidata.sparql import return_sparql_query_results
query_string = """
select ?ent where { ?ent wdt:P31 wd:Q2637056 . ?ent wdt:P2244 ?obj } ORDER BY DESC(?obj)LIMIT 5
"""
res = return_sparql_query_results(query_string)
for row in res["results"]["bindings"]:
print(row["ent"]["value"])
Запросы в исходной форме возвращают URI, но мне нужно получить метку / имя объекта. Как я могу это сделать в Python?
Текущий результат запроса:
http://www.wikidata.org/entity/Q841796
http://www.wikidata.org/entity/Q780047
ПРИМЕЧАНИЕ: у меня нет реального доступа к запросам, поэтому я не могу переписать запросы.
Комментарии:
1. Если вы не можете переписать запросы, как должно быть возможно получить метки? Я имею в виду, хорошо, вы могли бы запустить другой запрос SPARQL — но имеет ли это смысл?
2. @UninformedUser, есть ли другие способы, которые я могу использовать для извлечения меток без перезаписи запроса SPARQL, поскольку у меня нет к нему доступа?
3. Ну, действительно, вам нужно как-то запросить Викиданные. либо выполнив другой запрос SPARQL для получения метки для каждого URI, либо выполнив какой-либо другой запрос, отличный от SPARQL, например
https://www.wikidata.org/wiki/Special:EntityData/Q841796.json
, который возвращает данные JSON, которые фактически содержат запись для меток
Ответ №1:
Мой комментарий был слишком длинным, поэтому я публикую ответ. Вам нужно будет переписать запросы. Пожалуйста, найдите ниже пример, как получить метки без использования службы меток.
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
SELECT ?country ?countryLabel
WHERE
{
# instance of country
?country wdt:P31 wd:Q3624078.
OPTIONAL {
?country rdfs:label ?countryLabel filter (lang(?countryLabel) = "en").
}
}
ORDER BY ?countryLabel
<a rel="noreferrer noopener nofollow" href="https://query.wikidata.org/#PREFIX rdfs:
PREFIX wd:
PREFIX wdt:
SELECT ?country ?countryLabel
WHERE
{
# instance of country
?country wdt:P31 wd:Q3624078.
OPTIONAL {
?country rdfs:label ?countryLabel filter (lang(?countryLabel) = «en»).
}
}
ORDER BY ?countryLabel» rel=»nofollow noreferrer»>попробуйте!
Адаптировано для вашего примера Союз-Т:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
SELECT ?ent ?entLabel
WHERE
{
# instance of Soyuz-T https://www.wikidata.org/wiki/Q2637056
?ent wdt:P31 wd:Q2637056 .
# https://www.wikidata.org/wiki/Property:P2244 periapsis
?ent wdt:P2244 ?obj
OPTIONAL {
?ent rdfs:label ?entLabel filter (lang(?entLabel) = "en").
}
} ORDER BY DESC(?obj)LIMIT 5
<a rel="noreferrer noopener nofollow" href="https://query.wikidata.org/#PREFIX rdfs:
PREFIX wd:
PREFIX wdt:
SELECT ?ent ?entLabel
WHERE
{
# instance of Soyuz-T https://www.wikidata.org/wiki/Q2637056
?ent wdt:P31 wd:Q2637056 .
# https://www.wikidata.org/wiki/Property:P2244 periapsis
?ent wdt:P2244 ?obj
OPTIONAL {
?ent rdfs:label ?entLabel filter (lang(?entLabel) = «en»).
}
} ORDER BY DESC(?obj)LIMIT 5 » rel=»nofollow noreferrer»>попробуйте!
Результат:
ent entLabel
wd:Q841796 Soyuz T-15
wd:Q780047 Soyuz T-8