Дорожная сеть в графовой базе
данных Neo4j
Вадим Шашенко

2gis.ru

@rnd2gis
Создание карты

2
Для конечных продуктов

→

3
Карта

4
С дорожным графом

5
Проверка графа на связность
• Существование маршрута между двумя любыми вершинами
• Алгоритм требует обхода всех вершин и всех ребер
• Параметризация проверки (тип транспорта, время)

6
Геометрия дорожной сети

7
Граф дорожной сети

→

8
Фрагмент реального графа

9
Побольше

10
Еще побольше

11
Всё вместе
Всё покрытие 2ГИС

• 85 городов России (все с нас. более 300 тыс.)
• 3 города Казахстана
• 2 города Украины
• 1 город Италии и Кипра

Ждем новые города с плотной дорожной сетью

12
Характеристики графа
• 2.3 млн вершин
• 5.5 млн ребер
• 9 млн атрибутов

Это стартовые данные

13
Проблема
На нашей старой системе проверка связности на Москве:

• Без параметров – 30 минут
• С параметрами – 4-6 часов

14
Проблема
Данных много
Хочется:
• Меньше ожидание пользователя
• Больше rps

Поэтому нам нужна быстрая обработка графа

15
Задача
• Геометрия дорожной сети в реляционной БД
• Проверка на связность
• Делать это быстро
• Частые запуски проверок
• Часто меняющийся граф

16
17

Решение задачи

VS
Решения на RDBMS
• Закачать весь граф в память (pgRouting)
• Быстрый обход графа
• Ограничены памятью
• Геометрия в БД меняется

18
Решения на RDBMS
• Закачать весь граф в память (pgRouting)
• Быстрый обход графа
• Ограничены памятью
• Геометрия в БД меняется
• Работать в таблице ребер (рекурсивный поиск ребра в таблице)
• Не ограничены памятью
• Очень медленный обход графа

19
Обход графа в таблице

20
Решения на RDBMS
• Закачать весь граф в память (pgRouting)
• Быстрый обход графа
• Ограничены памятью
• Геометрия в БД меняется
• Работать в таблице ребер (рекурсивный поиск ребра в таблице)
• Очень медленный обход графа
• Не ограничены памятью

Наша старая система - схожий с RDBMS принцип - 30 минут

21
Решения на NoSQL – графовая база
данных Neo4j
• Загрузили все наши данные
• Потестировали алгоритмы обхода графа

22
Решения на NoSQL – графовая база
данных Neo4j
• Загрузили все наши данные
• Потестировали алгоритмы обхода графа
• Обход графа поиском в глубину – 1 мин
• Проверка связности графа на Москве – 15 секунд
• Проверка связности всего графа – 10 мин
• Не зависит от количества данных в хранилище

23
Проверка на связность Москвы

24
Обход графа RDBMS vs Neo4j

VS

25
Обзор Neo4j
• Естественная работа с математическим графом
• Вершины, ребра, атрибуты
• Язык запросов cypher
• Индексы на значения атрибутов
• ACID
• REST API. Веб-админка
• Расширения-плагины
• Open source. Java.

26
Почему именно Neo4j
• Самая популярная из графовых баз данных
• Богатый функционал
• Активная разработка
• Живое сообщество
• Готовые сторонние расширения: пространственный индекс, разные
алгоритмы на графе, импортер из csv.
• Коннекторы из множества языков программирования

27
Недостатки Neo4j
• Нет горизонтального масштабирования
• Удаление из бд не освобождает место на диске (требуется рестарт)

28
Архитектура нашего решения

29
Возможные оптимизации
• Разбиение на подграфы
• Иерархичность

30
Мы довольны
• Будем продолжать использовать
• Будем наблюдать за поведением с ростом данных

31
Итог
Есть много данных, которые можно представить графом?
Нужна быстрая работа графовых алгоритмов?
Стоит попробовать Neo4j.

32
33

Теперь вы
Вадим Шашенко

v.shashenko@2gis.ru

«Дорожная сеть в графовой базе данных Neo4j» — Вадим Шашенко, 2ГИС