Обсуждение:Программирование Викиданных/Населённые пункты

Lmaksimen, 2021 править

Query timeout limit reached править

@Леонид, сейчас у нас в первом разделе такая фраза:

"...В 2021 году список населённых пунктов получить невозможно из-за большого числа объектов и поэтому слишком долгой работы скрипта."

Я предлагаю после этой фразы добавить скрипт, который не выводит весь список, а просто считает число объектов. См. два примера на COUNT() в учебнике: https://wdqs-tutorial.toolforge.org/index.php/modifying-results/count-exercise-2/

И добавьте пояснение к скрипту текстом, что скрипт делает и сколько получилось. --Andrew Krizhanovsky (обсуждение) 19:40, 22 сентября 2021 (UTC)Ответить

Самая малолюдная страна править

@Леонид, в разделе "2 Список стран по суммарному количеству населения" строился список стран, упорядоченный по числу жителей в населённых пунктах. По этому списку мы искали самую малолюдную страну. В 2017 году это была Черногория. Положим, мы получили, что в Черногории Q жителей в населённых пунктах.

Теперь мы хотим проверить, что это Q получено правильно. Для этого у нас есть скрипт в следующем подразделе "2.1 Проверка правильности выполнения скрипта". Проблема в том, что

  1. С 2017 года изменилась самая малолюдная страна. Теперь это не Черногория. См. результат в скрипте в разделе 2. Соответственно, нужно переписать скрипт 2.1.
  2. Похоже, что Анна, работавшая с этой статьёй в 2017 году, неправильно решила задачу в скрипте в подразделе 2.1. Чтобы получить суммарное число людей по Черногории (то самое число Q), нужно было складывать население, функция SUM. --Andrew Krizhanovsky (обсуждение) 09:19, 29 сентября 2021 (UTC)Ответить

@Andrew Krizhanovsky Доработал скрипт и исправил замечания 16:54, 12 октября 2021 (UTC)Ответить

  1. @Леонид, Вы написали "160 записей (2021)". Но в результатах только одна запись. Другое дело, что переменная имеет значение, нужное нам.
  2. Кстати, в Английской Википедии в статье про Сент-Люсию написано: "The capital city of Saint Lucia is Castries (population 60,263)". Почему тогда суммарное число жителей в стране 160 человек, если в столице их 60 тыщ? Есть баг в скрипте? --Andrew Krizhanovsky (обсуждение) 18:18, 12 октября 2021 (UTC)Ответить
    @Andrew Krizhanovsky
    1. Исправил.
    2. Дело в условии (?hum wdt:P31 wd:Q486972.    # instance of human settlement) Lmaksimen (обсуждение) 18:40, 12 октября 2021 (UTC)Ответить
 
160 человек?

@Леонид, Вы написали, что "Проверка прошла успешно, так как данный скрипт подтвердил результат численности населения, проживающего в «населённых пунктах» Сент-Люсия". При этом Вас устроило, что в стране живёт 160 человек. Если Вы загляните в статью w:Сент-Люсия, то увидите, что в этой стране живёт более полутора сотен тысяч человек. Скрипт работает неверно. Если убрать суммирование, то получим скрипт w.wiki/4NTN. Почему в результат этого скрипта не входит столица, а входит только деревенька в 160 человек? Подумайте и исправляйтесь, пожалуйста. --Andrew Krizhanovsky (обсуждение) 17:18, 11 ноября 2021 (UTC)Ответить

@Andrew Krizhanovsky Как и писал выше - из-за условия wd:Q486972, он есть только у той деревни. Предлагаю такую версию скрипта https://w.wiki/4QWj 11:58, 17 ноября 2021 (UTC)
@Andrew Krizhanovsky Изменяя этот скрип теряется смысл проверки, тк в прошлом разделе мы получили 160 человек и тут тоже 160 получаем. 12:09, 17 ноября 2021 (UTC)Ответить
@Леонид, посмотрел Вашу новую версию скрипта https://w.wiki/4QWj — отлично, получили почти 95 тыс. человек. Прежде чем заняться проверкой, вопрос тогда в том, как модифицировать предыдущий скрипт, который считал число человек по странам, чтобы учесть правильно число жителей Сент-Люсии? И после этого пересчитать и выявить самую малонаселённую страну. И потом уже проверять вычисления. --Andrew Krizhanovsky (обсуждение) 06:19, 19 ноября 2021 (UTC)Ответить
@Andrew Krizhanovsky, На примере России написал скрипт https://w.wiki/4RCU, но DISTINCT не работает. Проверил так: вывел количество населения в городах России 100к+ https://w.wiki/4RCc и в городах 1м+ https://w.wiki/4RCd. Если сложить получиться тоже самое число что и с DISTINCT https://w.wiki/4RCe. Но так не должно быть. --@Леонид 12:25, 19 ноября 2021 (UTC)Ответить
@Andrew Krizhanovsky, Есть еще такой вариант https://w.wiki/4RDK. --@Леонид 13:50, 19 ноября 2021 (UTC)Ответить
@Andrew Krizhanovsky, Нашел такие варианты названий поселений в России, как произвести их подсчет не знаю https://w.wiki/4RpY. --@Леонид 12:-0, 21 ноября 2021 (UTC)
  • @Леонид, то, что что-то "не работает" и "так не должно быть" - это превосходно! Меня устроит, если Вы опишите свои приключения как исследователя и укажите на трудности и противоречия в тексте статьи. И в конце этого раздела предложите читателю самому поразбираться, возможно, ему повезёт больше.
  • Везде "ru,[AUTO_LANGUAGE]" поменяйте, пожалуйста, на "ru,en".
  • Возможно, запись с помощью конструкции VALUES будет более компактной (см. скрипты у других студентов). --Andrew Krizhanovsky (обсуждение) 09:34, 30 ноября 2021 (UTC)Ответить

Cписок объектов, сопутствующих "human_settlement" в "instance of" править

@Леонид, по поводу этого раздела.

I) В первых двух предложениях раздела, где ставится задача, пишется об "instance of", но не объясняется русскими словами, что это свойство значит. Если посмотреть на ВД это свойство d:Property:P31, то я бы предложил указать, что "instance of" для некоторого объекта является классом этого объекта (+ конкретный пример на примере городов, что такое "класс объекта" в ВД).

@Andrew Krizhanovsky Добавил небольшое пояснение. 12:43, 17 ноября 2021 (UTC)Ответить

II) По результату SPARQL-запроса есть некоторые вопросы.

  1. Результаты существенно изменились, обновите, пожалуйста, список после скрипта.
  2. Добавьте, пожалуйста, перевод к безымянным объектам на русский и английский в Викиданных.
  3. Я добавил перевод к трём объектам: d:Q106505016, d:Q106504971, d:Q106505070. Оказалось, что это поселения классов: поселения латенского периода, каменного века и поселение в доисторические времена. Предложите, пожалуйста, в этот раздел четвёртый скрипт (модификацию третьего), чтобы отсечь доисторические поселения таких типов, без явного указания этих трёх объектов. Я бы предложил глянуть, что есть общего у объектов "Латенская культура", "каменный век" и "Протоистория" на ВД. И, например, фильтровал бы объекты, которые являются подклассом такого объекта, который, в свою очередь, является экземпляром объектов "archaeological culture", "historical period", "archaeological age", "human history" и "geological period". --Andrew Krizhanovsky (обсуждение) 08:50, 12 октября 2021 (UTC)Ответить
  1. @Andrew Krizhanovsky Добавил данные за 2021 год. 12:43, 17 ноября 2021 (UTC)Ответить
  2. @Andrew Krizhanovsky Добавил описания первым объектам по количеству населенных пунктов из последнего запроса. Возможно d:Q106505070 нужно переименовать, тк есть d:Q106492558. 12:43, 17 ноября 2021 (UTC)
@Леонид, спасибо! Подписывайтесь пожалуйста. Написал запрос авторам объекта: d:Talk:Q106505070. --Andrew Krizhanovsky (обсуждение) 06:25, 19 ноября 2021 (UTC)Ответить
3. @Andrew Krizhanovsky Сделал вариант SPARQL-запроса. Не понимаю почему вот этот скрип дает другой ответ SPARQL-запроса. Возможно во втором я некорректно использую фильтрацию. --Леонид (обсуждение) 20:00, 14 декабря 2021 (UTC)Ответить

Идеи для SPARQL-задач править

@Андрей Анатольевич, идеи для новых скриптов:

  • Найти соотношение численности людей и площади населённого пункта;
  • Вывести список населенных пунктов появившихся за последние 20 лет и отсортировать их по численности населения;
  • Вывести список городов-призраков в России --Леонид (обсуждение) 20:32, 20 октября 2021 (UTC)Ответить

@Леонид, добавьте эти задачи в раздел "Будущая работа". Для решения такая задача:

Сколько рождалось известных учёных разных научных направлений в сельских и городских типах населённых пунктов России?

Для ответа на этот вопрос предлагаю:

  1. Выявить список сельских и список городских типов поселений именно в России (см. раздел Вашей статьи "Cписок объектов, сопутствующих "human_settlement" в "instance of").
  2. См. рис. 2 в нацпарках. Сделать одну такую диаграмму по сельским поселениям.
  3. Сделать вторую диаграмму — по городским поселениям (вывести обе диаграммы друг под другом для сравнения). Разным цветом на диаграмме будут указаны разные научные направления (математики, физики, химики и так далее).

Мне интересно описание процесса решения этой задачи (пишите в своей статье в новом разделе) и качественный анализ полученного результата. См. как это сделано в главе Аниме#Анализ возраста, в котором сэйю озвучивают аниме. --Andrew Krizhanovsky (обсуждение) 17:36, 11 ноября 2021 (UTC)Ответить

@Леонид, дал разделу краткое название. Суть задачи спрятал в текста раздела. --Andrew Krizhanovsky (обсуждение) 09:39, 30 ноября 2021 (UTC)Ответить

Диаграмма доли населения страны, проживающего в «населённых пунктах» править

@Леонид, у меня вопросы по этой диаграмме, то есть к скрипту w.wiki/4T4s.

  1. Почему, если запустить скрипт, то на первом месте видим Нигерию, а у Вас — Ниуэ? Это такой творческий crop рисунка?
  2. Сюда попало много небольших и островных государств. Предлагаю поставить фильтр, например 5 млн человек в стране. Если меньше, то не учитываем. Тогда получится отсечь небольшие страны. Вот небольшой скрипт w.wiki/4Y56 (тут видно проблему, что у страны есть несколько значений свойства population и нужно брать то, у которого стоит максимальное значение квалификатора point in time, см., например, Costa Rica). Возможно, эта же проблема есть и у населённых пунктов, то есть несколько вариантов свойства population. --Andrew Krizhanovsky (обсуждение) 19:26, 11 декабря 2021 (UTC)Ответить
  1. @Andrew Krizhanovsky : Так обыграл excel.
  2. Могу предложить только такой вариант w.wiki/4YqK. Мне не понятно как можно извлечь переменную point in time. --Леонид (обсуждение) 22:30, 14 декабря 2021 (UTC)Ответить
@Леонид, "point in time" свойство у свойства объекта называется "квалификатор". На странице с примерами d:Wikidata:SPARQL query service/queries/examples сделайте поиск по слову "qualifier". Примеры там есть.
Ещё посмотрите учебник в Викиучебнике: b:en:SPARQL/WIKIDATA Qualifiers, References and Ranks.
В этом скрипте к строчке "FILTER (?pop > 5000000)." хорошо бы коротенький комментарий про то, что только страны с 5 млн оставляем. --Andrew Krizhanovsky (обсуждение) 13:30, 17 декабря 2021 (UTC)Ответить

Правки LATEX править

Подклассы

@Andrew Krizhanovsky,

  1. Насчет подклассов: например Village не является прямым подклассом human settlement. --Леонид (обсуждение) 11:30, 18 декабря 2021 (UTC)Ответить
  • @Леонид, ну и что, пусть Village мы не учтём. Зато другие подклассы учтём.
  • Сделайте поиск слова "подкласс" на странице Аниме, там увидите скрипт, где с помощью конструкции wdt:P279* можно получить весь список населённых пунктов с учётом всех подклассов. Используйте, пожалуйста, эту конструкцию. --Andrew Krizhanovsky (обсуждение) 21:41, 18 декабря 2021 (UTC)Ответить

rdfs:label versus SERVICE wikibase:label править

  1. Вот два запроса используя rdfs и не используя rdfs. Результаты запроса даже различаются.
  2. Вот запрос. Результаты запроса показывают с чем совместно указывается класс human_settlement. --Леонид (обсуждение) 11:30, 18 декабря 2021 (UTC)Ответить
  • @Леонид, рассмотрим этот фрагмент Вашего скрипта:
 SERVICE wikibase:label { bd:serviceParam wikibase:language "en".
                        ?spec rdfs:label ?specLabel.}
  1. Мне непонятно, какое отношение имеет вторая строчка ("?spec rdfs:label ?specLabel.") к сервису "wikibase:label"? То есть правильнее было бы закрыть скобку в конце первой строчки, а не второй.
  2. В этом примере одна строчка "?spec rdfs:label ?specLabel." даёт ровно столько же результатов, как две строчки (rdfs:label и SERVICE), поэтому есть смысл оставить только rdfs:label.
  • Я правда не понял, зачем Вы взяли чужой пример со специальностями учёных из академий. Давайте лучше рассматривать наши примеры, например, скрипт, который Вы тоже приводите с переменной ?klass.
  1. Вариант 1:
  SERVICE wikibase:label{bd:serviceParam wikibase:language"ru,en".
    ?klass rdfs:label ?klassLabel.
    ?hum rdfs:label ?humLabel.}
  1. Вариант 2:
  SERVICE wikibase:label{bd:serviceParam wikibase:language"ru,en".}

Учёные в селе и городе править

@Леонид, отвечаю по поводу Вашего вопроса выше: "два запроса используя rdfs и не используя rdfs имеют разные результаты".

rdfs надо использовать. Такой вывод я сделал, посмотрев скрипты на странице d:Wikidata:SPARQL query service/queries/examples.

списки профессий в России по десятилетиям

Глядя на два Ваши два запроса выше, я написал свой запрос w.wiki/4b3R. Здесь я вывожу списки профессий в России по десятилетиям. Обратите внимание на именование переменных и на то, что я округляю дату год рождения до десятилетия, чтобы выводить данные не на каждый год.

# List of occupations (in Russian) of peoples in Russia each ten years
SELECT ?human_count ?lapse ?jobs 
WHERE {
  {
  SELECT (COUNT(?hum) AS ?human_count) ?lapse (GROUP_CONCAT(DISTINCT ?jobLabel; SEPARATOR=", ") AS ?jobs)
  WHERE {
    ?hum wdt:P27 wd:Q159. # citizen of Russia 
    ?hum wdt:P106 ?job.  # has occupation or job
  
    ?hum wdt:P569 ?birthday. # date of birth
    BIND(FLOOR(YEAR(?birthday)/10)*10 AS ?lapse). # count for each 10 years
    FILTER(?lapse > 1900 && ?lapse < 1970).
    
    SERVICE wikibase:label {
      bd:serviceParam wikibase:language "ru".
      ?job rdfs:label ?jobLabel.
    }
  }
  GROUP BY ?lapse
  ORDER BY ?lapse
  }.
  SERVICE wikibase:label {bd:serviceParam wikibase:language "ru"}
}
Выбор "учёных" (научная степень против академии)

Учёный - это тот, кто имеет научную степень, или тот, кто состоит в какой-либо академии?

Вот скрипт w.wiki/4b3w, где я считаю людей с научными степенями в России, СССР и Российской империи.

# List of peoples in Russian with academic degree
SELECT (COUNT(DISTINCT ?hum) AS ?human_count) 
WHERE {
         # Russian Empire, Soviet Union and Russia
  VALUES ?ruCountries {wd:Q34266 wd:Q15180 wd:Q159}
  ?hum wdt:P512 ?academic_degree.  # has academic degree 
  ?hum wdt:P27 ?ruCountries. # lives (lived) in Russian countries
  
  SERVICE wikibase:label {bd:serviceParam wikibase:language "ru".}
}

Получилось 24 тыс. человек россиян с научной степенью.

Теперь подсчитаем число россиян, входящих в какие-либо академии (источник - работа Е. Д. Трубиной, листинг 15 на с. 38).

# Number of peoples in Russia, which are members of academies
SELECT (COUNT(DISTINCT ?hum) AS ?human_count) 
WHERE {
         # Russian Empire, Soviet Union and Russia
  VALUES ?ruCountries {wd:Q34266 wd:Q15180 wd:Q159}
  ?hum wdt:P512 ?academic_degree.  # has academic degree 
  ?hum wdt:P27 ?ruCountries. # lives (lived) in Russian countries
  
  VALUES ?class_academy {wd:Q414147 wd:Q955824 wd:Q748019
  wd:Q31855 wd:Q2385804 wd:Q162633} # types of academies
  ?hum wdt:P463 ?academy. # member of academy
  ?academy wdt:P31 ?class_academy. # academy is an element of the class_academy
  
  SERVICE wikibase:label {bd:serviceParam wikibase:language "ru".}
}

Скрипт w.wiki/4b3u дал нам 2632 "академика", то есть в десять раз меньше, чем если считать по степеням. Тогда будем считать не по академиями, а по научным степеням, чтобы не потерять учёных. --Andrew Krizhanovsky (обсуждение) 21:19, 22 декабря 2021 (UTC)Ответить

Что рисовать в цветных квадратиках: научные направления или типы н.п. править

квадратики — научные направления

Ещё раз перечитал предложенную задачу и посмотрел на два Ваших рисунка (рис. 9.5 и рис. 9.6).

Думаю, что если брать научные направления, как они есть, просто свойство "occupation" имеет следующие недостатки:

  1. этих работ / занятий / направлений слишком много, чтобы получить какую-то понятную картину, видим хаос.
  2. много мусора и ненаучных направлений / работ затёсывается. Например, на рис. 9.6. есть всё от баспописца до мореплавателя.

Если мы хотим всё-таки разумно и чётко нарисовать научные направления, то я бы предложил следующие шаги:

  1. Определить основные научные направления, представленные в Викиданных.
  2. Построить запрос, который через "instance of" или другим образом будет отвечать на вопрос: данное свойство occupation соотносится с каким-либо из научных направлений (определённых на первом шаге)? Если "да", то учитывать его. Если "нет", то пропускать. Таким образом, на итоговой диаграмме будет небольшое количество научных направлений, может 10, может 30, зависит от Вас.
квадратики — типы населённых пунктов

Можно решить задачу по иному. Возможно, проще. Идея такая: не рассматриваем научные направления. Смотрим только степени (нужно оговориться, что вероятно многих учёных начала 20 века и ранее мы потеряем, сколько?).

Итак смотрим только степени и типы населённых пунктов. У каждого типа - будет свой цветной квадратик на диаграмме.

Открытые вопросы к этому второму виду задачи:

  • По годам или по пятилеткам, или по десятилетиямм приводить данные?
  • Делать две диаграммы (городские и сельские н.п.) или всё на одной диаграмме разместить, а читатель пусть сам судит, какие типы поселений он считает городскими, какие - сельскими.

Для ответа на эти два вопроса, нужно построить диаграммы и увидеть их. --Andrew Krizhanovsky (обсуждение) 10:11, 23 декабря 2021 (UTC)Ответить

LaTeX английский доперевести править

1) Почему-то на странице vi (или 7) это содержание, половина подразделов главы без номеров.

2) Вместо слова "domestic" (домашний) используйте слово "Russian", поскольку для разных иностранцев отечество будет разным.

Это разница между \section и \subsection.

3) Вместо ссылки знаки вопроса:

Calculate how many people per km 2 live in and in Which of these human settlements has the highest population density? See ?? on page ??

Километр в квадрате без пробела: per km\textsuperscript{2}

4) Bubble chart in Figure ?? shows

5) Query 8.3: - скрипт выдаёт результаты на русском. Должно быть: "en" вместо "ru,en"

Соответственно Figure 8.2 должен быть на английском.

6) Ссылка на ответ к рисунку почему-то до рисунка, не видно за картинкой. Проще этот текст добавить в конец подписи к картинке: See 17.8.2 on page 116. И не просто "смотри", а "смотри ответ...".

7) In Figure ??, you can see the list of countries for 2021:

8) in the property “instance of”” on page ??. --Andrew Krizhanovsky (обсуждение) 15:27, 9 января 2022 (UTC)Ответить

Вернуться на страницу «Программирование Викиданных/Населённые пункты».