Графы знаний

Property Graphs: Neo4j

Цели урока

  • Понимать разницу между Property Graph и RDF-подходом
  • Создавать nodes с labels и relationships с properties в Neo4j
  • Писать Cypher-запросы с variable-length paths для реальных задач
  • Выбирать между Neo4j и PostgreSQL исходя из природы задачи

Предварительные знания

  • RDF and the Semantic Web

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) на ребро, независимо от размера графа.

ХарактеристикаRDFProperty 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 самоописательным: вся информация - в самом графе, без необходимости обращаться к внешней схеме.

Тип данныхПримерНа чём
Stringname: 'Einstein'Node
Integerborn: 1879Node
Floatrating: 4.7Relationship
Booleanactive: trueNode
Listgenres: ['Sci-Fi', 'Drama']Node
Datesince: date('2020-01-15')Relationship
Pointlocation: 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 PersonFROM persons
(n)-[:ACTED_IN]->(m)Directed relationshipJOIN ... ON ...
(n)-[:KNOWS*2]-(m)Путь длиной 2JOIN 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
Property Graphs: Neo4j

0

1

Войти