Как работать с реестром
Цифры книги получены из выгрузки dataportals-registry в DuckDB (data/datasets/datasets.duckdb), выпуск 1.27.0 от 15 октября 2026 года, запросы от 15 октября 2026 года. Таблица catalogs — одна строка на каталог, таблица software — одна строка на платформу. Все цифры книги рассчитаны ровно по этому выпуску. Имена типов ниже — как в схеме реестра, не как заголовки глав.
Как получить выгрузку
Файл базы лежит в самом репозитории реестра, в папке data/datasets. Рядом те же записи в Parquet и JSONL: full.parquet и full.jsonl. Реестр обновляют каждые несколько дней, поэтому для проверки цифр книги нужен выпуск, по которому они посчитаны, а не последнее состояние репозитория:
git clone https://github.com/datenoio/dataportals-registry.git
cd dataportals-registry
git checkout v1.27.0
duckdb -readonly data/datasets/datasets.duckdb
Первым запросом сверьте общее число записей с итогом в главе «Каталоги в цифрах»: в выпуске 1.27.0 он даст 43 614.
SELECT count(*) FROM catalogs;
Если числа не совпали, у вас другая выгрузка, и остальные запросы тоже дадут другие цифры.
Каталоги по типам
SELECT catalog_type, count(*) AS n
FROM catalogs
GROUP BY 1
ORDER BY 2 DESC;
Платформы внутри каждого типа
SELECT catalog_type, sid, n
FROM (
SELECT catalog_type, software.id AS sid, count(*) AS n,
row_number() OVER (PARTITION BY catalog_type ORDER BY count(*) DESC) AS rn
FROM catalogs
GROUP BY 1, 2
)
WHERE rn <= 6
ORDER BY catalog_type, n DESC;
Доли самописных решений, API и закрытых каталогов по типам
SELECT catalog_type,
round(100.0 * count(*) FILTER (WHERE software.id = 'custom') / count(*), 0) AS pct_custom,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
round(100.0 * count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) / count(*), 1) AS pct_dead
FROM catalogs
GROUP BY 1
ORDER BY count(*) DESC;
Владельцы
SELECT owner.type, count(*) AS n
FROM catalogs
GROUP BY 1
ORDER BY 2 DESC;
Распространённость интерфейсов
SELECT e.type, count(*) AS n
FROM (SELECT unnest(endpoints) AS e FROM catalogs)
GROUP BY 1
ORDER BY 2 DESC
LIMIT 30;
Лицензии, национальные каталоги, DOI
Около 420 каталогов с текстом или ссылкой на лицензию, около 2 тысяч с DOI и 613 национальных — этот запрос. Глава о лицензиях.
SELECT
count(*) FILTER (WHERE rights.license_id IS NOT NULL
OR rights.license_url IS NOT NULL
OR rights.license_name IS NOT NULL) AS with_license,
count(*) FILTER (WHERE properties.is_national) AS n_national,
count(*) FILTER (WHERE properties.has_doi) AS with_doi,
count(*) AS total
FROM catalogs;
18 тысяч с определённой моделью лицензии и 5,6 тысячи с явной пометкой «неизвестно» — строки следующего запроса, не сумма с 420. Пустое значение — записи, которые глава не относит ни к одному варианту. Срезы не складываются в общее число каталогов: текст лицензии и модель лицензии — разные поля.
SELECT rights.rights_type AS model, count(*) AS n
FROM catalogs
GROUP BY 1
ORDER BY n DESC;
Ограниченный доступ, около 1,1 тысячи в той же главе, — значение restricted в списке access_mode.
SELECT mode, count(*) AS n
FROM (SELECT unnest(access_mode) AS mode FROM catalogs)
GROUP BY 1
ORDER BY n DESC;
Статусы и программный интерфейс
868 недействующих и 98 выведенных из эксплуатации — строки inactive и deprecated. 65% и 34% с интерфейсом и без него — доли api.
SELECT status, count(*) AS n
FROM catalogs
GROUP BY 1
ORDER BY n DESC;
SELECT
count(*) FILTER (WHERE api) AS with_api,
count(*) FILTER (WHERE NOT coalesce(api, false)) AS without_api,
count(*) AS total
FROM catalogs;
Доля интерфейса у списков наборов, около 14%, — тип Datasets list.
SELECT
count(*) AS n,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api
FROM catalogs
WHERE catalog_type = 'Datasets list';
Карта сайта, около 7 тысяч, — среди типов в запросе «Распространённость интерфейсов». Если нужно только её:
SELECT e.type, count(*) AS n
FROM (SELECT unnest(endpoints) AS e FROM catalogs)
WHERE lower(e.type) LIKE '%sitemap%'
GROUP BY 1
ORDER BY n DESC;
Владельцы, страны, состав
Местные органы, около 17,6 тысячи, и геопорталы среди них, около 14,4 тысячи:
SELECT catalog_type, count(*) AS n
FROM catalogs
WHERE owner.type = 'Local government'
GROUP BY 1
ORDER BY n DESC;
Страны в главе о цифрах. Каталог с несколькими странами попадёт в каждую. Записи без одной страны — отдельная строка с пустым или неоднозначным покрытием; в главе их около 1,8 тысячи.
SELECT country_id, count(*) AS n
FROM (
SELECT unnest(list_transform(coverage, x -> x.location.country.id)) AS country_id
FROM catalogs
)
GROUP BY 1
ORDER BY n DESC
LIMIT 15;
Состав содержимого в главе «Что публикуют»: один каталог может дать несколько строк.
SELECT t AS content_type, count(*) AS n
FROM (SELECT unnest(content_types) AS t FROM catalogs)
GROUP BY 1
ORDER BY n DESC;
Классификация: владельцы, доступ и классы ПО по типам
Глава «Как классифицировать каталоги». Владельцы внутри каждого типа — например, 58% геопорталов у местных органов власти и 85% научных репозиториев у университетов и научных организаций:
SELECT catalog_type, owner.type AS owner_type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (PARTITION BY catalog_type), 0) AS pct
FROM catalogs
GROUP BY 1, 2
ORDER BY catalog_type, n DESC;
Доля каталогов с ограниченным доступом хотя бы к части данных — 91% у маркетплейсов, 49% у каталогов микроданных:
SELECT catalog_type,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) AS restricted,
count(*) AS n,
round(100.0 * restricted / n, 0) AS pct
FROM catalogs
GROUP BY 1
ORDER BY pct DESC;
Классы ПО — поле subtype в таблице software. В главе они сведены в пять групп: облачный сервис (managed_saas_service), готовая платформа (подтипы *_platform), сервер или отраслевая система (geospatial_service_middleware, protocol_or_api_server, domain_data_infrastructure), сайт на CMS (cms_or_app_framework) и своя разработка (custom).
SELECT CASE WHEN c.software.id = 'custom' THEN 'custom' ELSE s.subtype END AS class,
count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 1) AS pct
FROM catalogs c
LEFT JOIN software s ON s.id = c.software.id
GROUP BY 1
ORDER BY n DESC;
Платформы, которые книга называет по имени
Идентификатор — software.id. Около 1 900 CKAN считаются только среди порталов открытых данных, не среди всех записей с этим id.
SELECT software.id AS sid, catalog_type, count(*) AS n
FROM catalogs
WHERE software.id IN (
'ckan', 'dkan', 'arcgishub', 'arcgisserver', 'geoserver', 'emapa',
'geonetwork', 'geonode', 'jkan', 'opensdg', 'datasette',
'opendatasoft', 'socrata', 'pxweb', 'nada', 'dspace',
'dataverse', 'inveniordm', 'invenio', 'custom'
)
GROUP BY 1, 2
ORDER BY n DESC;
Порталы открытых данных
Глава «Порталы открытых данных». Владельцы — 48% у местных органов власти, 19% у центральных:
SELECT owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 0) AS pct
FROM catalogs
WHERE catalog_type = 'Open data portal'
GROUP BY 1
ORDER BY n DESC;
Страны — Россия 572, США 565, Испания 485. Каталог с несколькими странами попадёт в каждую:
SELECT country_id, count(*) AS n
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id
FROM catalogs
WHERE catalog_type = 'Open data portal'
)
GROUP BY 1
ORDER BY n DESC
LIMIT 15;
Платформы с долей API и недействующих — CKAN 1906 и 95% с API, своя разработка 1144 и 19%:
SELECT software.id AS sid, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
round(100.0 * count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) / count(*), 1) AS pct_dead
FROM catalogs
WHERE catalog_type = 'Open data portal'
GROUP BY 1
ORDER BY n DESC
LIMIT 25;
Платформы у центральных и у местных органов власти — CKAN 420 и 707, Gosweb 421 только у местных:
SELECT owner.type, software.id AS sid, count(*) AS n
FROM catalogs
WHERE catalog_type = 'Open data portal'
AND owner.type IN ('Central government', 'Local government')
GROUP BY 1, 2
QUALIFY row_number() OVER (PARTITION BY owner.type ORDER BY count(*) DESC) <= 10
ORDER BY 1, n DESC;
Три главные платформы в каждой стране — так видно, что в России счёт дают разделы на Gosweb, в Италии — Municipium, в Японии — BODIK ODCS:
SELECT country_id, sid, n
FROM (
SELECT country_id, sid, count(*) AS n,
row_number() OVER (PARTITION BY country_id ORDER BY count(*) DESC) AS rn
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id,
software.id AS sid
FROM catalogs
WHERE catalog_type = 'Open data portal'
)
GROUP BY 1, 2
)
WHERE rn <= 3 AND country_id IN ('RU', 'US', 'ES', 'FR', 'IT', 'TH', 'ID', 'JP', 'CN')
ORDER BY country_id, n DESC;
Геопорталы
Глава «Геопорталы». Владельцы — 58% у местных органов власти. В главе центральные органы сложены с федеральными (Federal government), а «Прочие» — это Other и Community:
SELECT owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 0) AS pct
FROM catalogs
WHERE catalog_type = 'Geoportal'
GROUP BY 1
ORDER BY n DESC;
Страны — США 5050, Польша 2303, Чехия 1408. Три главные платформы в каждой стране — так видны местные поставщики (GISPLAN в Чехии, iObčina в Словении, わが街ガイド в Японии):
SELECT country_id, sid, n
FROM (
SELECT country_id, sid, count(*) AS n,
row_number() OVER (PARTITION BY country_id ORDER BY count(*) DESC) AS rn
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id,
software.id AS sid
FROM catalogs
WHERE catalog_type = 'Geoportal'
)
GROUP BY 1, 2
)
WHERE rn <= 3
ORDER BY country_id, n DESC;
Платформы с долей API и недействующих — ArcGIS Server 4674, своя разработка 1043 и 11% с API, GeoNode 11,2% недействующих. Российские геопорталы (286) считаются по стране владельца: добавьте AND owner.location.country.id = 'RU'.
SELECT software.id AS sid, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
round(100.0 * count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) / count(*), 1) AS pct_dead
FROM catalogs
WHERE catalog_type = 'Geoportal'
GROUP BY 1
ORDER BY n DESC
LIMIT 40;
Облачные сервисы местных поставщиков без ArcGIS Hub и e-mapa — 132 сервиса, около 5,3 тысячи геопорталов, API у 21%; у 104 сервисов API не отмечен ни на одном сайте:
WITH v AS (
SELECT c.software.id AS sid, count(*) AS n, count(*) FILTER (WHERE c.api) AS with_api
FROM catalogs c
JOIN software s ON s.id = c.software.id
WHERE c.catalog_type = 'Geoportal'
AND s.subtype = 'managed_saas_service'
AND c.software.id NOT IN ('arcgishub', 'emapa')
GROUP BY 1
)
SELECT count(*) AS vendors, sum(n) AS sites,
round(100.0 * sum(with_api) / sum(n), 0) AS pct_api,
count(*) FILTER (WHERE with_api = 0) AS vendors_without_api
FROM v;
Интерфейсы каталога у геопорталов — около 3,2 тысячи выгрузок DCAT-US и DCAT-AP у сайтов ArcGIS Hub, CSW у GeoNetwork и GeoNode, около 140 серверов STAC:
SELECT c.software.id AS sid, e.type, count(DISTINCT c.id) AS n
FROM (SELECT id, software, unnest(endpoints) AS e FROM catalogs WHERE catalog_type = 'Geoportal') c
WHERE e.type IN ('dcatus11', 'dcatap201', 'ogcrecordsapi', 'csw202', 'stacserverapi', 'oaipmh20')
GROUP BY 1, 2
HAVING n > 20
ORDER BY 2, n DESC;
Научные репозитории
Глава «Научные репозитории данных». Всего 8404, недействующих и выведенных 119, с ограниченным доступом 527:
SELECT count(*) AS n,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) AS restricted
FROM catalogs
WHERE catalog_type = 'Scientific data repository';
Владельцы — 85% у университетов и научных организаций:
SELECT owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 0) AS pct
FROM catalogs
WHERE catalog_type = 'Scientific data repository'
GROUP BY 1
ORDER BY n DESC;
Страны — США 2018, Германия 764, Великобритания 503; международные записаны как World:
SELECT country_id, count(*) AS n
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id
FROM catalogs
WHERE catalog_type = 'Scientific data repository'
)
GROUP BY 1
ORDER BY n DESC
LIMIT 20;
Платформы с долей API и недействующих — своя разработка 2836 и 5% с API, IPT 360 и 12% недействующих:
SELECT software.id AS sid, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
round(100.0 * count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) / count(*), 1) AS pct_dead
FROM catalogs
WHERE catalog_type = 'Scientific data repository'
GROUP BY 1
ORDER BY n DESC
LIMIT 30;
Главные платформы по странам — так видно WEKO3 в Японии, DABAR в Хорватии, OPUS в Германии:
SELECT country_id, sid, n
FROM (
SELECT country_id, sid, count(*) AS n,
row_number() OVER (PARTITION BY country_id ORDER BY count(*) DESC) AS rn
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id,
software.id AS sid
FROM catalogs
WHERE catalog_type = 'Scientific data repository'
)
GROUP BY 1, 2
)
WHERE rn <= 4 AND country_id IN ('US', 'DE', 'GB', 'JP', 'CN', 'HR', 'FR', 'RU', 'World')
ORDER BY country_id, n DESC;
Интерфейсы — OAI-PMH у 2068, карта сайта у 2029, DCAT около 200:
SELECT e.type, count(DISTINCT id) AS n
FROM (
SELECT id, unnest(endpoints) AS e
FROM catalogs
WHERE catalog_type = 'Scientific data repository'
)
GROUP BY 1
ORDER BY n DESC
LIMIT 25;
Темы — окружающая среда около 2,3 тысячи, живые организмы около 1,6 тысячи. Один репозиторий даёт несколько строк, темы взяты из двух справочников:
SELECT t.type, t.name, count(DISTINCT id) AS n
FROM (
SELECT id, unnest(topics) AS t
FROM catalogs
WHERE catalog_type = 'Scientific data repository'
)
GROUP BY 1, 2
ORDER BY n DESC
LIMIT 20;
Каталоги показателей
Глава «Каталоги показателей». Число, доля самописных, доля API и недействующие — 3405, 44%, 37% и 29:
SELECT count(*) AS n,
round(100.0 * count(*) FILTER (WHERE software.id = 'custom') / count(*), 0) AS pct_custom,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead
FROM catalogs
WHERE catalog_type = 'Indicators catalog';
Владельцы — 46% у центральных органов власти; доля самописных и API внутри каждой группы:
SELECT owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 0) AS pct,
round(100.0 * count(*) FILTER (WHERE software.id = 'custom') / count(*), 0) AS pct_custom,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api
FROM catalogs
WHERE catalog_type = 'Indicators catalog'
GROUP BY 1
ORDER BY n DESC;
Платформы с долей API — Swing 214, Knoema 125, PxWeb 110, DHIS2 74. У WordPress и Drupal поле api отмечает API самой CMS, а не рядов:
SELECT software.id AS sid, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
round(100.0 * count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) / count(*), 1) AS pct_dead
FROM catalogs
WHERE catalog_type = 'Indicators catalog'
GROUP BY 1
ORDER BY n DESC
LIMIT 30;
Страны у каждой платформы — так видно, что Swing — это Нидерланды и Бельгия, HCI — США, Géoclip — Франция, Knoema — Африка:
WITH t AS (
SELECT software.id AS sid,
unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id
FROM catalogs
WHERE catalog_type = 'Indicators catalog'
AND software.id IN ('swing', 'knoema', 'pxweb', 'dhis2', 'opensdg', 'hci', 'geoclip', 'statsuite', 'sdmxri')
)
SELECT sid, string_agg(country_id || ':' || n, ', ' ORDER BY n DESC) AS countries
FROM (SELECT sid, country_id, count(*) AS n FROM t GROUP BY 1, 2)
GROUP BY 1;
Каталоги с адресами SDMX — 170; адреса DCAT встречаются меньше чем у десятка:
SELECT count(*) FILTER (WHERE list_has_any(list_transform(endpoints, lambda e: e.type),
['sdmx:datastructure', 'sdmx:dataflows', 'sdmx-rest', 'sdmx:codelist', 'sdmx:conceptscheme'])) AS with_sdmx
FROM catalogs
WHERE catalog_type = 'Indicators catalog';
SELECT e.type, count(*) AS n
FROM (SELECT unnest(endpoints) AS e FROM catalogs WHERE catalog_type = 'Indicators catalog') t
WHERE lower(e.type) LIKE '%dcat%'
GROUP BY 1;
Поисковики и агрегаторы
Глава «Поисковики и агрегаторы». Владельцы — 68% у университетов и научных организаций. В главе «Сообщества и общественные организации» — это Community и Civil society, «Прочие» — Regional government и Other:
SELECT owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 0) AS pct
FROM catalogs
WHERE catalog_type = 'Data search engine'
GROUP BY 1
ORDER BY n DESC;
Территории — Евросоюз целиком 37, Италия 23, весь мир 21:
SELECT country_id, count(*) AS n
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id
FROM catalogs
WHERE catalog_type = 'Data search engine'
)
GROUP BY 1
ORDER BY n DESC
LIMIT 20;
Платформы с долей API и недействующих — OpenAIRE 50, своя разработка 35 и 20% с API, VIVO 28, Idra 6 и все недействующие:
SELECT software.id AS sid, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead
FROM catalogs
WHERE catalog_type = 'Data search engine'
GROUP BY 1
ORDER BY n DESC;
Полный список — так видны 17 итальянских UNIFIND на VIVO и демонстрационные стенды Idra:
SELECT software.id AS sid, owner.type AS owner_type, status, name, link
FROM catalogs
WHERE catalog_type = 'Data search engine'
ORDER BY sid, name;
Крупные поисковики, записанные другими типами, — Dateno, NIAID Discovery Portal, Research Data Australia, GESIS Search, DataONE, B2FIND, Earthdata Search, OmicsDI:
SELECT catalog_type, software.id AS sid, status, name, link
FROM catalogs
WHERE regexp_matches(lower(link),
'(dateno\.io|//data\.niaid|researchdata\.edu\.au|search\.gesis|//www\.dataone\.org|b2find|search\.earthdata|omicsdi)')
ORDER BY catalog_type, name;
Каталоги метаданных
Глава «Каталоги метаданных и реестры». Число, доля самописных, доля API, недействующие и с ограниченным доступом — 172, 38%, 67%, 0 и 18:
SELECT count(*) AS n,
round(100.0 * count(*) FILTER (WHERE software.id = 'custom') / count(*), 0) AS pct_custom,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) AS restricted
FROM catalogs
WHERE catalog_type = 'Metadata catalog';
Владельцы — 31% у университетов и научных организаций, 30% у международных организаций. В главе Community и Other сложены в «Сообщества и прочие»:
SELECT owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 0) AS pct
FROM catalogs
WHERE catalog_type = 'Metadata catalog'
GROUP BY 1
ORDER BY n DESC;
Платформы с долей API — своя разработка 65 и 17%, FAIR Data Point 47, Metadata Browser (mwmb) 16, Skosmos 10:
SELECT software.id AS sid, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api
FROM catalogs
WHERE catalog_type = 'Metadata catalog'
GROUP BY 1
ORDER BY n DESC;
Платформы по странам — так видно, что Нидерланды — это точки FAIR Data Point, Великобритания — Metadata Browser, Австралия — Aristotle:
SELECT country_id, sid, count(*) AS n
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id,
software.id AS sid
FROM catalogs
WHERE catalog_type = 'Metadata catalog'
)
GROUP BY 1, 2
ORDER BY country_id, n DESC;
Интерфейсы — DCAT в Turtle у 47 точек FAIR Data Point, REST API Skosmos у 9 установок, адреса SDMX у реестров на Fusion Metadata Registry:
SELECT software.id AS sid, e.type, count(DISTINCT id) AS n
FROM (
SELECT id, software, unnest(endpoints) AS e
FROM catalogs
WHERE catalog_type = 'Metadata catalog'
)
GROUP BY 1, 2
ORDER BY 1, n DESC;
ML-каталоги
Глава «ML-каталоги». Всего 100, недействующих 2, с ограниченным доступом 5, самописных 78%, с API 23%:
SELECT count(*) AS n,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) AS restricted,
round(100.0 * count(*) FILTER (WHERE software.id = 'custom') / count(*), 0) AS pct_custom,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api
FROM catalogs
WHERE catalog_type = 'Machine learning catalog';
Владельцы — 37 у университетов и научных организаций, 31 у компаний:
SELECT owner.type, count(*) AS n
FROM catalogs
WHERE catalog_type = 'Machine learning catalog'
GROUP BY 1
ORDER BY n DESC;
Страны — международные 34, США 19, Китай 12, Россия 6:
SELECT country_id, count(*) AS n
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id
FROM catalogs
WHERE catalog_type = 'Machine learning catalog'
)
GROUP BY 1
ORDER BY n DESC
LIMIT 15;
Платформы и доля API — своя разработка 78 и 13 с API, Jekyll 9:
SELECT software.id AS sid, count(*) AS n,
count(*) FILTER (WHERE api) AS with_api
FROM catalogs
WHERE catalog_type = 'Machine learning catalog'
GROUP BY 1
ORDER BY n DESC;
Полный список записей. По нему в главе записи вручную разложены на восемь видов — хабы, площадки соревнований, коллекции, сайты бенчмарков и другие; такого поля в реестре нет:
SELECT name, link, software.id AS sid, owner.type AS owner_type, api, status
FROM catalogs
WHERE catalog_type = 'Machine learning catalog'
ORDER BY sid, name;
Каталоги API, маркетплейсы и списки наборов
Глава «Каталоги API, маркетплейсы и списки наборов». Число, доля своих разработок, API и ограниченного доступа — 115, 74%, 51% и 14% у каталогов API; 56, 98%, 21% и 91% у маркетплейсов; 107, 89%, 14% и 1% у списков:
SELECT catalog_type, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE software.id = 'custom') / count(*), 0) AS pct_custom,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
round(100.0 * count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) / count(*), 0) AS pct_restricted
FROM catalogs
WHERE catalog_type IN ('API Catalog', 'Data marketplace', 'Datasets list')
GROUP BY 1;
Владельцы — 45% каталогов API у центральных органов власти, 70% маркетплейсов у компаний:
SELECT catalog_type, owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (PARTITION BY catalog_type), 0) AS pct
FROM catalogs
WHERE catalog_type IN ('API Catalog', 'Data marketplace', 'Datasets list')
GROUP BY 1, 2
ORDER BY 1, n DESC;
Страны — у маркетплейсов Южная Корея 16, США 12, Китай 6:
SELECT catalog_type, country_id, count(*) AS n
FROM (
SELECT catalog_type,
unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id
FROM catalogs
WHERE catalog_type IN ('API Catalog', 'Data marketplace', 'Datasets list')
)
GROUP BY 1, 2
QUALIFY row_number() OVER (PARTITION BY catalog_type ORDER BY count(*) DESC) <= 10
ORDER BY 1, n DESC;
Платформы — у каталогов API Azure API Management 22, WSO2 API Manager 2:
SELECT catalog_type, software.id AS sid, count(*) AS n,
count(*) FILTER (WHERE api) AS with_api
FROM catalogs
WHERE catalog_type IN ('API Catalog', 'Data marketplace', 'Datasets list')
GROUP BY 1, 2
ORDER BY 1, n DESC;
Транспортные порталы разработчиков, около 35 из 115, отобраны по названию и адресу; список стоит просмотреть глазами, потому что шаблон ловит и лишнее (Metropolia, gov.br/conecta):
SELECT name, link
FROM catalogs
WHERE catalog_type = 'API Catalog'
AND regexp_matches(lower(name || ' ' || link),
'transit|transport|metro|\bbus\b|rail|traffic|trafik|tmb|mta|bart|cta|marta|wmata|trimet|translink|entur|waltti|föli|foli|metlink|511|digitraffic|tdx|koroad|apiportal.ns|sptrans|oc transpo|skåne|cumtd|cota|deutschebahn');
Списки наборов на GitHub и GitLab — 16, история торгов криптобирж — 13:
SELECT
count(*) FILTER (WHERE regexp_matches(lower(name || ' ' || link), 'github.io|github.com|gitlab')) AS on_git,
count(*) FILTER (WHERE regexp_matches(lower(name || ' ' || link),
'binance|bybit|okx|kucoin|mexc|bitget|kraken|gatedata|bitmex|crypto|polymarket|paradigm')) AS crypto
FROM catalogs
WHERE catalog_type = 'Datasets list';
Карта сайта у каталогов API — 26 из 115:
SELECT catalog_type, e.type, count(DISTINCT id) AS n
FROM (
SELECT id, catalog_type, unnest(endpoints) AS e
FROM catalogs
WHERE catalog_type IN ('API Catalog', 'Data marketplace', 'Datasets list')
)
GROUP BY 1, 2
ORDER BY 1, n DESC;
Карта возможностей
Глава «Карта возможностей», запросы 15 октября 2026 года. Интерфейсы — по списку endpoints, DOI — по признаку has_doi; научные репозитории посчитаны вместе с универсальными. Разметку schema.org реестр почти не записывает, поэтому её доля не считается.
Доли по типам — DCAT у 26% порталов открытых данных, OAI-PMH у 25% и DOI у 17% научных репозиториев, CSW или OGC API Records у 20% геопорталов, SDMX у 5,2% каталогов показателей:
WITH t AS (
SELECT CASE WHEN catalog_type IN ('Scientific data repository', 'General research repository')
THEN 'Science' ELSE catalog_type END AS ct,
properties.has_doi AS doi,
list_transform(coalesce(endpoints, []), lambda e: lower(e.type)) AS et
FROM catalogs
)
SELECT ct, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE 'dcat%' OR x LIKE '%:dcatus11')) > 0) / count(*), 1) AS pct_dcat,
round(100.0 * count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE 'oai%')) > 0) / count(*), 1) AS pct_oai,
round(100.0 * count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE 'csw%' OR x LIKE 'ogcrecords%')) > 0) / count(*), 1) AS pct_csw_records,
round(100.0 * count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE '%sdmx%')) > 0) / count(*), 1) AS pct_sdmx,
round(100.0 * count(*) FILTER (WHERE doi) / count(*), 1) AS pct_doi
FROM t
WHERE ct IN ('Open data portal', 'Science', 'Geoportal', 'Indicators catalog')
GROUP BY 1
ORDER BY n DESC;
DCAT у порталов открытых данных по платформам — Socrata 239 из 245, OpenDataSoft 348 из 454, DKAN 103 из 161, CKAN 633 из 1906, своя разработка 24 из 1144:
SELECT software.id AS sid, count(*) AS n,
count(*) FILTER (WHERE len(list_filter(
list_transform(coalesce(endpoints, []), lambda e: lower(e.type)),
lambda x: x LIKE 'dcat%' OR x LIKE '%:dcatus11')) > 0) AS with_dcat
FROM catalogs
WHERE catalog_type = 'Open data portal'
GROUP BY 1
ORDER BY n DESC
LIMIT 10;
DOI и OAI-PMH у научных репозиториев по платформам — Figshare 266 DOI из 288, Dataverse 172 DOI и 177 OAI-PMH из 257, DSpace 218 DOI и 665 OAI-PMH из 829, своя разработка 158 DOI и 19 OAI-PMH из 2840:
SELECT software.id AS sid, count(*) AS n,
count(*) FILTER (WHERE properties.has_doi) AS with_doi,
count(*) FILTER (WHERE len(list_filter(
list_transform(coalesce(endpoints, []), lambda e: lower(e.type)),
lambda x: x LIKE 'oai%')) > 0) AS with_oai
FROM catalogs
WHERE catalog_type IN ('Scientific data repository', 'General research repository')
GROUP BY 1
ORDER BY n DESC
LIMIT 10;
Каталожный сервис у геопорталов по платформам — ArcGIS Hub 3257 из 3464, GeoNetwork 686 из 762, GeoNode 628 из 770, ArcGIS Server 1 из 4674, e-mapa 0 из 1927, своя разработка 4 из 1043:
SELECT software.id AS sid, count(*) AS n,
count(*) FILTER (WHERE len(list_filter(
list_transform(coalesce(endpoints, []), lambda e: lower(e.type)),
lambda x: x LIKE 'csw%' OR x LIKE 'ogcrecords%')) > 0) AS with_catalog_service
FROM catalogs
WHERE catalog_type = 'Geoportal'
GROUP BY 1
ORDER BY n DESC
LIMIT 10;
SDMX у каталогов показателей по платформам — из 177 каталогов 113 на Knoema:
SELECT software.id AS sid, count(*) AS n
FROM catalogs
WHERE catalog_type = 'Indicators catalog'
AND len(list_filter(
list_transform(coalesce(endpoints, []), lambda e: lower(e.type)),
lambda x: x LIKE '%sdmx%')) > 0
GROUP BY 1
ORDER BY n DESC;
Экспорт метаданных
Глава «Экспорт метаданных», запросы 15 октября 2026 года. Хотя бы один стандартный способ отдать описания — DCAT, OAI-PMH, CSW, OGC API Records, SDMX или STAC — у 9 330 каталогов из 43 614. Выгрузка DCAT есть у 5 233, сразу оба профиля, DCAT-US и DCAT-AP, — у 3 152. Разметку schema.org реестр почти не записывает, таких адресов 38:
WITH f AS (
SELECT list_transform(coalesce(endpoints, []), lambda e: lower(e.type)) AS et
FROM catalogs
)
SELECT count(*) AS n,
count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE 'dcat%' OR x LIKE '%dcatus11'
OR x = 'dcat-us')) > 0) AS dcat,
count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE 'dcatus11' OR x LIKE '%:dcatus11'
OR x = 'dcat-us')) > 0
AND len(list_filter(et, lambda x: x LIKE 'dcatap%')) > 0) AS both_profiles,
count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE 'dcat%' OR x LIKE '%dcatus11'
OR x = 'dcat-us' OR x LIKE 'oai%' OR x LIKE 'csw%' OR x LIKE 'ogcrecords%'
OR x LIKE '%sdmx%' OR x LIKE 'stac%')) > 0) AS any_standard,
count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE 'schemaorg%')) > 0) AS schemaorg
FROM f;
DCAT у порталов открытых данных по платформам — Socrata 239 из 245, OpenDataSoft 348 из 454, DKAN 103 из 161, CKAN 633 из 1906, своя разработка 24 из 1144. Запрос приведён в разделе «Карта возможностей».
API и массовая выгрузка
Глава «API и массовая выгрузка», запросы 15 октября 2026 года. Признак «есть программный вход» в реестре совпадает с непустым списком endpoints: 28 471 из 43 614. Стандартный способ забрать все описания — DCAT, OAI-PMH, CSW или OGC API Records — у 8 894 каталогов. Доли по типам — 70% геопорталов, 69% порталов открытых данных, 63% научных репозиториев, 37% каталогов показателей, 23% ML-каталогов:
WITH t AS (
SELECT catalog_type,
list_transform(coalesce(endpoints, []), lambda e: lower(e.type)) AS et
FROM catalogs
), f AS (
SELECT catalog_type,
len(et) > 0 AS any_ep,
len(list_filter(et, lambda x: x LIKE 'dcat%' OR x LIKE '%dcatus11' OR x LIKE 'oai%'
OR x LIKE 'csw%' OR x LIKE 'ogcrecords%')) > 0 AS all_desc,
len(list_filter(et, lambda x: x LIKE '%sitemap%')) > 0 AS sitemap
FROM t
)
SELECT coalesce(catalog_type, 'всего') AS catalog_type, count(*) AS n,
count(*) FILTER (WHERE any_ep) AS any_ep,
round(100.0 * count(*) FILTER (WHERE any_ep) / count(*), 0) AS pct_any,
count(*) FILTER (WHERE all_desc) AS all_desc,
round(100.0 * count(*) FILTER (WHERE all_desc) / count(*), 0) AS pct_all_desc,
round(100.0 * count(*) FILTER (WHERE sitemap) / count(*), 0) AS pct_sitemap
FROM f
GROUP BY ROLLUP (catalog_type)
ORDER BY n DESC;
Своя разработка против готовых платформ — 697 из 7 034 с программным входом и 58 со стандартной выгрузкой описаний у своих разработок, 76% с программным входом у остальных:
WITH t AS (
SELECT software.id = 'custom' AS is_custom,
list_transform(coalesce(endpoints, []), lambda e: lower(e.type)) AS et
FROM catalogs
)
SELECT is_custom, count(*) AS n,
count(*) FILTER (WHERE len(et) > 0) AS any_ep,
round(100.0 * count(*) FILTER (WHERE len(et) > 0) / count(*), 0) AS pct_any,
count(*) FILTER (WHERE len(list_filter(et, lambda x: x LIKE 'dcat%' OR x LIKE '%dcatus11'
OR x LIKE 'oai%' OR x LIKE 'csw%' OR x LIKE 'ogcrecords%')) > 0) AS all_desc
FROM t
GROUP BY 1;
Ленты RSS и Atom реестр записывает в основном у геопорталов и научных репозиториев, у порталов на CKAN их почти нет, хотя лента в ядре CKAN. Поэтому доля лент по реестру в главе не приводится.
Идентификаторы и DOI
Глава «Постоянные идентификаторы, DOI и версии», запросы 15 октября 2026 года. Пометка DOI — у 2008 каталогов из 43 614: 1396 научных репозиториев и 8 универсальных, 584 геопортала, остальные единичны:
SELECT catalog_type,
count(*) FILTER (WHERE properties.has_doi) AS with_doi,
count(*) AS n
FROM catalogs
GROUP BY 1
HAVING with_doi > 0
ORDER BY with_doi DESC;
Пометку в основном наследуют от карточки платформы (software.pid_support.has_doi), поэтому её надо читать как «платформа умеет». У GeoNetwork платформа отмечена «Yes», и пометку получили 555 установок из 764; у своих разработок платформа отмечена «No», и 175 пометок поставлены вручную:
SELECT c.software.id AS sid,
s.pid_support.has_doi AS platform_flag,
count(*) FILTER (WHERE c.properties.has_doi) AS with_doi,
count(*) AS n
FROM catalogs c
LEFT JOIN software s ON s.id = c.software.id
GROUP BY 1, 2
HAVING with_doi > 0
ORDER BY with_doi DESC
LIMIT 10;
Выборка для проверки Handle — 120 из 782 адресов OAI-PMH у действующих установок DSpace, в воспроизводимом случайном порядке. Для каждой у первой записи из ListIdentifiers берут Handle и проверяют его через https://hdl.handle.net/api/handles/…:
SELECT e.url
FROM (SELECT unnest(endpoints) AS e
FROM catalogs
WHERE software.id = 'dspace' AND status = 'active')
WHERE lower(e.type) LIKE 'oai%'
ORDER BY hash(e.url)
LIMIT 120;
Доступ, роли и процессы
Глава «Доступ, роли и процессы публикации», запросы 15 октября 2026 года. Ограниченный доступ хотя бы к части данных — у 1131 каталога из 43 614: у 537 только ограниченный, у 594 вместе с открытым:
SELECT count(*) AS total,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) AS restricted,
count(*) FILTER (WHERE access_mode = ['restricted']) AS only_restricted,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')
AND list_contains(access_mode, 'open')) AS mixed
FROM catalogs;
Доля по платформам — DHIS2 97%, NADA 72%, Pure 36% против CKAN 0,6% и Dataverse 1,9%:
SELECT software.id AS platform,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) AS restricted,
count(*) AS n,
round(100.0 * restricted / n, 1) AS pct
FROM catalogs
WHERE software.id IN ('nada', 'dhis2', 'gen3', 'redivis', 'pure', 'ckan', 'dataverse',
'dspace', 'inveniordm', 'geonetwork', 'opendatasoft', 'socrata', 'arcgishub')
GROUP BY 1
ORDER BY pct DESC;
Список для замера регистрации на порталах CKAN — 1839 действующих каталогов. Для каждого берут адрес API из точки входа ckan, а если её нет — адрес сайта с /api/3:
SELECT id, link, catalog_type, owner.type AS otype,
coverage[1].location.country.id AS country,
[x.url for x in endpoints if x.type = 'ckan'][1] AS api
FROM catalogs
WHERE software.id = 'ckan' AND status = 'active'
ORDER BY id;
Каталоги микроданных
Глава «Каталоги микроданных». Всего 326, неработающих 59, с ограниченным доступом 159, самописных 13%, с API 70%:
SELECT count(*) AS n,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) AS restricted,
round(100.0 * count(*) FILTER (WHERE software.id = 'custom') / count(*), 0) AS pct_custom,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api
FROM catalogs
WHERE catalog_type = 'Microdata catalog';
Владельцы и доля NADA у каждого — 55% у центральных органов власти, из них 59% на NADA; у международных организаций 90% на NADA:
SELECT owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (), 0) AS pct,
round(100.0 * count(*) FILTER (WHERE software.id = 'nada') / count(*), 0) AS pct_nada
FROM catalogs
WHERE catalog_type = 'Microdata catalog'
GROUP BY 1
ORDER BY n DESC;
Платформы с долей API и числом неработающих — NADA 158 и 47 неработающих, своя разработка 43 и 12% с API:
SELECT software.id AS sid, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead,
count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) AS restricted
FROM catalogs
WHERE catalog_type = 'Microdata catalog'
GROUP BY 1
ORDER BY n DESC;
Страны — 139 стран и 27 общемировых каталогов; США 18, Канада 12, Германия 11:
SELECT country_id, count(*) AS n
FROM (
SELECT unnest(list_transform(coverage, lambda x: x.location.country.id)) AS country_id
FROM catalogs
WHERE catalog_type = 'Microdata catalog'
)
GROUP BY 1
ORDER BY n DESC;
Неработающие каталоги без HTTPS и на IP-адресах — 38 из 58 без HTTPS, 7 из 10 на IP-адресах:
SELECT count(*) FILTER (WHERE link LIKE 'http://%') AS http,
count(*) FILTER (WHERE link LIKE 'http://%' AND status = 'inactive') AS http_dead,
count(*) FILTER (WHERE regexp_matches(link, '^https?://[0-9.]+')) AS ip,
count(*) FILTER (WHERE regexp_matches(link, '^https?://[0-9.]+') AND status = 'inactive') AS ip_dead
FROM catalogs
WHERE catalog_type = 'Microdata catalog';
Страны с неработающей NADA и без другого действующего каталога микроданных — 18 из 38:
WITH c AS (
SELECT status, software.id AS sid,
unnest(list_transform(coverage, lambda x: x.location.country.id)) AS cc
FROM catalogs
WHERE catalog_type = 'Microdata catalog'
),
dead AS (SELECT DISTINCT cc FROM c WHERE status = 'inactive' AND sid = 'nada' AND length(cc) = 2)
SELECT count(*) AS countries,
count(*) FILTER (WHERE NOT EXISTS (
SELECT 1 FROM c WHERE c.cc = dead.cc AND c.status = 'active')) AS without_active
FROM dead;
Сравнение типов и гибриды
Глава «Сравнение типов и гибриды». Сводная таблица — число, доли своих разработок, API, неработающих и ограниченного доступа по типам:
SELECT catalog_type, count(*) AS n,
round(100.0 * count(*) FILTER (WHERE software.id = 'custom') / count(*), 0) AS pct_custom,
round(100.0 * count(*) FILTER (WHERE api) / count(*), 0) AS pct_api,
round(100.0 * count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) / count(*), 1) AS pct_dead,
round(100.0 * count(*) FILTER (WHERE list_contains(access_mode, 'restricted')) / count(*), 0) AS pct_restricted
FROM catalogs
GROUP BY 1
ORDER BY n DESC;
Главный владелец и четыре главные платформы каждого типа, без своих разработок:
SELECT catalog_type, owner.type, count(*) AS n,
round(100.0 * count(*) / sum(count(*)) OVER (PARTITION BY catalog_type), 0) AS pct
FROM catalogs
GROUP BY 1, 2
QUALIFY row_number() OVER (PARTITION BY catalog_type ORDER BY count(*) DESC) = 1;
SELECT catalog_type, string_agg(sid || ' ' || n, ', ' ORDER BY n DESC) AS top
FROM (
SELECT catalog_type, software.id AS sid, count(*) AS n
FROM catalogs
WHERE software.id <> 'custom'
GROUP BY 1, 2
QUALIFY row_number() OVER (PARTITION BY catalog_type ORDER BY count(*) DESC) <= 4
)
GROUP BY 1;
В скольких типах встречается платформа — WordPress в девяти, CKAN в пяти, GeoNode, Dataverse и PxWeb в одном:
SELECT software.id AS sid, count(DISTINCT catalog_type) AS n_types, count(*) AS n,
string_agg(DISTINCT catalog_type, ', ') AS types
FROM catalogs
WHERE catalog_type NOT IN ('Other', 'General research repository')
AND software.id <> 'custom'
GROUP BY 1
ORDER BY n_types DESC, n DESC
LIMIT 30;
Владельцы с каталогами нескольких типов — 2 203 из 32 595, из них 254 с тремя и более, за ними 7 358 каталогов; одной программой обходятся 118. Владелец здесь — название организации в одной стране, поэтому подсчёт приблизительный:
CREATE TEMP TABLE o AS
SELECT lower(trim(owner.name)) AS oname, owner.location.country.id AS cc,
owner.type AS otype, catalog_type, software.id AS sid
FROM catalogs
WHERE coalesce(trim(owner.name), '') <> ''
AND catalog_type NOT IN ('Other', 'General research repository');
CREATE TEMP TABLE g AS
SELECT oname, cc, any_value(otype) AS otype,
count(DISTINCT catalog_type) AS nt, count(*) AS n, count(DISTINCT sid) AS ns,
string_agg(DISTINCT catalog_type, ' | ' ORDER BY catalog_type) AS type_list
FROM o
GROUP BY 1, 2;
SELECT count(*) AS owners,
count(*) FILTER (WHERE nt > 1) AS multi,
count(*) FILTER (WHERE nt > 2) AS multi3,
sum(n) FILTER (WHERE nt > 1) AS catalogs,
count(*) FILTER (WHERE nt > 1 AND ns = 1) AS one_software
FROM g;
Доля таких владельцев по виду владельца и самые частые пары типов — геопортал и портал открытых данных у 953:
SELECT otype, count(*) AS owners,
round(100.0 * count(*) FILTER (WHERE nt > 1) / count(*), 0) AS pct_multi
FROM g
GROUP BY 1
ORDER BY owners DESC;
SELECT type_list, count(*) AS owners
FROM g
WHERE nt = 2
GROUP BY 1
ORDER BY owners DESC
LIMIT 15;
Пара «геопортал и портал открытых данных»: 1 120 владельцев, сочетания программ (ArcGIS Server и CKAN — 101) и одна программа на обеих сторонах — у 44 из 953, из них 39 своих разработок:
CREATE TEMP TABLE pair AS
SELECT oname, cc, any_value(otype) AS otype
FROM o
GROUP BY 1, 2
HAVING bool_or(catalog_type = 'Geoportal') AND bool_or(catalog_type = 'Open data portal');
SELECT g.sid AS geo, d.sid AS odp, count(DISTINCT oname || cc) AS owners
FROM (SELECT DISTINCT oname, cc, sid FROM o JOIN pair USING (oname, cc) WHERE catalog_type = 'Geoportal') g
JOIN (SELECT DISTINCT oname, cc, sid FROM o JOIN pair USING (oname, cc) WHERE catalog_type = 'Open data portal') d
USING (oname, cc)
GROUP BY 1, 2
ORDER BY owners DESC
LIMIT 12;
SELECT shared_sid, count(*) AS owners
FROM (
SELECT oname, cc,
unnest(list_intersect(
list(DISTINCT sid) FILTER (WHERE catalog_type = 'Geoportal'),
list(DISTINCT sid) FILTER (WHERE catalog_type = 'Open data portal'))) AS shared_sid
FROM o JOIN g USING (oname, cc)
WHERE g.nt = 2 AND g.type_list = 'Geoportal | Open data portal'
GROUP BY 1, 2
)
GROUP BY 1
ORDER BY owners DESC;
Каталоги одной организации — так видны составы Тихоокеанского сообщества, Всемирного банка, ФАО и INEGI:
SELECT owner.name, catalog_type, software.id AS sid, status, link
FROM catalogs
WHERE owner.name IN ('Pacific Community (SPC)', 'World Bank',
'Food and Agriculture Organization of the United Nations',
'Instituto Nacional de Estadística y Geografía (INEGI)')
ORDER BY 1, 2, 3;
Когда портал не нужен
Глава «Когда портал не нужен», запросы 15 октября 2026 года к той же выгрузке. Списки наборов — 107, программный интерфейс у 15, своя разработка у 95, недействующие и снятые — 7:
SELECT
count(*) AS n,
count(*) FILTER (WHERE api) AS with_api,
count(*) FILTER (WHERE software.id = 'custom') AS custom,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead
FROM catalogs
WHERE catalog_type = 'Datasets list';
Карта сайта — у 12. Остальные движки страниц — Drupal, WordPress, TYPO3, Jekyll, SharePoint, Liferay:
SELECT count(DISTINCT id) AS with_sitemap
FROM (
SELECT id, unnest(endpoints) AS e
FROM catalogs
WHERE catalog_type = 'Datasets list'
)
WHERE e.type = 'sitemap';
SELECT software.id AS sid, count(*) AS n
FROM catalogs
WHERE catalog_type = 'Datasets list'
GROUP BY 1
ORDER BY n DESC;
Передовые каталоги
Глава «Что уже умеют передовые каталоги», запросы 15 октября 2026 года к той же выгрузке. ERDDAP — 175 записей, недействующая одна. Datasette — 45, недействующая одна. Redivis — 13, DataLad — 10, DANDI — 3. Datadex — 3, программный интерфейс не отмечен ни у одной:
SELECT software.id AS sid, count(*) AS n,
count(*) FILTER (WHERE status IN ('inactive', 'deprecated')) AS dead,
count(*) FILTER (WHERE api) AS with_api
FROM catalogs
WHERE software.id IN ('erddap', 'datasette', 'redivis', 'datalad', 'dandi', 'datadex')
GROUP BY 1
ORDER BY n DESC;
Записи с openEO в адресе или типе точки доступа — 12, из них у Copernicus Data Space Ecosystem — 3. Каталоги с интерфейсом GA4GH DRS — 27:
SELECT count(DISTINCT id) AS with_openeo,
count(DISTINCT id) FILTER (WHERE e.url ILIKE '%dataspace.copernicus.eu%') AS cdse
FROM (SELECT id, unnest(endpoints) AS e FROM catalogs)
WHERE e.url ILIKE '%openeo%' OR e.type ILIKE 'openeo%';
SELECT count(DISTINCT id) AS with_drs
FROM (SELECT id, unnest(endpoints) AS e FROM catalogs)
WHERE e.type = 'ga4gh:drs';
В число с openEO попадают и два сайта сообщества с одной картой сайта: адрес содержит слово, а сервера openEO за ним нет. Записи для сверки с главой — Source Cooperative, Data Commons, Our World in Data, DoltHub:
SELECT id, catalog_type, software.id AS sid, api, link
FROM catalogs
WHERE link ILIKE '%source.coop%' OR link ILIKE '%datacommons.org%'
OR link ILIKE '%ourworldindata.org%' OR link ILIKE '%dolthub.com%';
В тот день у DoltHub и Our World in Data из точек доступа записана только карта сайта, хотя у обоих есть API. У Data Commons точек доступа нет вовсе и программный интерфейс не отмечен, хотя у него есть REST, SDMX и сервер MCP. У основной записи Source Cooperative — один интерфейс STAC, у записи beta.source.coop точек доступа нет.