Задача Проработать раздел Транспорт

Проработать раздел Транспорт

11.07.2026vietnamguru.ru

Сейчас в базе данных есть почти 1500 старых записей маршрутов. Но данные лежал плоские вот в таком виде:

{
  "id": 4,
  "city": "ho-chi-minh",
  "city2": "mui-ne",
  "time": "07:30",
  "time2": "12:30",
  "price": "120000",
  "company": "Tam Hanh Cafe",
  "type": "bus",
  "gps_link": "https://goo.gl/maps/86122wbjUQ62",
  "gps_link2": "https://goo.gl/maps/1Sabdd9TVy42",
  "address": "199 Phạm Ngũ Lão, Quận 1, Hồ Chí Minh",
  "address2": "135 Nguyễn Đình Chiểu, Phường Hàm Tiến, Thành phố Phan Thiết, Bình Thuận",
  "phone": "+84 283 920 5653",
  "note": ""
}

Проблема тут в том, что нет отдельного справочника как минимум компаний.

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

count(*)companytype
772Futa Busbus
175Hanh Cafebus
41Tam Hanh Cafebus
79The Sinh Touristbus
1LC3train
1LC4train
1MR1train
1NH1train
1NH2train
34SE1train
2SE1 (Livitrans Express)train
7SE1 (Violette Train)train
6SE17train
8SE18train
9SE19train
29SE2train
2SE2 (Livitrans Express)train
2SE2 (Violette Train)train
10SE20train
2SE21train
2SE22train
1SE22 (Livitrans Express)train
35SE3train
9SE3 (Violette Train)train
29SE4train
2SE4 (Violette Train)train
34SE5train
29SE6train
34SE7train
29SE8train
1SNT1train
1SNT2train
1SNT2 (Livitrans Express)train
1SP1train
1SP2train
1SP3train
1SP4train
1SP7train
1SP8train
1SPT1train
1SPT2train
8Boat Companyboat
4Greenlines DPboat
8Ka Longboat
14Phu Quoc Expressboat
16Superdongboat
10The Sinh Touristboat

Тут как минимум SP1, SP2 и т.п. - это не компании вообще, а маршруты поездов. А вот SNT2 (Livitrans Express) - это отдельные вагоры компании Livitrans Express в поезде SNT2. Так что текущяя структура вообще ни к черту.

Но есть еще проблема: есть дубли записей.

count(*)companycitycity2timeaddressaddress2
4Hanh Cafehueho-chi-minh08:3028 Chu Văn An, Phú Hội, Thành phố Huế, Thừa Thiên ...229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...
4Hanh Cafehueho-chi-minh13:3028 Chu Văn An, Phú Hội, Thành phố Huế, Thừa Thiên ...229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...
4Hanh Cafehoi-anho-chi-minh17:3012 Nguyễn Tất Thành, Phường Cẩm Phổ, tp. Hội An, Q...229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...
2Futa Busho-chi-minhrach-gia18:15272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...260A Nguyễn Bỉnh Khiêm, Vĩnh Thanh, Rạch Giá, tỉnh...
2Hanh Cafenha-trangho-chi-minh07:3010 Hùng Vương, Lộc Thọ, Thành phố Nha Trang, Khánh...229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...
2Hanh Cafenha-trangho-chi-minh13:0010 Hùng Vương, Lộc Thọ, Thành phố Nha Trang, Khánh...229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...
2Futa Busho-chi-minhsoc-trang22:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...ấp ngãi hội 2 , thị trấn đại ngãi , huyện long phú...
2Hanh Cafephan-thietha-noi01:30173 Tôn Đức Thắng, Phú Thuỷ, Thành phố Phan Thiết,...Nguyễn Khoái, Bạch Đằng, Hai Bà Trưng, Hà Nội
2Hanh Cafeho-chi-minhvinh-long07:45229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Lê Qúy Đôn, Khu 4, Thị Trấn Cái Bè, TT. Cái Bè, Cá...
2Hanh Cafephan-thietha-noi13:30173 Tôn Đức Thắng, Phú Thuỷ, Thành phố Phan Thiết,...Nguyễn Khoái, Bạch Đằng, Hai Bà Trưng, Hà Nội
2Hanh Cafeho-chi-minhvinh-long09:30229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Lê Qúy Đôn, Khu 4, Thị Trấn Cái Bè, TT. Cái Bè, Cá...
2Futa Busho-chi-minhchau-doc07:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...69 Phan Văn Vàng, Châu Phú A, An Phú, An Giang, Vi...
2Hanh Cafeho-chi-minhvinh-long13:15229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Lê Qúy Đôn, Khu 4, Thị Trấn Cái Bè, TT. Cái Bè, Cá...
2Futa Busho-chi-minhchau-doc08:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...69 Phan Văn Vàng, Châu Phú A, An Phú, An Giang, Vi...
2Hanh Cafeho-chi-minhvinh-long16:30229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Lê Qúy Đôn, Khu 4, Thị Trấn Cái Bè, TT. Cái Bè, Cá...
2Hanh Cafeho-chi-minhvinh-long19:15229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Lê Qúy Đôn, Khu 4, Thị Trấn Cái Bè, TT. Cái Bè, Cá...
2Futa Busho-chi-minhsa-dec16:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...149/8 khóm Hòa Khánh, Phường 2, Sa Đéc, Đồng Tháp,...
2Hanh Cafeho-chi-minhvinh-long21:30229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Lê Qúy Đôn, Khu 4, Thị Trấn Cái Bè, TT. Cái Bè, Cá...
2Futa Busho-chi-minhsa-dec17:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...149/8 khóm Hòa Khánh, Phường 2, Sa Đéc, Đồng Tháp,...
2Futa Busho-chi-minhchau-doc12:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...69 Phan Văn Vàng, Châu Phú A, An Phú, An Giang, Vi...
2Hanh Cafeho-chi-minhcan-tho07:45229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Mỹ Thuận, Bình Minh, Vinh Long
2Futa Busho-chi-minhsa-dec18:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...149/8 khóm Hòa Khánh, Phường 2, Sa Đéc, Đồng Tháp,...
2Hanh Cafeho-chi-minhcan-tho09:30229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Mỹ Thuận, Bình Minh, Vinh Long
2Hanh Cafeho-chi-minhcan-tho13:15229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Mỹ Thuận, Bình Minh, Vinh Long
2Hanh Cafeho-chi-minhcan-tho16:30229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Mỹ Thuận, Bình Minh, Vinh Long
2Futa Busho-chi-minhchau-doc16:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...69 Phan Văn Vàng, Châu Phú A, An Phú, An Giang, Vi...
2Hanh Cafeho-chi-minhcan-tho19:15229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Mỹ Thuận, Bình Minh, Vinh Long
2Hanh Cafeho-chi-minhcan-tho21:30229 Phạm Ngũ Lão, Phường Phạm Ngũ Lão, Quận 1, Hồ ...Mỹ Thuận, Bình Minh, Vinh Long
2Futa Busho-chi-minhchau-doc18:00272 Đường Đề Thám, Phường Phạm Ngũ Lão, Quận 1, Hồ...69 Phan Văn Vàng, Châu Phú A, An Phú, An Giang, Vi...
1Tam Hanh Cafemui-neho-chi-minh05:00135 Nguyễn Đình Chiểu, Phường Hàm Tiến, Thành phố ...199 Phạm Ngũ Lão, Quận 1, Hồ Chí Minh

От дублей надо избавиться еще на уровне импорта. Благо отдельных страниц для каждого маршрута в отдельности не было. Кстати, надо будет их сделать.

Ворклоги

Кстати, в некоторых маршрунах еще и данные битые.

"Can not get city2: \"cat-ba-island\"",
"Can not get city2: \"cat-ba-island\"",
"Can not get city2: \"cat-ba-island\"",
"Can not get city: \"cat-ba-island\"",
"Can not get city: \"cat-ba-island\"",
"Can not get city: \"cat-ba-island\"",
"Can not get city2: \"phong-nha-ke-bang\"",
"Can not get city2: \"nam-du-island\"",
"Can not get city2: \"nam-du-island\"",
"Can not get city2: \"nam-du-island\"",
"Can not get city: \"nam-du-island\"",
"Can not get city: \"nam-du-island\"",

Недо попутно завести.

Кстати, вот что чатгпт говорит по поводу нашей структуры базы знаний:

Самое сильное здесь — не отдельные модели, а то, как они складываются вместе.

Что здесь реально мощного

KBConcept фактически может быть универсальной сущностью сайта:

  • страна;
  • регион;
  • город;
  • район;
  • пляж;
  • храм;
  • аэропорт;
  • отель;
  • маршрут;
  • событие;
  • транспортный узел.

У концепта уже есть:

  • иерархия Parent / Children;
  • корень дерева;
  • координаты lat / lng / alt;
  • мультиязычные названия через KBLabel;
  • файлы и изображения;
  • факты;
  • привязка к URL через SiteRoute;
  • произвольные структурированные данные через Json.

То есть город, достопримечательность и маршрут — не просто статьи в CMS, а узлы единого графа знаний.

И это идеально совпадает с VietnamGuru.

Например:

Дананг → район Сон Тра → пагода Линь Унг → координаты → часы работы → стоимость → сезонность → транспорт → объекты рядом → статья → карта → маршрут.

Все это можно хранить не в одном огромном тексте, а как связанные знания.

Самая перспективная часть — факты не привязаны жестко к одной сущности

KBFact вместе с KBFactParticipation поддерживает n-арные связи: один факт может связывать сразу несколько концептов с разными ролями.

Для туристического проекта это очень сильная модель.

Например, утверждение:

Автобус №5 идет из Дананга в Хойан, останавливается возле Marble Mountains, билет стоит 30 000 донгов.

Можно представить одним фактом, где участвуют:

  • Дананг — origin;
  • Хойан — destination;
  • Marble Mountains — stop;
  • автобус №5 — transport;
  • 30 000 VND — значение;
  • период актуальности;
  • источник;
  • confidence;
  • статус проверки.

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

Тут заложена полноценная эпистемическая модель

Особенно нравится, что база не притворяется абсолютной истиной.

У фактов есть:

  • confidence;
  • verified / tentative / disputed / deprecated;
  • источник;
  • период действия;
  • дата, когда факт стал известен;
  • raw или derived;
  • происхождение из других фактов.

Плюс противоречия являются самостоятельными объектами через KBConflict, а не просто перезаписываются.

Для туристического ИИ это огромный плюс.

Типичный реальный случай:

  • Google Maps говорит, что место открыто до 18:00;
  • официальный сайт говорит до 17:00;
  • свежий отзыв говорит, что касса закрывается в 16:30.

Обычный RAG просто выдаст один из вариантов. Твоя модель позволяет агенту сказать:

«Источники расходятся. Официально указано 17:00, но посетители сообщают о более раннем закрытии кассы. Лучше приехать до 16:00».

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

KBKnowledgeSpace открывает еще один уровень

Knowledge Spaces позволяют одному и тому же факту иметь разную:

  • видимость;
  • важность;
  • степень доверия;
  • интерпретацию.

Это можно использовать не только для приватности, но и для разных режимов продукта:

  • база редакции;
  • публичная база;
  • персональное пространство пользователя;
  • пространство конкретной поездки;
  • знания агента;
  • партнерский контент;
  • непроверенные пользовательские данные.

Например, турист создает поездку «Вьетнам, август, семья с ребенком». Агент может построить отдельное пространство знаний, где выше приоритет у:

  • коротких переездов;
  • семейных пляжей;
  • объектов с кондиционером;
  • безопасной еды;
  • мест без сложных подъемов.

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

SiteRoute делает структуру сайта продолжением knowledge graph

Связь SiteRoute ↔ KBConcept — очень правильная идея.

Это означает, что URL — не сама сущность, а представление сущности.

В результате можно:

  • менять маршрут без потери концепта;
  • строить хлебные крошки из дерева;
  • генерировать страницы автоматически;
  • создавать региональные разделы;
  • поддерживать старые URL через redirects;
  • находить сущности без публичной страницы;
  • давать одному объекту разные представления.

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

Карта здесь вообще может стать интерфейсом к базе знаний

Теперь твое пояснение про карту выглядит еще интереснее.

Поскольку координаты есть и у KBConcept, и у File, карта может показывать не просто точки из статей, а целую пространственную модель:

  • города;
  • достопримечательности;
  • фотографии, привязанные к месту;
  • маршруты;
  • объекты рядом;
  • факты с географическим контекстом;
  • пользовательские сохранения;
  • зоны интереса.

А агент может выполнять запросы уровня:

«Покажи интересные места в радиусе 15 км от Нячанга, куда можно доехать без байка и где есть смысл быть после 17:00».

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