PDF

wd_book_ru_2024.pdf

Для того, чтобы ты стал экспертом в работе с Викиданными, предоставляю тебе следующую информацию:
1) курс "Программирование Викиданных" в Русском Викиверситете https://ru.wikiversity.org/?curid=23388 . Проанализируй и вникни в этот курс на главной странице курса и на его подстраницах. Пример подстраницы: "Программирование Викиданных/ProWD", на главной странице курса "Программирование Викиданных" есть ссылка типа "/ProWD" или "Программирование Викиданных/ProWD". Таким образом, проанализируй все подстраницы курса "Программирование Викиданных" в Викиверситете.

2) Часть страниц курса в Викиверситете была доработана и опубликована в виде книги, прилагаю PDF этой книги (PDF также можно скачать по ссылке https://commons.wikimedia.org/wiki/File:Wd_book_ru_2024.pdf).

3) Огромное количество отличных примеров SPARQL-запросов к Викиданным, отобранных редакторами Викиданных, размещены на странице: https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries/examples

Проанализируй эти три источника, чтобы лучше понимать структуру Викиданных и лучше уметь строить SPARQL-запросы.

Мне нужно выбрать объект (объекты) Викиданных, его (их) свойства, затем построить SPARQL-запросы, чтобы с их помощью получить данные в виде таблицы, которую затем сохранить в формате CSV для дальнейших исследований. Прими эту информацию к сведению, без комментариев.
Jan 27, 8:15am

Для углублённого изучения работы с Викиданными и построения SPARQL-запросов рекомендую следующие ресурсы:

  1. Курс «Программирование Викиданных» в Русском Викиверситете

    • Главная страница курса: Программирование Викиданных
    • Здесь собраны материалы по программированию Викиданных, включая подстраницы с практическими заданиями, примерами SPARQL-запросов и методическими рекомендациями. Например, подстраница Алгоритм работы для новых статей и Языки программирования помогут разобраться в структуре данных и построении запросов.
  2. Официальная страница примеров SPARQL-запросов в Викиданных

    • Wikidata:SPARQL query service/queries/examples
    • Здесь собраны разнообразные примеры SPARQL-запросов, включая базовые и продвинутые, с комментариями и пояснениями. Это отличный ресурс для изучения синтаксиса и возможностей SPARQL при работе с Викиданными.
  3. Учебник «Программирование Викиданных» (PDF)

    • Ссылка на книгу: wd_book_ru_2024.pdf
    • В учебнике подробно описаны основы работы с Викиданными, приведены примеры SPARQL-запросов, упражнения и практические рекомендации по анализу данных.

Как выбрать объект и свойства для SPARQL-запроса?

  • Определите тему исследования (например, «воздушные суда», «аниме», «населённые пункты»).
  • Найдите соответствующий объект в Викиданных (например, Q11436 для «воздушные суда», Q1107 для «аниме»).
  • Изучите свойства объекта на его странице в Викиданных (например, «производитель», «численность населения», «дата публикации»).
  • Постройте SPARQL-запрос, используя примеры из курса или официальной документации, адаптируя их под вашу задачу.
  • Сохраните результаты запроса в формате CSV для дальнейшего анализа.

Если нужна помощь с конкретным запросом или объектом — уточните, и я помогу сформулировать запрос!

Jan 27, 8:15am
Хочу взять два объекта Викиданных: страны и мультфильмы, при этом нужен третий объект, который их будет связывать - это студия мультфильмов. Что интересного можно было бы исследовать: например, разбиение мультфильмов по жанрам, по годам, по странам, что ещё? Какие для этого нужны SPARQL-скрипты?
Jan 27, 8:18am

Для исследования связей между странами, мультфильмами и студиями мультфильмов в Викиданных можно использовать следующие подходы и SPARQL-скрипты:


1. Исследование связей между странами, мультфильмами и студиями

Объекты Викиданных:

  • Страны (Q6256) — для анализа географического распределения.
  • Мультфильмы (Q11424) — для анализа жанров, годов выпуска и других свойств.
  • Студии мультфильмов (Q166118) — для связи между странами и мультфильмами.

2. Примеры SPARQL-запросов

Запрос 1: Список мультфильмов, сгруппированных по странам

sql
SELECT ?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)

Этот запрос покажет, какие страны производят больше всего мультфильмов.


Запрос 2: Список студий мультфильмов и их продукция

sql
SELECT ?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)

Этот запрос выведет студии, которые произвели наибольшее количество мультфильмов.


Запрос 3: Мультфильмы по жанрам

sql
SELECT ?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)

Этот запрос покажет распределение мультфильмов по жанрам.


Запрос 4: Мультфильмы по годам выпуска

sql
SELECT ?year (COUNT(?film) AS ?filmCount)
WHERE {
  ?film wdt:P31 wd:Q11424 ;  # Экземпляры мультфильмов
        wdt:P577 ?year .    # Год выпуска
}
GROUP BY ?year
ORDER BY ?year

Этот запрос покажет динамику выпуска мультфильмов по годам.


Запрос 5: Самые популярные студии в разных странах

sql
SELECT ?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)

Этот запрос покажет, какие студии наиболее активны в каждой стране.


Запрос 6: Мультфильмы, выпущенные в определённом году (например, 2020)

sql
SELECT ?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 году, и студии, их выпустившие.


Запрос 7: Мультфильмы, получившие награды

sql
SELECT ?film ?filmLabel ?award ?awardLabel
WHERE {
  ?film wdt:P31 wd:Q11424 ;  # Экземпляры мультфильмов
        wdt:P166 ?award .    # Награда
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" }
}

Этот запрос покажет мультфильмы, которые получили какие-либо награды.


3. Идеи для дальнейшего анализа

  • Анализ временных трендов: Как изменялось количество мультфильмов по годам?
  • Географическое распределение: Какие страны лидируют по производству мультфильмов?
  • Жанровое разнообразие: Какие жанры мультфильмов наиболее популярны?
  • Сравнение студий: Какие студии выпустили наибольшее количество мультфильмов?
  • Связь с культурами: Как мультфильмы отражают культурные особенности стран?

4. Визуализация данных

Результаты запросов можно визуализировать с помощью:

  • Графиков (например, количество мультфильмов по годам).
  • Карт (например, распределение студий по странам).
  • Диаграмм (например, доля жанров в общем количестве мультфильмов).

Если нужна помощь с конкретным запросом или визуализацией — дайте знать!

Jan 27, 8:18am
Ты перепутал объекты: Q11424 - это фильм, а мне нужен Q202866 (Мультфильм, animated film).
Уточняю задачу: пусть с помощью SPARQL-запроса мы получим мультфильмы со следующими данными: выбери только те мульфильмы, у которых указаны:
1) жанр (Property:P136),
2) страна (country of origin (P495)),
3) продолжительность duration (P2047).

Мне нужен запрос, который соберёт эти данные, чтобы я мог проанализировать (1) географию жанров и (2) взаимосвязь жанра и продолжительности.
Jan 27, 8:29am

Вот SPARQL-запрос, который соберёт мультфильмы с указанными свойствами: жанр, страна происхождения и продолжительность:

sql
SELECT ?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)

Для анализа географии жанров и взаимосвязи жанра и продолжительности можно использовать следующие подходы:

  1. География жанров:

    • Постройте пузырьковую диаграмму, где по оси X — жанры, по оси Y — страны, а размер пузырьков — количество мультфильмов в данном жанре и стране.
  2. Взаимосвязь жанра и продолжительности:

    • Постройте диаграмму рассеяния, где по оси X — жанры, по оси Y — продолжительность, чтобы увидеть, как длительность варьируется в зависимости от жанра.

Если нужно выгрузить данные в CSV для дальнейшего анализа, добавьте в конец запроса:

sql
#defaultView:Table

Или используйте опцию "Download as CSV" в интерфейсе Wikidata Query Service.

Jan 27, 8:29am
Код работает, получил 8011 записей, вот ссылка на код: https://w.wiki/HcGe .
Запомню, что много дубликатов, поскольку если у мультфильма несколько жанров или несколько стран-соавторов, то это разные записи в этой таблице.

Раз мы экономисты, то найди свойство, которое будет показывать доход с мультфильма на Викиданных. И затраченную сумму (свойство capital cost (P2130)), чтобы я в дальнейшем мог их сравнить.
2/2
Jan 27, 8:54am

Вот SPARQL-запрос, который соберёт данные о доходах и затратах на мультфильмы:

sql
SELECT 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" }
}

Комментарии к запросу:

  1. Добавлены свойства:

    • wdt:P2139 — доход с мультфильма (box office)
    • wdt:P2130 — затраты на производство (budget)
  2. OPTIONAL используется, так как не все мультфильмы имеют указанные финансовые данные.

  3. DISTINCT убирает дубликаты, но если нужно сохранить все записи (например, для анализа по жанрам/странам), можно убрать эту строку.

Пример анализа:

  • Вы можете сравнить доходы и затраты по жанрам или странам.
  • Например, построить график "Доход/Затраты" для разных жанров.

Если нужно выгрузить данные в CSV, добавьте в конец запроса:

sql
#defaultView:Table

Или используйте опцию "Download as CSV" в интерфейсе Wikidata Query Service.

Jan 27, 8:54am
Пусть эти два свойства (доход и затраты на мультфиль) будут не optional, а обязательным свойством в скрипте.
Jan 27, 8:57am

Вот SPARQL-запрос, который соберёт мультфильмы с обязательными свойствами: жанр, страна происхождения, продолжительность, доход и затраты:

sql
SELECT 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" }
}

Этот запрос вернёт только те мультфильмы, для которых указаны все пять свойств.

Jan 27, 8:57am
К сожалению, 0 записей получено. Оставляем код, который ищет только затраты на мультфильм (без доходов), а именно следующий код:
SELECT 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:P2130 ?capital_cost. # Затраты на мультфильм (budget)

SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" }
}

При этом внеси изменения в код такие: нам не нужны конкретные значения жанра, страны и продолжительности, интересует только конкретный мультфильм и затраты, при этом обязательно, чтобы у объекта мультфильм были заполнены свойства жанр, страна и продолжительность. Так мы избавимся от дубликатов и получим более короткий список.
Jan 27, 9:05am

Вот исправленный SPARQL-запрос, который вернёт список мультфильмов с затратами, при этом гарантируя, что у каждого мультфильма указаны жанр, страна и продолжительность:

sql
SELECT 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" }
}

Что изменилось:

  1. Убраны ?genreLabel, ?countryLabel, ?duration и ?revenue из SELECT, так как они не нужны в выводе.
  2. Оставлены только ?film, ?filmLabel и ?capital_cost для краткости.
  3. Все свойства (жанр, страна, продолжительность) остаются обязательными в WHERE, чтобы избежать дубликатов.

Этот запрос вернёт короткий список мультфильмов с их затратами, при этом гарантируя, что у каждого мультфильма есть все три свойства.

Jan 27, 9:05am
Подготовь максимально подробную информацию по-английски, о темах, которые мы обсудили в этом диалоге и к каким решениям пришли.
2/2
Jan 27, 9:36am

Here is a detailed summary of the topics discussed in this dialogue and the solutions we arrived at:


1. Wikidata and SPARQL Queries

Topics Covered:

  • Wikidata Objects and Properties: Discussed how to select and query objects in Wikidata, such as animated films (Q202866), countries (Q6256), and studios (Q166118).
  • SPARQL Queries: Explored how to construct SPARQL queries to extract data, including:
    • Lists of animated films with properties like genre, country of origin, duration, budget, and revenue.
    • Filtering and grouping data to analyze trends (e.g., geography of genres, relationship between genre and duration).
    • Handling duplicates and optional vs. mandatory properties in queries.

Solutions:

  • Constructed SPARQL queries to retrieve specific data (e.g., animated films with budget information).
  • Ensured mandatory properties (genre, country, duration) were included to avoid duplicates and refine results.
  • Example query to fetch animated films with budget details:
    sql
    SELECT DISTINCT ?film ?filmLabel ?capital_cost
    WHERE {
      ?film wdt:P31 wd:Q202866 ;
            wdt:P136 ?genre ;
            wdt:P495 ?country ;
            wdt:P2047
Jan 27, 9:36am
Дай текстовое описание в одно предложение на русском, аналогично на английском, для следующего SPARQL-запроса к Викиданным:

SELECT ?serial ?serialLabel ?country ?countryLabel ?rarsRating ?rarsRatingLabel
WHERE {
?serial wdt:P31 wd:Q117467246; # Анимационные телесериалы
wdt:P495 ?country. # Страна

OPTIONAL {?serial wdt:P2637 ?rarsRating.}# RARS може быть, может не быть

# Метки для ИмяLabel (?serialLabel, ?countryLabel ?rarsRatingLabel)
SERVICE wikibase:label {bd:serviceParam wikibase:language "ru,en"}
}

Конец запроса.

Не надо начинать текст с фразы "Этот SPARQL-запрос", то есть описание должно быть достаточно кратким, это комментарий в коде для программистов.
2/2
Feb 6, 6:09am

На русском: Получает список анимационных телесериалов с указанием страны и рейтинга РАРС (если доступен).
On English: Retrieves a list of animated TV series with country and RARS rating (if available).

Feb 6, 6:09am
Вот рабочий SPARQL-запрос (возвращает 213 записей из Викиданных):
SELECT
?aircraft ?aircraftLabel
?engine ?engineLabel
?maxAltitude
?totalProduced
WHERE {
?aircraft wdt:P31/wdt:P279* wd:Q15056993; # Экземпляр или подкласс "семейство самолётов"
wdt:P516 ?engine; # Двигатель (powered by)
wdt:P2254 ?maxAltitude; # Максимальная высота (maximum operating altitude)
wdt:P1092 ?totalProduced. # Количество произведённых самолётов (total produced)

SERVICE wikibase:label {
bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
}
}
ORDER BY DESC(?totalProduced)

Конец запроса.

Модифицируй запрос так:
1) чтобы ?maxAltitude и ?totalProduced были бы опциональными, с помощью команд:
OPTIONAL { ?aircraft wdt:P2249 ?maxAltitude. } # Максимальная высота
OPTIONAL { ?aircraft wdt:P2248 ?payloadMass. } # Полезная нагрузка

2) пусть запрос ищет экземпляры одновременно: и модели самолёта (Q1928655), и семейства самолётов (Q15056993), для этого используй VALUES[].
2/2
Feb 6, 7:36pm

Вот модифицированный SPARQL-запрос, который учитывает ваши требования:

sql
SELECT
  ?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)

Изменения:

  1. Добавлен VALUES ?aircraftType { wd:Q15056993 wd:Q1928655 } для поиска экземпляров как "семейства самолётов" (Q15056993), так и "модели самолёта" (Q1928655).
  2. Свойства ?maxAltitude и ?payloadMass сделаны опциональными с помощью OPTIONAL.
  3. Добавлено свойство ?payloadMass (полезная нагрузка) в SELECT и OPTIONAL.
Feb 6, 7:36pm
SELECT DISTINCT ?park ?parkLabel ?country ?countryLabel ?area ?inception ?highestPoint ?highestPointLabel ?elevation WHERE {
?park wdt:P31 wd:Q46169; # Национальный парк
wdt:P17 ?country; # Страна
wdt:P2046 ?area; # Площадь
wdt:P571 ?inception; # Дата основания
wdt:P610 ?highestPoint; # Самая высокая точка
wdt:P2044 ?elevation. # Высота над уровнем моря

SERVICE wikibase:label { bd:serviceParam wikibase:language "ru, en" }
}

Преобразуй запрос, чтобы три следующие параметра были опциональны:
wdt:P571 ?inception; # Дата основания
wdt:P610 ?highestPoint; # Самая высокая точка
wdt:P2044 ?elevation. # Высота над уровнем моря
Feb 6, 8:26pm

Вот преобразованный SPARQL-запрос с опциональными свойствами:

sql
SELECT 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" }
}

Что изменилось:

  1. Свойства wdt:P571 (дата основания), wdt:P610 (самая высокая точка) и wdt:P2044 (высота над уровнем моря) теперь опциональны.
  2. Для каждого опционального свойства добавлен блок OPTIONAL { ... }.
  3. Обязательными остались только wdt:P31 (тип объекта), wdt:P17 (страна) и wdt:P2046 (площадь).
Feb 6, 8:26pm
SELECT ?statue ?statueLabel ?height ?creationDate ?countryLabel ?materialLabel
WHERE {
?statue wdt:P31/wdt:P279* wd:Q4989906; # статуя или её подклассы
wdt:P2048 ?height; # Высота (обязательно)
wdt:P186 ?material; # Материал
wdt:P571 ?creationDate; # Дата создания (обязательно)
wdt:P17 ?country. # Страна

SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,mul". }
}

Предложи изменения в запрос выше, чтобы кроме wd:Q4989906 можно было бы получить другие виды объектов, instance of которых является объект ?statue.

Например, на скриншоте мы видим, что данные объект ?statue является instance of для трёх типов (объектов): (1) mausoleum, (2) shrine, (3) cultural property.

Как раз эти объекты, сопутствующие в "instance of" нашему типу статуя (wd:Q4989906), я хотел бы получить в этом новом запросе, который ты сейчас напишешь.
Feb 13, 7:14am

Вот модифицированный SPARQL-запрос, который позволяет получить объекты, являющиеся экземплярами статуи (Q4989906) или других сопутствующих типов (например, mausoleum, shrine, cultural property):

sql
SELECT ?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". }
}

Что изменилось:

  1. Добавлен VALUES ?statueType { ... } с перечислением основных типов:

    • wd:Q4989906 (статуя)
    • wd:Q12459 (мавзолей)
    • wd:Q24354 (святыня)
    • wd:Q179781 (культурное имущество)
  2. В wdt:P31/wdt:P279* теперь используется переменная ?statueType, что позволяет искать экземпляры любого из указанных типов.

  3. Добавлен вывод ?statueTypeLabel для отображения типа объекта в результатах.

Если вам нужно добавить или убрать какие-то типы, просто измените список в VALUES.

Feb 13, 7:14am
Ты меня неверно понял: я не хочу заранее определять ограниченное число сопутствующих объектов через список внутри VALUES. Я хочу, чтобы эти объекты были получены с помощью скрипта, их может быть сотни.

Тем более, что номера ты взял с потолка, неверные, а именно:
1) 1972 Argentine Grand Prix (Q12459)
2) Birla Institute of Technology, Mesra (Q179781)
Feb 13, 7:18am

Понял, вы хотите получить все объекты, которые могут быть экземплярами (P31) для объектов, уже имеющих свойство "статуя" (Q4989906). Вот как можно модифицировать запрос:

sql
SELECT 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". }
}

Что изменилось:

  1. Запрос теперь получает все сопутствующие типы (второе wdt:P31 ?statueType) для объектов, которые уже являются экземплярами "статуи" (Q4989906).
  2. Добавлен FILTER чтобы исключить сам тип "статуя" из списка сопутствующих типов.
  3. В результатах будет отображаться основная информация о статуе, а также все сопутствующие типы для каждого объекта.

Этот запрос вернет все объекты, которые имеют "статуя" в своих экземплярах, и покажет другие типы, которые также указаны для этих объектов.

Feb 13, 7:18am
Вот информация по квалификаторам: https://www.wikidata.org/?curid=16567549

И пример SPARQL-запроса с той же страницы для извлечения квалификатора:
SELECT ?item ?itemLabel ?pq_obj ?pq_objLabel
WHERE { ?item p:P31 ?statement. ?statement ps:P31 wd:Q1793804;
pq:P642 ?pq_obj. ?pq_qual wikibase:qualifier pq:P642.
SERVICE wikibase:label { bd:serviceParam wikibase:language "de". } }

Вот пример скрипта с квалификатором (со страницы https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries/examples):
# ----
# The education of Douglas Adams, to illustrate time qualifiers
#
SELECT ?education ?educationLabel ?starttime ?endtime
WHERE
{
wd:Q42 p:P69 [ps:P69 ?education;
pq:P580 ?starttime;
pq:P582 ?endtime;
].
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],mul,en". }
}
ORDER BY ?starttime


Вот наш объект yen (Q8146) (https://www.wikidata.org/wiki/Q8146).
Интересует свойство price (P2284) (https://www.wikidata.org/wiki/Property:P2284) этого объекта yen, при этом вместе с optional квалификатором Unit, например Unit="United States dollar" и Unit="Euro" (первый скриншот прилагаю).

Также на странице свойства (https://www.wikidata.org/wiki/Property:P2284) перечислены возможные типы валют в том числе для этого квалификатора (второй скриншот, фрагмент).

Итак, вот мой запрос, который нужно модифицировать, чтобы извлекать также квалификатор валюты в свойстве price:
SELECT DISTINCT ?currency ?currencyLabel ?shortName ?jurisdictionLabel ?startTime ?price ?unitSymbol
WHERE {
?currency wdt:P31 wd:Q8142 ; # Элемент является валютой / Item is a currency
wdt:P1813 ?shortName ; # Короткое название валюты / Short name of the currency
wdt:P1001 ?jurisdiction . # Юрисдикция валюты / Jurisdiction of the currency
?jurisdiction rdfs:label ?jurisdictionLabel . # Метка юрисдикции / Label of the jurisdiction
FILTER(LANG(?jurisdictionLabel) = "ru") . # Только русские метки / Only Russian labels
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". } # Метки только на русском / Labels only in Russian
OPTIONAL { ?currency wdt:P580 ?startTime . } # Время начала действия валюты / Start time of the currency
OPTIONAL { ?currency wdt:P2284 ?price . } # Цена (курс) валюты / Price (exchange rate) of the currency
OPTIONAL { ?currency wdt:P5061 ?unitSymbol . } # Символ единицы валюты / Unit symbol of the currency
}
Feb 13, 11:49am

Вот модифицированный SPARQL-запрос, который извлекает свойство price (P2284) вместе с квалификатором валюты:

sql
SELECT 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 . }  # Символ единицы валюты
}

Ключевые изменения:

  1. Для получения цены с квалификатором используем конструкцию:

    sql
    ?currency p:P2284 ?priceStatement .
    ?priceStatement ps:P2284 ?price .
    OPTIONAL { ?priceStatement pq:P5061 ?unit . }

    Это позволяет получить основное значение цены (ps:P2284) и квалификатор единицы измерения (pq:P5061).

  2. Добавлен вывод ?unit и ?unitLabel для отображения информации о валюте.

  3. Сохранены все остальные свойства из оригинального запроса.

Этот запрос вернет информацию о валютах, включая их цену и единицу измерения (например, "United States dollar" или "Euro"), если такая информация доступна в Викиданных.

Feb 13, 11:49am
Уточняю, что более верным является такой запрос:
SELECT ?currency ?currencyLabel ?shortName ?jurisdictionLabel ?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 . } # Квалификатор - единица измерения
}

SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
OPTIONAL { ?currency wdt:P580 ?startTime . } # Время начала действия валюты
OPTIONAL { ?currency wdt:P5061 ?unitSymbol . } # Символ единицы валюты
}

Этот запрос возвращает 1114 записей.
На первом скриншоте фрагмент ответа на этот запрос.
Вопрос: почему ответ не в обычном табличном виде, а в таком, как на скриншоте?

Почему, если заменить строку:
OPTIONAL { ?priceStatement pq:P5061 ?unit . } # Квалификатор - единица измерения
на строку:
?priceStatement pq:P5061 ?unit .
то возвращается записей намного меньше, а именно: всего 77 записей, но уже в привычном табличном видео? С чем это связано, как это объяснить? Можно ли ещё улучшить первый запрос , чтобы получать данные более точно, чтобы запрос был более элегантным?
Feb 13, 12:04pm

Почему ответ не в обычном табличном виде?

Ответ в необычном виде (с дубликатами строк для каждого значения цены) связан с тем, что вы используете OPTIONAL для извлечения квалификатора pq:P5061 ?unit. Это приводит к тому, что для каждого значения цены (?price) создаётся отдельная строка, даже если другие поля (?currency, ?shortName, ?jurisdictionLabel и т.д.) остаются неизменными. Таким образом, одна и та же валюта может появляться несколько раз в результатах с разными значениями цены и единицами измерения.


Почему при замене OPTIONAL на обязательное условие возвращается меньше записей?

Когда вы заменяете:

sql
OPTIONAL { ?priceStatement pq:P5061 ?unit . }

на:

sql
?priceStatement pq:P5061 ?unit .

вы требуете, чтобы каждое утверждение о цене (?priceStatement) обязательно имело квалификатор единицы измерения (pq:P5061). Это существенно уменьшает количество записей, так как многие утверждения о ценах в Викиданных могут не иметь указанного квалификатора. В результате возвращаются только те записи, где есть и цена, и единица измерения.


Как улучшить запрос?

Чтобы сделать запрос более точным и элегантным, можно использовать следующие подходы:

  1. Использовать GROUP BY для объединения дублирующихся строк:
    Это позволит избежать дубликатов и сделать вывод более компактным.

  2. Использовать COALESCE для обработки опциональных полей:
    Это позволит задать значения по умолчанию для опциональных полей.

Вот улучшенная версия запроса:

sql
SELECT ?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

Что изменилось:

  1. Использовано GROUP_CONCAT для объединения всех значений цен и единиц измерения в одну строку для каждой валюты.
  2. Добавлено DISTINCT в GROUP_CONCAT для исключения дубликатов.
  3. Результаты сгруппированы по основным полям (?currency, ?currencyLabel, ?shortName, ?jurisdictionLabel, ?startTime, ?unitSymbol).

Этот запрос вернёт более компактные и читаемые результаты, избегая дубликатов и сохраняя всю необходимую информацию.

Feb 13, 12:04pm
PDF

wd_book_ru_2024.pdf

Пишешь глупость: "OPTIONAL для извлечения квалификатора pq:P5061 ?unit. Это приводит к тому, что для каждого значения цены (?price) создаётся отдельная строка, даже если другие поля (?currency, ?shortName, ?jurisdictionLabel и т.д.) остаются неизменными. ", поскольку - это обычное дело в таблице, когда только одно поле отличается в строках.

"GROUP BY" - не предлагай.
"COALESCE " - не фантазируй.
GROUP_CONCAT - это глупость.

Ещё раз загружаю сюда учебник по SPARQL и Викиданным. Внимательно его читай и думай над улучшением скрипта, а также ищи ответ в Интернете:
SELECT ?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". }
}
Feb 13, 12:17pm

Извините за предыдущие предложения, которые не соответствовали вашим ожиданиям. Давайте попробуем улучшить запрос так, чтобы он был более эффективным и соответствовал вашим требованиям.

Для начала, давайте рассмотрим ваш текущий запрос и попробуем оптимизировать его:

sql
SELECT ?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". }
}

Для улучшения этого запроса, мы можем сделать следующее:

  1. Убрать лишние OPTIONAL блоки, если они не нужны.
  2. Использовать более специфичные условия для фильтрации данных.

Вот улучшенная версия запроса:

sql
SELECT ?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.

Если вам нужно получить дополнительные данные или уточнить запрос, пожалуйста, дайте знать, и я помогу вам с этим.

Feb 13, 12:17pm

This is a shared conversation and may include unverified content that doesn't reflect Mistral AI's views. It cannot be edited because it contains private files.