wd_book_ru_2024.pdf
Для углублённого изучения работы с Викиданными и построения SPARQL-запросов рекомендую следующие ресурсы:
Курс «Программирование Викиданных» в Русском Викиверситете
Официальная страница примеров SPARQL-запросов в Викиданных
Учебник «Программирование Викиданных» (PDF)
Как выбрать объект и свойства для SPARQL-запроса?
Если нужна помощь с конкретным запросом или объектом — уточните, и я помогу сформулировать запрос!
Для исследования связей между странами, мультфильмами и студиями мультфильмов в Викиданных можно использовать следующие подходы и SPARQL-скрипты:
Объекты Викиданных:
sqlSELECT ?country ?countryLabel (COUNT(?film) AS ?filmCount) WHERE { ?film wdt:P31 wd:Q11424 ; # Экземпляры мультфильмов wdt:P495 ?country . # Страна происхождения SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } } GROUP BY ?country ?countryLabel ORDER BY DESC(?filmCount)
Этот запрос покажет, какие страны производят больше всего мультфильмов.
sqlSELECT ?studio ?studioLabel (COUNT(?film) AS ?filmCount) WHERE { ?film wdt:P31 wd:Q11424 ; # Экземпляры мультфильмов wdt:P272 ?studio . # Производственная компания SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } } GROUP BY ?studio ?studioLabel ORDER BY DESC(?filmCount)
Этот запрос выведет студии, которые произвели наибольшее количество мультфильмов.
sqlSELECT ?genre ?genreLabel (COUNT(?film) AS ?filmCount) WHERE { ?film wdt:P31 wd:Q11424 ; # Экземпляры мультфильмов wdt:P136 ?genre . # Жанр мультфильма SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } } GROUP BY ?genre ?genreLabel ORDER BY DESC(?filmCount)
Этот запрос покажет распределение мультфильмов по жанрам.
sqlSELECT ?year (COUNT(?film) AS ?filmCount) WHERE { ?film wdt:P31 wd:Q11424 ; # Экземпляры мультфильмов wdt:P577 ?year . # Год выпуска } GROUP BY ?year ORDER BY ?year
Этот запрос покажет динамику выпуска мультфильмов по годам.
sqlSELECT ?country ?countryLabel ?studio ?studioLabel (COUNT(?film) AS ?filmCount) WHERE { ?film wdt:P31 wd:Q11424 ; # Экземпляры мультфильмов wdt:P495 ?country ; # Страна происхождения wdt:P272 ?studio . # Производственная компания SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } } GROUP BY ?country ?countryLabel ?studio ?studioLabel ORDER BY ?countryLabel DESC(?filmCount)
Этот запрос покажет, какие студии наиболее активны в каждой стране.
sqlSELECT ?film ?filmLabel ?studio ?studioLabel WHERE { ?film wdt:P31 wd:Q11424 ; # Экземпляры мультфильмов wdt:P577 "2020-01-01"^^xsd:date ; # Год выпуска wdt:P272 ?studio . # Производственная компания SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } }
Этот запрос выведет мультфильмы, выпущенные в 2020 году, и студии, их выпустившие.
sqlSELECT ?film ?filmLabel ?award ?awardLabel WHERE { ?film wdt:P31 wd:Q11424 ; # Экземпляры мультфильмов wdt:P166 ?award . # Награда SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } }
Этот запрос покажет мультфильмы, которые получили какие-либо награды.
Результаты запросов можно визуализировать с помощью:
Если нужна помощь с конкретным запросом или визуализацией — дайте знать!
Вот SPARQL-запрос, который соберёт мультфильмы с указанными свойствами: жанр, страна происхождения и продолжительность:
sqlSELECT ?film ?filmLabel ?genreLabel ?countryLabel ?duration WHERE { ?film wdt:P31 wd:Q202866 ; # Экземпляры мультфильмов (Q202866) wdt:P136 ?genre ; # Жанр мультфильма wdt:P495 ?country ; # Страна происхождения wdt:P2047 ?duration . # Продолжительность (в минутах) SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } }
Этот запрос вернёт таблицу с мультфильмами, в которой будут указаны:
filmLabel)genreLabel)countryLabel)duration)Для анализа географии жанров и взаимосвязи жанра и продолжительности можно использовать следующие подходы:
География жанров:
Взаимосвязь жанра и продолжительности:
Если нужно выгрузить данные в CSV для дальнейшего анализа, добавьте в конец запроса:
sql#defaultView:Table
Или используйте опцию "Download as CSV" в интерфейсе Wikidata Query Service.
Вот SPARQL-запрос, который соберёт данные о доходах и затратах на мультфильмы:
sqlSELECT DISTINCT ?film ?filmLabel ?genreLabel ?countryLabel ?duration ?revenue ?capital_cost WHERE { ?film wdt:P31 wd:Q202866 ; # Экземпляры мультфильмов (Q202866) wdt:P136 ?genre ; # Жанр мультфильма wdt:P495 ?country ; # Страна происхождения wdt:P2047 ?duration . # Продолжительность (в минутах) OPTIONAL { ?film wdt:P2139 ?revenue } # Доход с мультфильма (box office) OPTIONAL { ?film wdt:P2130 ?capital_cost } # Затраты на мультфильм (budget) SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } }
Комментарии к запросу:
Добавлены свойства:
wdt:P2139 — доход с мультфильма (box office)wdt:P2130 — затраты на производство (budget)OPTIONAL используется, так как не все мультфильмы имеют указанные финансовые данные.
DISTINCT убирает дубликаты, но если нужно сохранить все записи (например, для анализа по жанрам/странам), можно убрать эту строку.
Пример анализа:
Если нужно выгрузить данные в CSV, добавьте в конец запроса:
sql#defaultView:Table
Или используйте опцию "Download as CSV" в интерфейсе Wikidata Query Service.
Вот SPARQL-запрос, который соберёт мультфильмы с обязательными свойствами: жанр, страна происхождения, продолжительность, доход и затраты:
sqlSELECT DISTINCT ?film ?filmLabel ?genreLabel ?countryLabel ?duration ?revenue ?capital_cost WHERE { ?film wdt:P31 wd:Q202866 ; # Экземпляры мультфильмов (Q202866) wdt:P136 ?genre ; # Жанр мультфильма wdt:P495 ?country ; # Страна происхождения wdt:P2047 ?duration ; # Продолжительность (в минутах) wdt:P2139 ?revenue ; # Доход с мультфильма (box office) wdt:P2130 ?capital_cost. # Затраты на мультфильм (budget) SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } }
Этот запрос вернёт только те мультфильмы, для которых указаны все пять свойств.
Вот исправленный SPARQL-запрос, который вернёт список мультфильмов с затратами, при этом гарантируя, что у каждого мультфильма указаны жанр, страна и продолжительность:
sqlSELECT DISTINCT ?film ?filmLabel ?capital_cost WHERE { ?film wdt:P31 wd:Q202866 ; # Экземпляры мультфильмов (Q202866) wdt:P136 ?genre ; # Жанр мультфильма (обязательно) wdt:P495 ?country ; # Страна происхождения (обязательно) wdt:P2047 ?duration; # Продолжительность (в минутах, обязательно) wdt:P2130 ?capital_cost. # Затраты на мультфильм (budget) SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" } }
Что изменилось:
?genreLabel, ?countryLabel, ?duration и ?revenue из SELECT, так как они не нужны в выводе.?film, ?filmLabel и ?capital_cost для краткости.Этот запрос вернёт короткий список мультфильмов с их затратами, при этом гарантируя, что у каждого мультфильма есть все три свойства.
Here is a detailed summary of the topics discussed in this dialogue and the solutions we arrived at:
Topics Covered:
Solutions:
sqlSELECT DISTINCT ?film ?filmLabel ?capital_cost WHERE { ?film wdt:P31 wd:Q202866 ; wdt:P136 ?genre ; wdt:P495 ?country ; wdt:P2047
На русском: Получает список анимационных телесериалов с указанием страны и рейтинга РАРС (если доступен).
On English: Retrieves a list of animated TV series with country and RARS rating (if available).
Вот модифицированный SPARQL-запрос, который учитывает ваши требования:
sqlSELECT ?aircraft ?aircraftLabel ?engine ?engineLabel ?maxAltitude ?payloadMass ?totalProduced WHERE { VALUES ?aircraftType { wd:Q15056993 wd:Q1928655 } # Семейство самолётов или модель самолёта ?aircraft wdt:P31/wdt:P279* ?aircraftType; wdt:P516 ?engine; # Двигатель (powered by) wdt:P1092 ?totalProduced. # Количество произведённых самолётов (total produced) OPTIONAL { ?aircraft wdt:P2249 ?maxAltitude. } # Максимальная высота (опционально) OPTIONAL { ?aircraft wdt:P2248 ?payloadMass. } # Полезная нагрузка (опционально) SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". } } ORDER BY DESC(?totalProduced)
Изменения:
VALUES ?aircraftType { wd:Q15056993 wd:Q1928655 } для поиска экземпляров как "семейства самолётов" (Q15056993), так и "модели самолёта" (Q1928655).?maxAltitude и ?payloadMass сделаны опциональными с помощью OPTIONAL.?payloadMass (полезная нагрузка) в SELECT и OPTIONAL.Вот преобразованный SPARQL-запрос с опциональными свойствами:
sqlSELECT DISTINCT ?park ?parkLabel ?country ?countryLabel ?area ?inception ?highestPoint ?highestPointLabel ?elevation WHERE { ?park wdt:P31 wd:Q46169; # Национальный парк wdt:P17 ?country; # Страна wdt:P2046 ?area. # Площадь OPTIONAL { ?park wdt:P571 ?inception. } # Дата основания (опционально) OPTIONAL { ?park wdt:P610 ?highestPoint. } # Самая высокая точка (опционально) OPTIONAL { ?park wdt:P2044 ?elevation. } # Высота над уровнем моря (опционально) SERVICE wikibase:label { bd:serviceParam wikibase:language "ru, en" } }
Что изменилось:
wdt:P571 (дата основания), wdt:P610 (самая высокая точка) и wdt:P2044 (высота над уровнем моря) теперь опциональны.OPTIONAL { ... }.wdt:P31 (тип объекта), wdt:P17 (страна) и wdt:P2046 (площадь).
Вот модифицированный SPARQL-запрос, который позволяет получить объекты, являющиеся экземплярами статуи (Q4989906) или других сопутствующих типов (например, mausoleum, shrine, cultural property):
sqlSELECT ?statue ?statueLabel ?height ?creationDate ?countryLabel ?materialLabel ?statueType ?statueTypeLabel WHERE { VALUES ?statueType { wd:Q4989906 wd:Q12459 wd:Q24354 wd:Q179781 } # статуя, мавзолей, святыня, культурное имущество ?statue wdt:P31/wdt:P279* ?statueType; # экземпляр или подкласс любого из указанных типов wdt:P2048 ?height; # Высота (обязательно) wdt:P186 ?material; # Материал wdt:P571 ?creationDate; # Дата создания (обязательно) wdt:P17 ?country. # Страна SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,mul". } }
Что изменилось:
Добавлен VALUES ?statueType { ... } с перечислением основных типов:
wd:Q4989906 (статуя)wd:Q12459 (мавзолей)wd:Q24354 (святыня)wd:Q179781 (культурное имущество)В wdt:P31/wdt:P279* теперь используется переменная ?statueType, что позволяет искать экземпляры любого из указанных типов.
Добавлен вывод ?statueTypeLabel для отображения типа объекта в результатах.
Если вам нужно добавить или убрать какие-то типы, просто измените список в VALUES.
Понял, вы хотите получить все объекты, которые могут быть экземплярами (P31) для объектов, уже имеющих свойство "статуя" (Q4989906). Вот как можно модифицировать запрос:
sqlSELECT DISTINCT ?statue ?statueLabel ?statueType ?statueTypeLabel ?height ?creationDate ?countryLabel ?materialLabel WHERE { # Находим объекты, которые имеют "статуя" в своих экземплярах ?statue wdt:P31 wd:Q4989906 ; # Основной тип - статуя wdt:P31 ?statueType ; # Другие сопутствующие типы wdt:P2048 ?height ; wdt:P186 ?material ; wdt:P571 ?creationDate ; wdt:P17 ?country. # Исключаем сам тип "статуя" из сопутствующих типов FILTER(?statueType != wd:Q4989906) SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,mul". } }
Что изменилось:
wdt:P31 ?statueType) для объектов, которые уже являются экземплярами "статуи" (Q4989906).FILTER чтобы исключить сам тип "статуя" из списка сопутствующих типов.Этот запрос вернет все объекты, которые имеют "статуя" в своих экземплярах, и покажет другие типы, которые также указаны для этих объектов.


Вот модифицированный SPARQL-запрос, который извлекает свойство price (P2284) вместе с квалификатором валюты:
sqlSELECT DISTINCT ?currency ?currencyLabel ?shortName ?jurisdictionLabel ?startTime ?price ?unit ?unitLabel WHERE { ?currency wdt:P31 wd:Q8142 ; # Элемент является валютой wdt:P1813 ?shortName ; # Короткое название валюты wdt:P1001 ?jurisdiction . # Юрисдикция валюты ?jurisdiction rdfs:label ?jurisdictionLabel . # Метка юрисдикции FILTER(LANG(?jurisdictionLabel) = "ru") . # Только русские метки # Получение цены с квалификатором валюты OPTIONAL { ?currency p:P2284 ?priceStatement . ?priceStatement ps:P2284 ?price . OPTIONAL { ?priceStatement pq:P5061 ?unit . } # Квалификатор - единица измерения } SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". } OPTIONAL { ?currency wdt:P580 ?startTime . } # Время начала действия валюты OPTIONAL { ?currency wdt:P5061 ?unitSymbol . } # Символ единицы валюты }
Ключевые изменения:
Для получения цены с квалификатором используем конструкцию:
sql?currency p:P2284 ?priceStatement . ?priceStatement ps:P2284 ?price . OPTIONAL { ?priceStatement pq:P5061 ?unit . }
Это позволяет получить основное значение цены (ps:P2284) и квалификатор единицы измерения (pq:P5061).
Добавлен вывод ?unit и ?unitLabel для отображения информации о валюте.
Сохранены все остальные свойства из оригинального запроса.
Этот запрос вернет информацию о валютах, включая их цену и единицу измерения (например, "United States dollar" или "Euro"), если такая информация доступна в Викиданных.

Ответ в необычном виде (с дубликатами строк для каждого значения цены) связан с тем, что вы используете OPTIONAL для извлечения квалификатора pq:P5061 ?unit. Это приводит к тому, что для каждого значения цены (?price) создаётся отдельная строка, даже если другие поля (?currency, ?shortName, ?jurisdictionLabel и т.д.) остаются неизменными. Таким образом, одна и та же валюта может появляться несколько раз в результатах с разными значениями цены и единицами измерения.
OPTIONAL на обязательное условие возвращается меньше записей?Когда вы заменяете:
sqlOPTIONAL { ?priceStatement pq:P5061 ?unit . }
на:
sql?priceStatement pq:P5061 ?unit .
вы требуете, чтобы каждое утверждение о цене (?priceStatement) обязательно имело квалификатор единицы измерения (pq:P5061). Это существенно уменьшает количество записей, так как многие утверждения о ценах в Викиданных могут не иметь указанного квалификатора. В результате возвращаются только те записи, где есть и цена, и единица измерения.
Чтобы сделать запрос более точным и элегантным, можно использовать следующие подходы:
Использовать GROUP BY для объединения дублирующихся строк:
Это позволит избежать дубликатов и сделать вывод более компактным.
Использовать COALESCE для обработки опциональных полей:
Это позволит задать значения по умолчанию для опциональных полей.
Вот улучшенная версия запроса:
sqlSELECT ?currency ?currencyLabel ?shortName ?jurisdictionLabel (GROUP_CONCAT(DISTINCT ?price; separator=", ") AS ?prices) (GROUP_CONCAT(DISTINCT ?unitLabel; separator=", ") AS ?units) ?startTime ?unitSymbol WHERE { ?currency wdt:P31 wd:Q8142 ; # Элемент является валютой wdt:P1813 ?shortName ; # Короткое название валюты wdt:P1001 ?jurisdiction . # Юрисдикция валюты # Получение цены с квалификатором валюты OPTIONAL { ?currency p:P2284 ?priceStatement . ?priceStatement ps:P2284 ?price . OPTIONAL { ?priceStatement pq:P5061 ?unit . } # Квалификатор - единица измерения } SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". } OPTIONAL { ?currency wdt:P580 ?startTime . } # Время начала действия валюты OPTIONAL { ?currency wdt:P5061 ?unitSymbol . } # Символ единицы валюты } GROUP BY ?currency ?currencyLabel ?shortName ?jurisdictionLabel ?startTime ?unitSymbol
Что изменилось:
GROUP_CONCAT для объединения всех значений цен и единиц измерения в одну строку для каждой валюты.DISTINCT в GROUP_CONCAT для исключения дубликатов.?currency, ?currencyLabel, ?shortName, ?jurisdictionLabel, ?startTime, ?unitSymbol).Этот запрос вернёт более компактные и читаемые результаты, избегая дубликатов и сохраняя всю необходимую информацию.
wd_book_ru_2024.pdf
Извините за предыдущие предложения, которые не соответствовали вашим ожиданиям. Давайте попробуем улучшить запрос так, чтобы он был более эффективным и соответствовал вашим требованиям.
Для начала, давайте рассмотрим ваш текущий запрос и попробуем оптимизировать его:
sqlSELECT ?currency ?currencyLabel ?shortName ?startTime ?price ?unit ?unitLabel WHERE { ?currency wdt:P31 wd:Q8142 ; # Элемент является валютой wdt:P1813 ?shortName. # Короткое название валюты #wdt:P1001 ?jurisdiction . # если указано, то в основном Еврозона, пропустим (Юрисдикция валюты) OPTIONAL { # Цена с квалификатором валюты ?currency p:P2284 ?priceStatement . ?priceStatement ps:P2284 ?price . OPTIONAL { ?priceStatement pq:P5061 ?unit . } # Квалификатор - единица измерения } OPTIONAL { ?currency wdt:P580 ?startTime . } # Время начала действия валюты OPTIONAL { ?currency wdt:P5061 ?unitSymbol . } # Символ единицы валюты SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". } }
Для улучшения этого запроса, мы можем сделать следующее:
Вот улучшенная версия запроса:
sqlSELECT ?currency ?currencyLabel ?shortName ?startTime ?price ?unit ?unitLabel WHERE { ?currency wdt:P31 wd:Q8142 ; # Элемент является валютой wdt:P1813 ?shortName. # Короткое название валюты OPTIONAL { # Цена с квалификатором валюты ?currency p:P2284 ?priceStatement . ?priceStatement ps:P2284 ?price . OPTIONAL { ?priceStatement pq:P5061 ?unit . } # Квалификатор - единица измерения } OPTIONAL { ?currency wdt:P580 ?startTime . } # Время начала действия валюты SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". } }
В этом запросе мы убрали лишний OPTIONAL блок для wdt:P5061 ?unitSymbol, так как он дублирует информацию, которая уже может быть получена из квалификатора pq:P5061 ?unit.
Если вам нужно получить дополнительные данные или уточнить запрос, пожалуйста, дайте знать, и я помогу вам с этим.