Графы знаний
Property Graphs: Neo4j
Цели урока
- Понимать разницу между Property Graph и RDF-подходом
- Создавать nodes с labels и relationships с properties в Neo4j
- Писать Cypher-запросы с variable-length paths для реальных задач
- Выбирать между Neo4j и PostgreSQL исходя из природы задачи
Предварительные знания
2016 год. Panama Papers - 11.5 миллионов документов об офшорных компаниях. ICIJ взяла Neo4j и за несколько недель построила граф из миллионов связей между компаниями, директорами и активами. SQL с теми же данными потребовал бы годы разработки запросов. Cypher находил циклические схемы уклонения от налогов за секунды.
- **Fraud Detection** (eBay, PayPal, ICIJ/Panama Papers): обнаружение циклических транзакций и подставных компаний
- **Рекомендации** (Airbnb, Walmart): collaborative filtering через граф «пользователь-покупка-товар»
- **Drug Discovery** (AstraZeneca, Novartis): поиск связей между генами, белками и болезнями в KG из миллиардов фактов
Emil Eifrem и рождение Neo4j из проблемы с JOINs
В 2000 году Эмиль Айфрем разрабатывал систему управления контентом для шведской компании. Реляционная схема с множеством JOIN-ов работала катастрофически медленно при запросах к иерархиям. На бумажном салфетке в самолёте он нарисовал граф - и понял, что нужна совершенно другая БД. Так родился Neo4j, первый продуктивный релиз которого вышел в 2010 году. К 2024 году это крупнейшая графовая БД в мире с более чем 1000 enterprise-клиентов. ISO стандарт GQL 2024 года фактически легализовал Cypher как международный стандарт.
Nodes и Labels
RDF - выразительный, но многословный. В 2000-х возникла альтернативная модель - **Property Graph**. Вместо троек здесь полноценные объекты: каждый **node** (вершина) имеет одну или несколько **labels** (меток-типов) и набор **properties** (ключ-значение). Это ближе к тому, как разработчики думают об объектах. Поэтому Neo4j выбрали eBay, Airbnb и AstraZeneca - а не RDF-хранилища.
**Labels** - это теги, определяющие тип сущности. Один node может иметь несколько labels: (:Person:Scientist:Author). Это гибче, чем жёсткая иерархия классов OWL. Labels используются для индексации и ограничения области запросов.
**Neo4j** - самая популярная графовая БД (более 1000 enterprise клиентов). Хранит данные нативно как граф (index-free adjacency): каждый node физически указывает на своих соседей, что делает traversal за O(1) на ребро, независимо от размера графа.
| Характеристика | RDF | Property Graph |
|---|---|---|
| Базовая единица | Triple (s, p, o) | Node + Relationship |
| Свойства на рёбрах | Reification (сложно) | Нативно поддерживается |
| Идентификация | URI (глобальный) | Internal ID (локальный) |
| Множественные типы | rdf:type (отдельные тройки) | Labels (встроено) |
| Стандарт | W3C (RDF, OWL, SPARQL) | Нет единого (GQL в разработке) |
| Interoperability | Высокая (URI, Linked Data) | Ограниченная |
Node в Neo4j имеет labels [:Person, :Author, :Scientist]. Что это означает?
Relationships
**Relationships** (рёбра) в Property Graph - это первоклассные объекты. Каждое ребро имеет **тип**, **направление** и может нести **свои собственные properties**. Это главное преимущество перед RDF, где свойства на рёбрах требуют сложного reification. Возможность хранить «when=2023, amount=5000, reason=payment» прямо на ребре - то, что делает fraud detection в Neo4j лаконичным.
Relationships в Neo4j **всегда направлены** при создании. Но при запросе можно игнорировать направление: `(a)-[:KNOWS]-(b)` найдёт связь в обе стороны. Типы relationship пишутся CAPS_SNAKE_CASE по конвенции: ACTED_IN, DIRECTED, BORN_IN.
**Index-free adjacency**: в Neo4j каждый node хранит прямые указатели на свои relationships. Traversal от node к соседу - O(1), независимо от того, 10 nodes в графе или 10 миллиардов. В реляционной БД аналогичный JOIN замедляется с ростом таблицы.
Relationships формируют **paths** (пути) - цепочки node-relationship-node. Многие мощные запросы в Neo4j - это поиск путей: кратчайший путь между людьми (6 degrees of separation), все пути транзакций от A до B (fraud detection), рекомендации через общих соседей.
Чем relationship в Property Graph лучше предиката в RDF?
Properties
**Properties** - пары ключ-значение, которые можно прикрепить к nodes и relationships. Это делает Property Graph самоописательным: вся информация - в самом графе, без необходимости обращаться к внешней схеме.
| Тип данных | Пример | На чём |
|---|---|---|
| String | name: 'Einstein' | Node |
| Integer | born: 1879 | Node |
| Float | rating: 4.7 | Relationship |
| Boolean | active: true | Node |
| List | genres: ['Sci-Fi', 'Drama'] | Node |
| Date | since: date('2020-01-15') | Relationship |
| Point | location: point({lat:48.39, lon:9.98}) | Node |
В отличие от реляционной БД, Property Graph - **schema-optional**. Два node с label :Person могут иметь разные наборы properties. Это гибкость, но и риск: нет гарантии целостности данных без дополнительных constraints.
Neo4j поддерживает **constraints**: UNIQUE (уникальность property), NOT NULL (обязательность), NODE KEY (комбинированная уникальность). Это позволяет совместить гибкость schema-optional с минимальными гарантиями целостности.
Property graph - schema-optional. Это означает:
Cypher
**Cypher** - декларативный язык запросов для Property Graphs, разработанный Neo4j. Его уникальность - **ASCII-art синтаксис**: паттерны графа рисуются прямо в запросе. `(a)-[:ACTED_IN]->(m)` - читается как «a, связанный ребром ACTED_IN с m». SQL требует мысленно «перекладывать» граф в JOINs. Cypher позволяет думать в терминах самого графа.
Cypher поддерживает **variable-length paths**: `(a)-[:KNOWS*1..6]->(b)` - найти путь через 1-6 рёбер KNOWS. Это позволяет решать задачи «6 рукопожатий», поиск путей транзакций и анализ цепочек поставок - задачи, неподъёмные для SQL.
| Cypher паттерн | Значение | SQL аналог |
|---|---|---|
| (n:Person) | Node с label Person | FROM persons |
| (n)-[:ACTED_IN]->(m) | Directed relationship | JOIN ... ON ... |
| (n)-[:KNOWS*2]-(m) | Путь длиной 2 | JOIN JOIN (вложенный) |
| (n)-[:KNOWS*1..5]-(m) | Путь длиной 1-5 | Рекурсивный CTE |
| shortestPath(...) | Кратчайший путь | Нет прямого аналога |
| WHERE NOT (a)-->(b) | Отсутствие связи | NOT EXISTS (subquery) |
**GQL** (Graph Query Language) - новый ISO-стандарт (ISO/IEC 39075), основанный на Cypher. Принят в 2024 году. Это первый международный стандарт для графовых запросов, аналогичный SQL для реляционных БД. Neo4j, Amazon Neptune, TigerGraph планируют поддержку.
Области применения Neo4j далеко выходят за социальные сети: **fraud detection** (кольца транзакций), **рекомендации** (collaborative filtering через граф), **supply chain** (отслеживание цепочек поставок), **drug discovery** (связи ген-белок-болезнь), **identity resolution** (объединение данных о клиенте из разных систем).
Neo4j подходит только для социальных сетей и графов друзей
Property Graphs применяются в fraud detection, рекомендательных системах, drug discovery, supply chain, identity resolution и десятках других областей
Любая задача, где важны связи (кто с кем связан, через кого, какими путями) - кандидат для графовой БД. Fraud detection (кольца транзакций), рекомендации (collaborative filtering), drug discovery (ген → белок → болезнь → лекарство), Master Data Management - всё это production use cases Neo4j
Что делает запрос: MATCH (a)-[:TRANSFER*3..5]->(a) RETURN a?
Ключевые идеи
- **Nodes** с множественными **labels** и **properties** - гибкие, самоописательные объекты
- **Relationships** - первоклассные объекты с типом, направлением и собственными properties
- **Properties** (key-value) на nodes и edges; schema-optional с возможностью constraints
- **Cypher** - ASCII-art язык запросов с variable-length paths и shortestPath для задач, неподъёмных SQL
Связанные темы
Property Graphs - альтернатива RDF-подходу:
- RDF и семантический веб — RDF и Property Graph - два подхода к графам знаний с разными trade-offs
- Что такое граф знаний — Property Graph - конкретная реализация концепции графа знаний из первого урока
Вопросы для размышления
- В каких случаях стоит выбрать Neo4j вместо PostgreSQL? А когда PostgreSQL лучше?
- Как смоделировать рекомендательную систему для онлайн-магазина в виде Property Graph?
- Почему SQL плохо справляется с запросами вида «найди все пути длиной 3-5 между A и B»? Что делает графовые БД быстрее?
Связанные уроки
- kg-02 — RDF - это альтернативная модель, которую Property Graph вытесняет в продакшне
- kg-01 — Понятие графа знаний заложено в первом уроке
- kg-04 — Cypher и Neo4j - фундамент для embeddings и ML на графах
- ds-14 — Fraud detection - production use case Neo4j с реальными деньгами
- ml-05 — Graph neural networks работают поверх property graph модели
- alg-07 — Graph traversal algorithms - BFS/DFS - это суть Cypher variable-length paths
- ml-01-intro