Веб‑приложение, состоящее из backend (HTTP API на FastAPI) и frontend (веб‑интерфейс на React/Vite) частей. Оно собирает и анализирует данные городских транспортных сетей, сохраняет графы в Neo4j и выполняет алгоритмы Graph Data Science (GDS) — кластеризацию (Leiden/Louvain) и вычисление метрик центральности (PageRank, Betweenness). Результаты доступны через API и визуализируются в клиенте.
app/— серверная часть с FastAPI + uvicorn (эндпоинты вapp/api, логика вapp/core, доступ к БД вapp/database).cache/— кешированные JSON файлы с маршрутами по городам.frontend/— клиентская часть на React + TypeScript (Vite).tests/— модульные (unit) тесты для backend (pytest).
- Backend: Python 3.12, FastAPI + uvicorn, neo4j Python driver.
- Визуализация и frontend: React, TypeScript, Vite, Leaflet + Chart.js.
- База данных: Neo4j с Graph Data Science (GDS).
- Контейнеризация: Docker + Docker Compose.
- Тестирование: pytest (unit тесты).
Для запуска проекта потребуется командная строка, Git и Docker.
Windows: PowerShell или «Командная строка»
macOS / Linux: Terminal
Проверьте, установлен ли Git:
git --versionЕсли команды нет:
Windows: скачайте и установите Git с официального сайта https://git-scm.com/download/win
macOS:
brew install gitLinux (Ubuntu/Debian):
sudo apt update
sudo apt install gitgit clone https://github.com/citec-spbu/Transport.git
cd TransportПроверьте установку:
docker --version
docker compose versionЕсли Docker отсутствует:
Windows / macOS: установите Docker Desktop https://www.docker.com/products/docker-desktop/
Linux: https://docs.docker.com/engine/install/
После установки убедитесь, что Docker запущен.
В корневой папке проекта выполните:
docker compose up --buildBackend:
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --host 0.0.0.0 --port 8050Frontend:
cd frontend
npm install
npm run devПосле успешного запуска доступны:
- Frontend: http://localhost:3000
- Backend API: http://localhost:8050
- Neo4j Browser: http://localhost:7474 (логин:
neo4j, пароль:hello123)
Для проверки корректности backend'а используются модульные (unit) тесты на pytest.
Запустить все тесты (локально):
pip install -r requirements-test.txt
pytestЗапустить тесты в Docker:
docker compose -f docker-compose.yaml exec app pytestЗапустить конкретный тестовый файл:
pytest tests/test_analysis_context.py -vТесты находятся в директории tests/ и охватывают:
- API эндпоинты (
test_*_endpoints.py) - Логику анализа (
test_analysis_*.py) - Работу с БД (
test_database_*.py) - Алгоритмы кластеризации и метрик (
test_metrics_*.py,test_community_detection.py)
GRAPH_DATABASE_URL="neo4j://localhost:7687"
GRAPH_DATABASE_USER="neo4j"
GRAPH_DATABASE_PASSWORD="hello123"POST /v1/datasets— создание/загрузка датасета ({ "transport_type": "bus|tram|...", "city": "Город" }). Возвращаетdataset_id.DELETE /v1/datasets/{dataset_id}— удалить датасет и связанный граф.POST /v1/analysis/cluster— запустить кластеризацию ({ "dataset_id": "...", "method": "leiden|louvain" }).POST /v1/analysis/metric— рассчитать метрику ({ "dataset_id": "...", "metric_type": "pagerank|betweenness" }).
Создать датасет (используется кеш, если данные уже скачаны):
curl -s -X POST "http://127.0.0.1:8050/v1/datasets" \
-H "Content-Type: application/json" \
-d '{"transport_type":"bus","city":"Бирск"}' | jqЗапустить кластеризацию (Leiden):
curl -s -X POST "http://127.0.0.1:8050/v1/analysis/cluster" \
-H "Content-Type: application/json" \
-d '{"dataset_id":"<DATASET_ID>","method":"leiden"}' | jqЗапустить вычисление PageRank:
curl -s -X POST "http://127.0.0.1:8050/v1/analysis/metric" \
-H "Content-Type: application/json" \
-d '{"dataset_id":"<DATASET_ID>","metric_type":"pagerank"}' | jq