Базы данных
Граф базы данных
Google Knowledge Graph содержит 500 миллиардов фактов о 5 миллиардах сущностей. Когда ищешь "Barack Obama" - Google мгновенно показывает связи: образование, должности, семья. Это граф. Neo4j хранит similar граф в eBay для 800+ миллионов товаров и их атрибутов.
- **PayPal**: Neo4j для fraud detection - анализ связей между аккаунтами, IP, устройствами выявляет rings в реальном времени
- **LinkedIn**: граф 900+ млн пользователей для "People You May Know" и степеней связи
- **NASA**: граф зависимостей компонентов для impact analysis - как изменение одной системы влияет на миссию
Граф модель данных
Graph database хранит данные как узлы (nodes) с properties и рёбра (relationships/edges) с типами и properties. Каждое ребро направлено и типизировано: (:User)-[:FOLLOWS]->(:User), (:User)-[:PURCHASED]->(:Product). Ключевое преимущество: рёбра - first-class граждане, не просто foreign keys.
Native graph storage: Neo4j хранит узлы и рёбра в специальных файлах с direct pointers. Traversal = follow the pointer, не index lookup. При обходе 1 миллиона рёбер - Neo4j не медленнее чем при 1000. В SQL JOIN замедляется пропорционально размеру таблиц.
Почему graph DB эффективнее SQL для запроса "друзья друзей пользователя" при большом количестве пользователей?
Cypher Query Language
Cypher - декларативный query language для Neo4j. ASCII art синтаксис: (:Label) - узел, -[:TYPE]-> - ребро. Pattern matching: MATCH описывает структуру которую нужно найти. WHERE добавляет условия. RETURN определяет результат.
OpenCypher - открытый стандарт, поддерживается не только Neo4j но и Amazon Neptune, ArangoDB, Redis Graph. GQL (Graph Query Language) - ISO стандарт 2024 года, унифицирует синтаксис graph queries.
Cypher запрос: MATCH (a)-[:KNOWS*2..4]-(b) WHERE a.name = "Alice". Что делает *2..4?
Алгоритмы обхода графа
Neo4j Graph Data Science library предоставляет готовые алгоритмы: PageRank (влиятельность узла), Community Detection (Louvain, Label Propagation), Shortest Path (Dijkstra, A*), Centrality. Используются для рекомендаций, fraud detection, network analysis.
Twitter в 2022 году использовал Neo4j для анализа сети ботов перед приобретением Маском. Graph algorithms позволили выявить координированные сети аккаунтов через community detection и temporal patterns.
LinkedIn показывает "2nd degree connections" - друзья друзей. Какой алгоритм используется?
Граф vs SQL
Граф БД выигрывает при: связанных данных с variable depth traversal, когда структура связей сама по себе важна, динамических схемах. SQL выигрывает при: агрегациях больших объёмов, транзакционных операциях, хранении данных.
| Задача | SQL (PostgreSQL) | Graph (Neo4j) |
|---|---|---|
| Найти друзей пользователя | JOIN friends f WHERE f.user_id=123 | MATCH (u)-[:KNOWS]->(f) WHERE u.id=123 |
| Друзья друзей | Double JOIN | MATCH (u)-[:KNOWS*2]->(foaf) |
| Кратчайший путь | Recursive CTE (медленно) | Built-in Dijkstra (быстро) |
| SUM продаж за месяц | Быстро (GROUP BY) | Медленно (не оптимизировано) |
| Fraud detection ring | Очень медленно (N JOINs) | Быстро (graph traversal) |
AGE (Apache Graph Extension) добавляет граф возможности прямо в PostgreSQL. Используется когда есть существующая PostgreSQL инфраструктура и не хочется отдельный Neo4j. Производительность ниже нативного Neo4j, но интеграция проще.
Финансовое приложение нужно: хранить транзакции (ACID) И находить паттерны мошенничества через сеть аккаунтов. Что выбрать?
Use Cases и когда использовать
Graph DB реально применяется: knowledge graphs (Google, Amazon), recommendation engines (Netflix, Amazon), fraud detection (PayPal, Mastercard), network/IT operations, identity access management, drug discovery (связи молекул и белков).
- Рекомендации: "купили вместе", "похожие пользователи" - связи между сущностями
- Fraud detection: координированные сети аккаунтов, money laundering rings
- Knowledge graph: семантические связи между сущностями (Google Knowledge Graph)
- IAM: кто имеет доступ к чему через иерархию ролей
- Network operations: зависимости сервисов, impact analysis при падении
Amazon Neptune - managed graph БД поддерживающий два graph query languages: Gremlin и SPARQL. Используется NASA для управления зависимостями компонентов миссий, 84.51° (аналитика Kroger) для персонализации покупок.
Graph DB заменяет реляционную - всё можно хранить в графе
Graph DB - специализированный инструмент для связанных данных. Плохо подходит для bulk analytics, ACID транзакций, хранения больших объёмов неструктурированных данных. Используется как дополнение к основной СУБД.
На SQL собеседованиях часто спрашивают про граф БД. Правильный ответ: это специализированный инструмент для специфических задач с traversal, не universal replacement.
Какой use case НЕ подходит для graph database?
Итоги
- **Traversal**: graph следует pointer-ам, SQL делает JOIN; при глубоком traversal разница в скорости экспоненциальная
- **Cypher pattern matching**: (:Label)-[:TYPE]->(node) - интуитивный ASCII art синтаксис для описания паттернов
- **Специализация**: граф для связанных данных и traversal, SQL для агрегаций и транзакций - не взаимозаменяемы
Связанные темы
Graph DB часто используется в polyglot архитектурах:
- Polyglot Persistence — Neo4j как специализированный layer поверх PostgreSQL как источника истины
- Vector Databases — Graph + Vector: knowledge graph с semantic embeddings для AI приложений
- Дизайн платёжной системы — Граф для fraud detection - важная часть платёжных систем
Вопросы для размышления
- Как бы ты смоделировал граф для рекомендательной системы Netflix (фильмы, пользователи, жанры, актёры)?
- В каком случае recursive CTE в PostgreSQL может заменить graph DB?
- Почему социальная сеть на 1+ млрд пользователей не хранит весь граф в Neo4j?