Image

Как создать рекомендательную систему на основе графов с использованием EDG и Neo4j

Используйте общую таксономию для связи RDF и графов свойств и предоставляйте более интеллектуальные рекомендации с помощью вывода

Делиться

51c5cfdfb03e8391610f0813e328407e

Введение

В этом уроке я покажу вам, как управлять таксономией в EDG и публиковать её в экземпляре Neo4j, где её можно будет наполнять дополнительными данными для работы рекомендательной системы. Таксономия, созданная и поддерживаемая в EDG TopQuadrant, определяет её структуру. Набор (фиктивных) статей из академических журналов служит данными экземпляра, заполняющими Neo4j. Я буду использовать небольшую иерархию категорий STEM в качестве таксономии для организации статей. Эти данные защищены лицензией Creative Commons CC0 1.0 Universal Public Domain Dedication.

Примечание 1: Полное раскрытие информации — я работаю в TopQuadrant, компании-разработчике EDG, поэтому, естественно, предпочитаю инструменты, которые мне хорошо знакомы. И Neo4j, и EDG от TopQuadrant — коммерческие продукты, а не с открытым исходным кодом. У каждого из них есть бесплатные пробные версии, подходящие для изучения этого руководства: Neo4j предоставляет один бесплатный экземпляр облачной базы данных (с ограничениями по объёму данных, памяти и процессорному времени), а TopQuadrant предлагает 90-дневную бесплатную пробную версию EDG Desktop. Кроме того, хотя описанная здесь архитектура имеет свои преимущества, это не единственный подход, и это не единственные поставщики, способные поддерживать такой рабочий процесс. Преимущества и недостатки этого подхода перечислены ниже.

Примечание 2: Вот видеозапись того, как выглядит эта демонстрация.

Примечание 3: Все изображения в этом посте созданы автором.

c29d9368aa38b3dd03436f35c0143556

В чём смысл всего этого? Суть в том, что сама таксономия несёт в себе огромный смысл. Каждая статья отмечена тегом наиболее точной категории, но поскольку таксономия кодирует родительско-дочерние связи, мы можем автоматически выводить ассоциации более высокого уровня. Например, если статья отмечена тегом «Математическое программное обеспечение», она также относится к разделам «Компьютерные науки» и STEM, даже если это не указано явно. Таксономия не просто классифицирует, она позволяет рассуждать о взаимосвязи тем, поэтому источнику данных достаточно записать только наиболее релевантный тег, а иерархия заполнит всё остальное.

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

Причины, по которым вам следует строить с использованием именно этой архитектуры:

  1. Вывод: тегируйте одну концепцию, но используйте таксономию для связывания множества других концепций с контентом. Вместо того, чтобы отмечать статью тегами «Математическое программное обеспечение» и «Информатика», я могу просто тегнуть её тегом «Математическое программное обеспечение». Таксономия определяет «Математическое программное обеспечение» как раздел информатики. Исходная концепция, «Информатика», может быть выведена на основе таксономии.
  2. Согласование нескольких систем: я могу использовать одну таксономию для создания рекомендательного механизма в Neo4j и приложения GraphRAG в GraphDB. Одна команда может использовать векторную маркировку контента, хранящегося в SharePoint, а другая — тегирование на основе правил обработки естественного языка (NLP) для контента, хранящегося в Adobe Experience Manager (AEM). Все эти приложения согласованы, поскольку используют одни и те же справочные данные.
  3. Управление изменениями: Если я хочу перевести «Математическое программное обеспечение» в раздел «Математика» вместо раздела «Компьютерные науки», мне нужно просто изменить его родительскую таксономию. Если у меня нет отдельной таксономии, мне пришлось бы переразметить каждый документ с тегом «Математическое программное обеспечение». Если у меня есть несколько нижестоящих приложений, использующих один и тот же список терминов, это превращается в кошмар. Мне пришлось бы переразметить каждую сущность с тегом «Математическое программное обеспечение» в каждом приложении и убедиться, что все остальные теги, связанные с этим документом, верны.
  4. Используйте сильные стороны инструментов: EDG отлично справляется с управлением метаданными и таксономиями, обеспечивая их согласованность и эффективное управление. Neo4j и другие графовые базы данных отлично подходят для высокопроизводительной масштабируемой аналитики графов, но испытывают трудности с управлением метаданными. С помощью этой конфигурации мы можем получить лучшее из обоих миров.

Конечно, существуют и другие архитектурные подходы к строительству подобных сооружений, и у описанного здесь подхода есть свои недостатки. Вот некоторые из основных:

  1. Избыток для простых вариантов использования: в этом руководстве используется простая демонстрация, но архитектура наиболее целесообразна, когда ваши данные и варианты использования сложны. Большинство графовых баз данных, включая Neo4j, позволяют определить схему или базовую онтологию и представить таксономии с иерархическими связями. Если ваши данные относительно просты, таксономия понятна или её использует только одна команда, вам может не понадобиться так много инструментов.
  2. Навыки и кривая обучения: Совместное использование EDG и Neo4j предполагает знакомство с двумя различными парадигмами: моделированием онтологий в RDF/SHACL и запросами к графам в графах свойств/Cypher. Многие команды хорошо знакомы с одной, но не с другой.
  3. Больше подвижных частей: разделение таксономии и размечаемых данных означает, что теги должны соответствовать таксономии. Если они не совпадают, граф в базе данных перестает корректно согласовываться.
  4. Привязка к поставщику: Neo4j и EDG являются коммерческими продуктами, поэтому определённая привязка к поставщику и потенциальные затраты на миграцию всегда будут. Стандарты, лежащие в основе EDG (RDF, SHACL и SPARQL), являются стандартами с открытым исходным кодом от W3C, что снижает общую техническую привязку.

Neo4j — это граф маркированных свойств (LPG). EDG — это инструмент для курирования графов знаний, основанный на RDF и SHACL. LPG и RDF — это две разные графовые технологии, которые исторически не были совместимы. Однако EDG недавно разработал функцию интеграции с Neo4j, которая позволяет пользователям создавать проекты с использованием обеих технологий.

Ниже представлено визуальное представление того, как эти две технологии могут работать вместе.

8db0ede27b165478de64a3f5908d1955

Внизу, выделенном розовым цветом, находится хранилище данных. Я разделил его на внутренние и внешние данные. Внутренние данные — это необработанные данные, которые можно хранить в озере данных, системе управления контентом (CMS), например, SharePoint, или реляционной базе данных. Также могут быть внешние наборы данных, которые вы хотите интегрировать в своё приложение. Это могут быть общедоступные бесплатные источники данных, такие как WikiData, онтологии верхнего уровня, например, Gist, или проприетарные справочные наборы данных, такие как SNOMED или MedDRA (медицинские таксономии).

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

Шаг 1: Получите бесплатные версии EDG и Neo4j

Во-первых, нам нужно будет получить бесплатные версии этих продуктов, чтобы поэкспериментировать.

Для EDG вам нужно перейти на этот сайт и запросить бесплатную пробную версию. Ссылка для скачивания EDG и лицензия будут отправлены вам по электронной почте. После завершения загрузки в папке edg появится исполняемый файл, также называемый edg. Дважды щёлкните по нему, и он должен запуститься в браузере. Если у вас не установлена Java, вам будет предложено сначала установить её.

4b536e5b9475385fccbd521bf128a495

После этого EDG откроется в новой вкладке браузера с названием, например, http://localhost:8083/. Но будет указано, что он не зарегистрирован. Нажмите «Регистрация продукта» и загрузите файл лицензии, который также был отправлен вам по электронной почте. Затем нажмите «Зарегистрировать продукт».

479206e5392b00fc66837ce55ca6a3f9

После загрузки лицензии вы можете вернуться на главный экран, нажав на логотип TopQuadrant в левом верхнем углу. Теперь вы должны увидеть главную страницу EDG.

ef08842a0acd8de8f394cb728a12dc7e

Теперь нам нужна бесплатная версия Neo4j. Перейдите по этой ссылке, чтобы начать пользоваться бесплатной пробной версией. Если у вас ещё нет учётной записи, вам нужно её создать. После создания учётной записи Neo4j вы попадёте на такой экран:

e64e3feab59460fb6d0af2921ba3a137

Нажмите «Создать экземпляр», а затем выберите бесплатный вариант.

9bef6890d1e40b088a795d76bfc8e8a2

При нажатии кнопки «Создать экземпляр» вам будут показаны имя пользователя и пароль. Имя пользователя обычно просто «Neo4j», но пароль уникален, поэтому запишите его где-нибудь.

Шаг 2: Настройка интеграции

В EDG в правом верхнем углу нажмите на значок пользователя (он выглядит как человечек). Затем нажмите «Администрирование сервера». Откроется экран с множеством опций. Нажмите «Параметры конфигурации продукта». На левой панели инструментов вы увидите множество опций интеграции. Нажмите «Neo4j».

9d66114dc827c24ea0310708bda8f20c

Вы можете настроить отправку данных в несколько баз данных Neo4j, но в этом руководстве мы укажем только что созданный экземпляр Neo4j. Справа от пустой строки базы данных Neo4j есть знак «плюс». Щелкните по нему, и вам будет предложено ввести учётные данные Neo4j.

bb909c8fc507aad152d48664a142a4e7

Вы можете назвать эту конфигурацию как угодно, но я выбрал «neo4jtest1». Идентификатор должен быть автоматически заполнен EDG. Чтобы получить URL-адрес базы данных Neo4j, вам нужно проверить экземпляр Neo4j, созданный в Neo4j. Он будет выглядеть примерно так: neo4j+s://cd227570.databases.neo4j.io.

Нажмите «Создать и выбрать». Теперь вам нужно будет ввести пароль. Это тот, который Neo4j предоставил вам при создании вашего экземпляра Neo4j.

ea77686cb103d19898f8b2a0d4be00c5

Теперь мы все настроены.

Шаг 3: Импорт таксономии

Перейдите на мой GitHub и скачайте эту таксономию. Это список STEM-тем в иерархии, то есть таксономия.

Нажмите «Новый +» в верхней части экрана в EDG, затем «Импортировать коллекции ресурсов из TriG или ZIP-файла». Выберите ZIP-файл, полученный с моего GitHub, и загрузите его в EDG. Нажмите «Готово». Перейдя в таксономию, вы увидите иерархический список различных категорий STEM.

dabae544b91e93b6f8b7928924614f01

Шаг 4: Перенос таксономии в Neo4j

Нажмите на раскрывающееся меню «Облако», чтобы управлять интеграциями. В раскрывающемся меню вы увидите опцию «Подключиться к базе данных Neo4j».

b013143a2e7da2c832f078da19ca0b8b

Нажав эту кнопку, вы сможете выбрать нужную интеграцию Neo4j. Выберите ту, которую вы создали на шаге 2 выше.

d36b35abaf64693cba300189ab558a35

После выбора интеграции с Neo4j будет создана интеграция между этой таксономией и вашим экземпляром Neo4j. Она будет выглядеть, как показано на всплывающем окне ниже. Щёлкните по интеграции, чтобы перейти к ней. В моём примере ниже она называется «Интеграция с базой данных Neo4j neo4jtest1». Затем нажмите «ОК».

4ddb70252e66e94b43337d5083f775e2

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

c54f1bc8ef9fef6a8a93b42f64fb858b

Нажмите «Изменить» и прокрутите вниз до раздела «Включённые классы». Здесь мы указываем, какие классы из нашей таксономии мы хотим передать в этот экземпляр Neo4j. В этом руководстве выберите «Концепция». В этот раздел должны быть включены все классы таксономии. Это может показаться излишним, но важно для больших таксономий с множеством видов классов.

eb32a7c7d737f90c0c72cc7a40645b5a

Также выберите «Always overwrite» (Всегда перезаписывать) в значение «True» (Истина). Это гарантирует, что при отправке данных будет перезаписано всё, что находится в экземпляре Neo4j.

e5dd4b8920c26226f29f0b70e75c71fd

Теперь нажмите «Сохранить изменения».

Вернувшись в интерфейс редактора, нажмите на значок «Cloud Push» на верхней панели инструментов после настройки интеграции с Neo4j. Должно появиться всплывающее окно, как на изображении ниже. Если у вас настроено несколько интеграций с несколькими различными приложениями, все они будут здесь. В этом руководстве вы увидите только созданную вами интеграцию, и она будет выбрана автоматически. Нажмите «ОК».

73d374ca50080b30a9584761ce5331d3

Вы должны увидеть индикатор хода передачи ваших концепций в Neo4j.

29081ee3aa57b558ce111ea138b518fe

Шаг 5: Изучите данные в Neo4j

Теперь вернитесь к экземпляру Neo4j Aura. Если нажать «Экземпляры» на левой панели инструментов, вы увидите экземпляр, созданный на шаге 1. Теперь в нём есть узлы и связи!

a85b026732b739c57e281b57bf275b63

Вы можете нажать «Подключиться», а затем «Исследовать», что приведет вас к визуальному представлению вашего графика.

17edf14dd2beb3656f05812b7bec25c8

Ниже представлен визуальный обозреватель Neo4j Aura. Просто введите в поиск общий термин «Ресурс – БОЛЕЕ ШИРОКИЙ – Ресурс», чтобы увидеть все концепции, которые мы перенесли из EDG, а также их родительские концепции.

12c7b1ff1455486242d78be01b7619e4

Шаг 6: Загрузите статьи в Neo4j

Скачайте список журнальных статей с моего GitHub здесь. Это краткий список фейковых статей из академических журналов. Идея заключается в том, что мы хотим, чтобы таксономия была взята из EDG, а метаданные статьи — откуда-то ещё.

Теперь в Neo4j нажмите «Импорт» на левой панели инструментов и выберите «Новый источник данных». Появится список параметров. Вы можете импортировать данные экземпляра откуда угодно, но в этом руководстве мы просто загрузим CSV-файл напрямую. Источник данных не важен, важно, чтобы данные экземпляра были размечены терминами из таксономии, которой мы управляем в EDG. Таким образом, мы можем согласовать метаданные статьи с нашей таксономией и более широким семантическим уровнем.

54649f430bfe6c8742339d0f427ac459

Загрузите CSV-файл, скачанный с моего GitHub. Вам будет предложено указать, как вы хотите определить свою модель. Выберите «Сгенерировать из схемы».

2f1fb1b127c515ada110c90a059b1c69

Вы увидите файл Articles.csv в виде узла. Щёлкните по нему. Вам нужно указать, какое свойство вы хотите использовать в качестве первичного ключа. В этом списке статей есть свойство «id», которое мы будем использовать в качестве первичного ключа. Чтобы установить его в качестве ключа, щёлкните по значку ключа в правом нижнем углу строки «id». Затем выберите «Выполнить импорт».

0955b844cee4e5868c68b59a07146021

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

f486bc01424e7d0df2133ac3584ad631

Видно, что создано 15 узлов. CSV-файл содержал 15 статей, каждая из которых стала узлом. Теперь можно вернуться к функции «Исследование» и найти «Articles.csv». Вы увидите, что раздел «Статьи» отображается в визуальном представлении розовым цветом, а разделы STEM — зелёным. Это замечательно, но они пока не связаны. Чтобы связать данные экземпляра (статьи) с категориями, нам нужно выполнить запрос шифра.

427ef1e018d094a686ecdabda9b9abd8

Шаг 7: Свяжите данные экземпляра с таксономией

Нажмите «Запрос» на левой панели инструментов. В поле запроса введите:

// 1) Сопоставить каждый импортированный узел статьи, имеющий topicUri MATCH (a:`Articles.csv`) WHERE a.topicUri IS NOT NULL // 2) Найти соответствующее понятие по его свойству uri MATCH (c:Concept {uri: a.topicUri}) // 3) Создать отношение TAGGED_WITH (идемпотентное) MERGE (a)-[:TAGGED_WITH]->(c) // 4) Вернуть проверку корректности RETURN count(*) AS totalTaggedRelationships;

Это должно выглядеть так:

4ca40183dc8bf37b68a2b51771fd7ba8

Затем нажмите «Выполнить». Прямо под этим запросом вы увидите сообщение «Создано 15 связей». Это хороший знак. Вернитесь в Проводник. Найдите «Статьи.csv – С ТЕГОМ – Ресурс». Вы увидите, что все эти розовые узлы теперь связаны с нашей зелёной таксономией!

0b7982062f871d21cf77605310cf6714

Шаг 8: Создайте рекомендательную систему

Мы выполним несколько самых простых запросов на сходство, чтобы продемонстрировать, как использовать только что построенный нами граф для рекомендаций. Сначала давайте посмотрим на статью и на её категорию. Введите этот шифровальный запрос в интерфейс запросов. Будет выведен список категорий, к которым была отнесена статья «Достижения в области изучения математического программного обеспечения №7».

MATCH (a:`Articles.csv` {title: 'Достижения в изучении математического программного обеспечения #7'}) MATCH (a)-[:TAGGED_WITH]->(c:Concept) RETURN a.title КАК статья, c.prefLabel КАК тег, c.uri КАК uri ORDER BY тег;

Вы должны увидеть следующий вывод и категорию «Математическое программное обеспечение».

701d3df3aba93b4f08177d38102356a1

Предположим, мы хотим найти статьи, похожие на эту статью, чтобы рекомендовать их потенциальным читателям. Мы можем поискать другие статьи с тегом «Математическое программное обеспечение», но также можем воспользоваться таксономической структурой нашего графа. Согласно таксономии STEM, «Математическое программное обеспечение» является подклассом «Компьютерные науки». Вы можете вернуться к EDG, чтобы изучить категории и их дочерние категории. Чтобы найти статьи, похожие на нашу статью «Математическое программное обеспечение», нашей системе рекомендаций нужно найти другие статьи с тегом «Математическое программное обеспечение», а также статьи с тегами других разделов компьютерных наук.

Мы можем сделать это с помощью следующего шифровального запроса:

// 0) Начальная статья по ее реальной метке MATCH (me:`Articles.csv` {title: 'Достижения в изучении математического программного обеспечения #7'}) // 1) получить каждую отмеченную тему и ее родителя MATCH (me)-[:TAGGED_WITH]->(child:Concept)-[:BROADER]->(parent:Concept) // 2) найти любую другую статью с меткой родителя в той же родительской статье MATCH (siblingChild:Concept)-[:BROADER]->(parent)<-[:BROADER]-(child) MATCH (rec:`Articles.csv`)-[:TAGGED_WITH]->(siblingChild) WHERE rec <> me // 3) вычислить оценку рекомендации WITH rec, count(DISTINCT parent) AS score // 4) теперь извлечь все прямые теги для каждой рекомендуемой статьи OPTIONAL MATCH (rec)-[:TAGGED_WITH]->(t:Concept) // 5) вернуть заголовок, оценку и полный список тегов RETURN rec.title AS рекомендация, оценка AS sharedParentCount, collect(DISTINCT t.prefLabel) AS allTaggedTopics ORDER BY оценка DESC, рекомендация LIMIT 5;

Вы должны получить следующие результаты:

36d255ca9c4376b86ae9983e5dd02053

Других статей с тегом «Математическое программное обеспечение» нет, но есть статьи с тегами других разделов компьютерных наук. Статья «Достижения в области компьютерных исследований и общества» относится к категории «Компьютеры и общество». Рекомендуется выбрать этот вариант, поскольку граф учитывает, что и «Компьютеры и общество», и «Математическое программное обеспечение» являются разделами компьютерных наук.

Шаг 9: Корректировка нашей таксономии

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

Предположим, мы хотим перевести «Математическое программное обеспечение» из категории «Компьютерные науки» в раздел «Математика». Для этого в нашей таксономии мы просто перетаскиваем термин в древовидную структуру EDG.

07da9aa5e72786277bc9850535dee730

Теперь верните таксономию в Neo4j, используя ту же кнопку облака.

46632d5b2837ed80fd54a0d1e5b24792

Теперь, когда мы снова запускаем Neo4j и алгоритм рекомендаций, результаты совершенно иные. Это связано с тем, что наша исходная статья была помечена тегом «Математическое программное обеспечение», которое мы теперь классифицируем как раздел «Математика». Остальные рекомендуемые нам статьи — это статьи по математике, а не по информатике.

43b2208cf982f38fc38b873915fb9556

Заключение

Эта простая демонстрация показывает, как таксономия может привнести структуру, гибкость и интеллект в ваши приложения для работы с данными. Отделив таксономию (в EDG) от метаданных экземпляра (в Neo4j), вы получаете возможность выводить взаимосвязи, согласовывать системы и развивать модель с течением времени без необходимости менять теги или перестраивать нижестоящие приложения. Результатом является модульная архитектура, которая делает ваш граф интеллектуальнее по мере расширения вашего понимания предметной области.

Об авторе: Стив Хедден — руководитель отдела управления продуктами в TopQuadrant, где он отвечает за стратегию развития EDG, платформы для управления графами знаний и метаданными. Его работа сосредоточена на объединении управления корпоративными данными и искусственного интеллекта посредством онтологий, таксономий и семантических технологий. Стив регулярно пишет и выступает с докладами о графах знаний и меняющейся роли семантики в системах искусственного интеллекта.

Источник: towardsdatascience.com

✅ Найденные теги: Как, новости

ОСТАВЬТЕ СВОЙ КОММЕНТАРИЙ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Каталог бесплатных опенсорс-решений, которые можно развернуть локально и забыть о подписках

галерея

Фото сгенерированных лиц: исследование показывает, что люди не могут отличить настоящие лица от сгенерированных
Нейросети построили капитализм за трое суток: 100 агентов Claude заперли…
Скетч: цифровой осьминог и виртуальный мир внутри компьютера с человечком.
Сцена с жестами пальцами, где один жест символизирует "VPN", а другой "KHP".
‼️Paramount купила Warner Bros. Discovery — сумма сделки составила безумные…
Скриншот репозитория GitHub "Claude Scientific Skills" AI для научных исследований.
Структура эффективного запроса Claude с элементами задачи, контекста и референса.
Эскиз и готовая веб-страница платформы для AI-дизайна в современном темном режиме.
ideipro logotyp
Image Not Found
Звёздное небо с галактиками и туманностями, космос, Вселенная, астрофотография.

Система оповещения обсерватории Рубина отправила 800 000 сигналов в первую ночь наблюдений.

Астрономы будут получать оповещения о небесных явлениях в течение нескольких минут после их обнаружения. Теренс О'Брайен, редактор раздела «Выходные». Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной…

Мар 2, 2026
Женщина с длинными тёмными волосами в синем свете, нейтральный фон.

Расследование в отношении 61-фунтовой машины, которая «пожирает» пластик и выплевывает кирпичи.

Обзор компактного пресса для мягкого пластика Clear Drop — и что будет дальше. Шон Холлистер, старший редактор Публикации этого автора будут добавляться в вашу ежедневную рассылку по электронной почте и в ленту новостей на главной странице вашего…

Мар 2, 2026
Черный углеродное волокно с текстурой плетения, отражающий свет.

Материал будущего: как работает «бессмертный» композит

Учёные из Университета штата Северная Каролина представили композит нового поколения, способный самостоятельно восстанавливаться после серьёзных повреждений.  Речь идёт о модифицированном армированном волокном полимере (FRP), который не просто сохраняет прочность при малом весе, но и способен «залечивать» внутренние…

Мар 2, 2026
Круглый экран с изображением замка и горы, рядом электронная плата.

Круглый дисплей Waveshare для креативных проектов

Круглый 7-дюймовый сенсорный дисплей от Waveshare создан для разработчиков и дизайнеров, которым нужен нестандартный экран.  Это IPS-панель с разрешением 1 080×1 080 пикселей, поддержкой 10-точечного ёмкостного сенсора, оптической склейкой и защитным закалённым стеклом, выполненная в круглом форм-факторе.…

Мар 2, 2026

Впишите свой почтовый адрес и мы будем присылать вам на почту самые свежие новости в числе самых первых