Программирование Викиданных/Города

Материал из Викиверситета
Перейти к навигации Перейти к поиску

Статья посвящена исследованию различных типов городов, соответствующих четырём объектам Викиданных — «малый город», «город», «большой город» и «города-миллионеры». С помощью SPARQL-запросов к Викиданным получены данные о количестве экземпляров исследуемых объектов и решены следующие задачи:

  • Подсчёт и анализ численности населения разных типов городов,
  • Определение числа городов, не имеющих побратимов,
  • Построение списка городов, упорядоченных по числу побратимов,
  • Нахождение числа городов с определённым числом побратимов,
  • Определение страны с наибольшим числом побратимов,
  • Нахождение ближайших соседей России по числу городов-побратимов.


Экземпляры[править]

«Малый город»[править]

  • Элемент Викиданных: Q3957
SELECT ?city ?cityLabel WHERE {
    ?city wdt:P31 wd:Q3957.
    SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" }
}

SPARQL-запрос, 13800 записей (2020).

«Город»[править]

  • Элемент Викиданных: Q515
SELECT ?city ?cityLabel WHERE {
  ?city wdt:P31 wd:Q515.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" }
}

SPARQL-запрос, 20800 записей (2017), 9260 записей (2020).

Наиболее полно описанными городами на Викиданных являются: Сан-Франциско, Берлин, Петрозаводск, …

Почти пустыми и малоинформативными городами оказались: Мадинат Зайед, Музаффарпур, Уиллоу-Ривер , …

Среди отечественных «городов» в Викиданных больше всего свойств по данным ProWD у Новороссийска (31 свойство). Лидером по «городам» всего мира является Сингапур (104 свойства).

«Большой город»[править]

  • Элемент Викиданных: Q1549591
SELECT ?city ?cityLabel WHERE {
  ?city wdt:P31 wd:Q1549591.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" }
}

SPARQL-запрос, 198 записей (2017), 3075 записей (2020).

Наиболее полно описанными большими городами на Викиданных являются: Берн, Берлин, Женева, …

Почти пустыми и малоинформативными большими городами оказались: Баланга (Нигерия), Унгаран, Каес, …

Среди отечественных «больших городов» в Викиданных больше всего свойств по данным ProWD у Москвы (76 свойств). Лидером по «большим городам» всего мира является Сингапур (104 свойства).

«Города-миллионеры»[править]

  • Элемент Викиданных: Q1637706
SELECT ?city ?cityLabel WHERE {
    ?city wdt:P31 wd:Q1637706.
    SERVICE wikibase:label { bd:serviceParam wikibase:language "ru" }
}

SPARQL-запрос, 616 записей (2020).

Разные типы городов[править]

SELECT ?city ?cityLabel WHERE {                                     # Selecting items which are ...
  { ?city wdt:P31 wd:Q3957 } UNION                                  # ... instances of "town" ...
  { ?city wdt:P31 wd:Q515 } UNION                                   # ... instances of "city" ...
  { ?city wdt:P31 wd:Q1549591 } UNION                               # ... instances of "big city" ...
  { ?city wdt:P31 wd:Q1637706 }                                     # ... instances of "city with millions of inhabitants"
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru". }
}

SPARQL-запрос, 26751 запись (2020).

Численность населения[править]

«Малый город»[править]

Используются:

SELECT (SUM(?population_city) as ?sum) WHERE {                    # Selecting total population of items which are
  SELECT (MAX(xsd:integer(REPLACE(STR(?population),"\\.",""))) as ?population_city) ?city WHERE {
    ?city wdt:P31 wd:Q3957.                                       # ... instances of "town" ...
    ?city wdt:P1082 ?population                                   # ... with filled property "population"
  }
  GROUP BY ?city
}

SPARQL-запрос, 53,3 млн чел. (2020).

«Город»[править]

Используются:

SELECT (SUM(?population_city) as ?sum) WHERE {                    # Selecting total population of items which are
  SELECT (MAX(xsd:integer(REPLACE(STR(?population),"\\.",""))) as ?population_city) ?city WHERE {
    ?city wdt:P31 wd:Q515.                                        # ... instances of "city" ...
    ?city wdt:P1082 ?population                                   # ... with filled property "population"
  }
  GROUP BY ?city
}

SPARQL-запрос, 1 133,56 млн чел. (2020).

«Большой город»[править]

Используются:

SELECT (SUM(?population_city) as ?sum) WHERE {                    # Selecting total population of items which are
  SELECT (MAX(xsd:integer(REPLACE(STR(?population),"\\.",""))) as ?population_city) ?city WHERE {
    ?city wdt:P31 wd:Q1549591.                                    # ... instances of "big city" ...
    ?city wdt:P1082 ?population                                   # ... with filled property "population"
  }
  GROUP BY ?city
}

SPARQL-запрос, 2 538,49 млн чел. (2020).

«Города-миллионеры»[править]

Используются:

SELECT (SUM(?population_city) as ?sum) WHERE {                    # Selecting total population of items which are
  SELECT (MAX(xsd:integer(REPLACE(STR(?population),"\\.",""))) as ?population_city) ?city WHERE {
    ?city wdt:P31 wd:Q1637706.                                    # ... instances of "city with millions of inhabitants" ...
    ?city wdt:P1082 ?population                                   # ... with filled property "population"
  }
  GROUP BY ?city
}

SPARQL-запрос, 2 118,39 млн чел. (2020).

Анализ[править]

В разных странах используются различные символы в качестве разделителей разрядов, например, точка, запятая или пробел. Как результат, варианты представления значения свойства population также могут быть различны. Проблемы возникают при использовании точки, поскольку в Викиданных этот символ является разделителем целой и десятичной частей числа. Для устранения неоднозначности необходимо использовать функцию REPLACE, позволяющую удалить указанный символ. Данное преобразование не влияет на само значение, так как численность населения априори является целым числом, а разделители разрядов используются исключительно для упрощения чтения.

В таблице приведена сводная информация о численности населения разных типов городов, а также рассчитана доля населения, приходящегося на каждый тип города, от общего населения Земли, достигшего примерно 7,8 млрд человек на 2020 год[1]. Согласно Викиданным почти три четверти населения планеты проживает в городах.

Тип города Численность населения
(млн чел.)
% от общего
населения Земли
«малый город» 53,30 0,7 %
«город» 1 133,56 14,5 %
«большой город» 2 538,49 32,5 %
«города-миллионеры» 2 118,39 27,1 %
Всего 5 843,74 74,8 %

Города-побратимы[править]

Города-побратимы (породнённые города) – это города различных государств, установившие между собой постоянные дружественные связи с целью укрепления международных отношений в областях культуры, экономики, создания и управления городской инфраструктурой, функционирования гражданского общества и так далее[2].

Сколько городов обходятся без городов-побратимов?[править]

Используются:

SELECT (COUNT(?city) as ?count) WHERE {                             # Counting items which are ... 
  { ?city wdt:P31 wd:Q3957 } UNION                                  # ... instances of "town" ...
  { ?city wdt:P31 wd:Q515 } UNION                                   # ... OR instances of "city" ...
  { ?city wdt:P31 wd:Q1549591 } UNION                               # ... OR instances of "big city" ...
  { ?city wdt:P31 wd:Q1637706 }                                     # ... OR instances of "city with millions of inhabitants"
  FILTER NOT EXISTS { ?city wdt:P190 [] }                           # ... with unfilled property "sister city"
}

SPARQL-запрос, 21479 городов (2020).

Всего городов четырёх типов на 2020 год Викиданным известно 26751. Таким образом, только для 20% городов известны города-побратимы.

Упорядоченный список городов по числу побратимов[править]

Все[править]

Используются:

SELECT ?city ?cityLabel (COUNT(?sister) AS ?sisterCount) WHERE {     # Counting sister cities of cities which are ...
  { ?city wdt:P31 wd:Q3957 } UNION                                   # ... instances of "town" ...
  { ?city wdt:P31 wd:Q515 } UNION                                    # ... OR instances of "city" ...
  { ?city wdt:P31 wd:Q1549591 } UNION                                # ... OR instances of "big city" ...
  { ?city wdt:P31 wd:Q1637706 }                                      # ... OR instances of "city with millions of inhabitants"
  ?city wdt:P190 ?sister.                                            # ... with filled property "sister city"
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru". }
}
GROUP BY ?city ?cityLabel                                            # Grouping by city
ORDER BY DESC(?sisterCount)                                          # Sorting by number of sister cities (descending)

SPARQL-запрос, 4046 городов с побратимами (2020).

Россия[править]

Используются:

SELECT ?city ?cityLabel (COUNT(?sister) AS ?sisterCount) WHERE {     # Counting sister cities of cities which are ...
  VALUES ?cityTypes {wd:Q3957 wd:Q515 wd:Q1549591 wd:Q1637706}
  ?city wdt:P31 ?cityTypes.                                          # ... instances of different types of cities ...
  ?city wdt:P17 wd:Q159.                                             # ... belonging to Russia ...
  ?city wdt:P190 ?sister.                                            # ... with filled property "sister city"
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru". }
}
GROUP BY ?city ?cityLabel                                            # Grouping by city
ORDER BY DESC(?sisterCount)                                          # Sorting by number of sister cities (descending)

SPARQL-запрос, 82 города с побратимами (2020).

С культурной столицей России желающих дружить нашлось больше (230 побратимов), чем с официальной столицей (134 побратима) на 2020 год. Почти одинаковое число побратимов делят Омск (58), Волгоград (56) и Калининград (54). У Петрозаводска, Перми, Владимира и Белгорода по 14 побратимов.

Число городов с определённым числом побратимов[править]

Все[править]

Используются:

#defaultView:LineChart                                                   # Do line chart as result representation
SELECT ?sisterCount (COUNT(?sisterCount) AS ?FreqNSister) WHERE {        # Count No. of cities having ?sisterCount sister cities                                                                        
                                                                         # and number of sister cities themselves
  {
     SELECT (COUNT(?sister) AS ?sisterCount) WHERE {                     # Count sister cities of cities which are ...
       VALUES ?cityTypes {wd:Q3957 wd:Q515 wd:Q1549591 wd:Q1637706}
       ?city wdt:P31 ?cityTypes.                                         # ... instances of different types of cities ...
       ?city wdt:P190 ?sister.                                           # ... with filled property "sister city"
     }
     GROUP BY ?city                                                      # Group list by city
  }
}
GROUP BY ?sisterCount                                                    # Group by number of sister cities
ORDER BY DESC(?sisterCount)                                              # Order by number of sister cities (descending)

SPARQL-запрос, 90 вариантов числа братских городов (2020).

Зависимость числа городов всего мира (N) от числа имеющихся у этих городов побратимов (S), 2020
Зависимость числа городов всего мира (N) от числа имеющихся у этих городов побратимов (S) в логарифмической шкале, 2020


Чуть более четырех тысяч городов (4046 городов) побратались хотя бы с одним городом, из них:

  • 32% (1314 городов) связаны братскими отношениями более чем с пятью городами;
  • 18% (728 городов) имеют как минимум 11 городов-побратимов;
  • 9% (345 городов) подружились более чем с 20 городами;
  • 2% (94 города) имеют от 50 побратимов.

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

Россия[править]

Используются:

#defaultView:LineChart                                                   # Do line chart as result representation
SELECT ?sisterCount (COUNT(?sisterCount) AS ?FreqNSister) WHERE {        # Count No. of cities having ?sisterCount sister cities                                                                        
                                                                         # and number of sister cities themselves
  {
     SELECT (COUNT(?sister) AS ?sisterCount) WHERE {                     # Count sister cities of cities which are ...
       VALUES ?cityTypes {wd:Q3957 wd:Q515 wd:Q1549591 wd:Q1637706}
       ?city wdt:P31 ?cityTypes.                                         # ... instances of different types of cities ...
       ?city wdt:P17 wd:Q159.                                            # ... belonging to Russia ...
       ?city wdt:P190 ?sister.                                           # ... with filled property "sister city"
     }
     GROUP BY ?city                                                      # Group list by city
  }
}
GROUP BY ?sisterCount                                                    # Group by number of sister cities
ORDER BY DESC(?sisterCount)                                              # Order by number of sister cities (descending)

SPARQL-запрос, 24 варианта числа братских городов (2020).

Зависимость числа городов России (N) от числа имеющихся у этих городов побратимов (S), 2020


Чуть менее ста городов России (82 города) побратались хотя бы с одним городом, из них только 48% (39 городов) связаны братскими отношениями более чем с пятью городами.

У какой страны больше всего побратимов?[править]

Используются:

#defaultView:BubbleChart
SELECT ?countryLabel (COUNT(?sister) as ?sisterCount) WHERE {       # Selecting number of distinct sister cities of particular country cities which are ... 
  SELECT DISTINCT ?countryLabel ?sister WHERE {                           
    VALUES ?cityTypes {wd:Q3957 wd:Q515 wd:Q1549591 wd:Q1637706}
    ?city wdt:P31 ?cityTypes.                                       # ... instances of different types of cities ...
    ?city wdt:P17 ?country.                                         # ... with filled property "country" ...
    ?city wdt:P190 ?sister.                                         # ... with filled property "sister city"
    SERVICE wikibase:label { bd:serviceParam wikibase:language "ru". }
  }                                 
}
GROUP BY ?countryLabel
ORDER BY DESC(?sisterCount)

SPARQL-запрос, 208 стран (2020).

Пузырьковая диаграмма стран мира, размер шарика – число побратимов у городов страны, 2020


На 2020 год больше всего побратимов имела Германия (1375 городов).

Список стран, имеющих побратимы с городами Германии[править]

Используются:

SELECT ?country ?countryLabel (COUNT(DISTINCT ?sister) as ?sisterCount) WHERE {  
                                                                         # Selecting number of distinct particular country sister cities of cities which are ...
    VALUES ?cityTypes {wd:Q3957 wd:Q515 wd:Q1549591 wd:Q1637706}
    ?city wdt:P31 ?cityTypes.                                            # ... instances of different types of cities ...
    ?city wdt:P17 wd:Q183.                                               # ... belonging to Germany ...
    ?city wdt:P190 ?sister.                                              # ... with filled property "sister city" which are ...
    ?sister wdt:P17 ?country.                                            # ... with filled property "country" ...
    SERVICE wikibase:label { bd:serviceParam wikibase:language "ru". }
}
GROUP BY ?country ?countryLabel
ORDER BY DESC(?sisterCount)

SPARQL-запрос, 93 страны (2020).

В таблице приведен список из 10 стран, имеющих наибольшее количество побратимов с городами Германии (2020).

# Название страны Количество
городов-побратимов
% от общего
числа
1 Франция 247 18,0 %
2 Германия 195 14,2 %
3 Великобритания 120 8,7 %
4 Италия 86 6,3 %
5 Польша 81 5,9 %
6 США 60 4,4 %
7 Австрия 41 3,0 %
8 Россия 39 2,8 %
9 Венгрия 39 2,8 %
10 Бельгия 33 2,4 %

Ближайшие соседи России по числу городов-побратимов[править]

Используются:

#defaultView:Map
SELECT ?country ?countryLabel ?sisterCount ?shape ?layer WHERE {
  { # Selecting number of distinct particular country sister cities of cities which are ...
    SELECT ?country ?countryLabel (COUNT(DISTINCT ?sister) as ?sisterCount) WHERE {  
      VALUES ?cityTypes {wd:Q3957 wd:Q515 wd:Q1549591 wd:Q1637706}
      ?city wdt:P31 ?cityTypes.         # instances of different types of cities
      ?city wdt:P17 wd:Q159.            # city belongs to Russia
      ?city wdt:P190 ?sister.           # city has "sister city"
      ?sister wdt:P17 ?country.         # which belongs to "country"
      FILTER(?country NOT IN(wd:Q159))  # except the Russia
      SERVICE wikibase:label { bd:serviceParam wikibase:language "ru". }
    }
    GROUP BY ?country ?countryLabel
    ORDER BY DESC(?sisterCount)
  }
  OPTIONAL {?country wdt:P3896 ?shape.} # country has "geoshape"
  BIND(
    IF(?sisterCount < 5, "<5",
    IF(?sisterCount <= 10, "5-10",
    IF(?sisterCount <= 20, "11-20",
    IF(?sisterCount <= 30, "21-30",
    IF(?sisterCount <= 40, "31-40",
    ">40"))))) AS ?layer).
}

SPARQL-запрос, 102 страны (2020).

Карта ближайших соседей России по числу городов-побратимов, 2020


Больше двадцати городов-побратимов у России с такими странами, как США (46), Китай (46), Германия (44), Украина (28), Болгария (25), Польша (24), Франция (23) и Италия (22).

Полнота и недостатки Викиданных[править]

Городом принято называть крупный населённый пункт, жители которого, как правило, не заняты сельским хозяйством. При этом разные страны используют различные критерии при наделении поселений статусом города, основным из которых является численность населения. Некоторые страны и вовсе не применяют понятие города. Так, во Франции используется только одна географическая единица подобного рода — коммуна, вне зависимости от количества проживающих в ней людей и рода их деятельности. Поэтому чётко определить, какой населенный пункт относить к городам, а какой нет, может быть затруднительно.

На практике некоторые объекты Викиданных могут одновременно являться экземплярами городов разных типов. Например, Шанхай отнесен к трём исследуемым объектам: city, big city, city with millions of inhabitants. Нетрудно догадаться, что такое множественное присваивание сказывается на результатах SPARQL-запросов, в частности, с использованием конструкции UNION. Это несложно проверить, выполнив, например, SPARQL-запрос по нахождению городов разных типов. Шанхай встречается в результатах три раза.

Викиданные имеют механизм наследования, выражающийся в свойстве subclass of. Заключается этот механизм в том, что если объект является экземпляром big city, то он является и экземпляром city, так как big city — подкласс city. Таким образом, описанную выше ситуацию с Шанхаем можно разрешить, оставив только один класс city with millions of inhabitants. Стоит отметить, что замена конструкции с использованием UNION на конструкцию с учётом подклассов неэквивалентна.

# Selecting items which are ...
SELECT ?city ?cityLabel WHERE {
	# ... instances of "city" ...                  
	{ ?city wdt:P31 wd:Q515 } UNION    
	# ... instances of "big city" ...                               
	{ ?city wdt:P31 wd:Q1549591 } UNION     
	# ... instances of "city with millions of inhabitans"                          
	{ ?city wdt:P31 wd:Q1637706 }                                     
	SERVICE wikibase:label { bd:serviceParam wikibase:language "ru". }
}

SPARQL-запрос

# Selecting items which are ...
SELECT ?city ?cityLabel WHERE {
	# ... instances of "city" subclasses 
	?city wdt:P31/wdt:P279* wd:Q515
	SERVICE wikibase:label { bd:serviceParam wikibase:language "ru". }
}

SPARQL-запрос

Рассмотренный ранее Шанхай встречается в новой выборке даже четыре раза. Дело в том, что помимо части исследуемых классов есть и другие наследуемые от city. Например, lost city, free imperial city, autonomous city и даже ideal city.

Также, вероятно, в связи с неоднозначностью критериев присвоения статуса города, были созданы подклассы для конкретных стран — city in Chile, city in Cyprus, city of Japan и так далее. Не обошла стороной эта тенденция и города России, что можно было заметить при сравнении результатов SPARQL-запроса для нахождения экземпляров объекта «город». На 2020 год большинство из них принадлежат классу city/town.

По данным всероссийской переписи населения (2010)[3] и переписи населения в Крымском федеральном округе (2014)[4] суммарное число городов России составило 1117 на 2014 год. Все города России имеют страницу как в Русской, так и в Английской Википедии.

Число элементов Викиданных, являющихся российскими городами — 1126[5]. Можно предположить, что Викиданные полностью покрывают, как минимум, российские города.

Будущая работа[править]

  1. Постройте граф братских городов России.
  2. Получите список городов России, находящихся за полярным кругом.
  3. На какой реке в России стоит наибольшее число городов?
  4. У какой страны самая большая доля городов-побратимов внутри страны относительно числа побратимов, которые связывают эту страну с другими странами?

Упражнения[править]

1 Какие из следующих городов были названы в честь географических объектов?

Тольятти
Тула
Черняховск
Курильск
Вологда
Обнинск

2 Какие из следующих флагов принадлежат таким российским городам, как Нижневартовск, Петропавловск-Камчатский, Нефтекамск и Карабулак?

Flag of Neftekamsk.svg
Flag of Karabulak (Ingushetia).png
Flag of Anenii Noi.svg
Flag of Nizhnevartovsk (Khanty-Mansia).svg
Flag of Pastavy.svg
Flag of Petropavlovsk-Kamchatsky (Kamchatka krai).png

3 Какие из следующих городов были основаны более 400 лет назад?

Москва
Саров
Казань
Астрахань
Самара
Воронеж

Проверка:

  1. города, названные в честь географических объектов
  2. флаги городов
  3. города, основанные более 400 лет назад

Примечания[править]

Ссылки[править]