Neo4j

Neo4j – графовая система управления базами данных с открытым исходным кодом, реализованная на Java. По состоянию на 2017 год считается самой распространённой графовой СУБД. Разработчик — американская компания Neo Technology, разработка ведётся с 2003 года. С 2007 года стала публично доступной. В Neo4j присутствуют все характеристики баз данных, включая соблюдение ACID, поддержание разбиение на кластеры и восстановления после сбоя в системе.

Общие сведения

Основные транзакционные возможности — поддержка ACID и соответствие спецификациям JTA, JTS и XA. Интерфейс программирования приложений для СУБД реализован для многих языков программирования, включая Java, Python, Clojure, Ruby, PHP, также реализовано API в стиле REST. Расширить программный интерфейс можно как с помощью серверных плагинов, так и с помощью неуправляемых расширений (unmanaged extensions); плагины могут добавлять новые ресурсы к REST-интерфейсу для конечных пользователей, а расширения позволяют получить полный контроль над программным интерфейсом, и могут содержать произвольный код, поэтому их следует использовать с осторожностью.

В СУБД используется собственный язык запросов — Cypher, но запросы можно делать и другими способами, например, напрямую через Java API и на языке Gremlin, созданном в проекте с открытым исходным кодом TinkerPop. Cypher является не только языком запросов, но и языком манипулирования данными, так как предоставляет функции CRUD для графового хранилища.

Архитектура

Данные хранит в собственном формате, специализированно приспособленном для представления графовой информации, такой подход в сравнении с моделированием графовой базы данных средствами реляционной СУБД позволяет применять дополнительную оптимизацию в случае данных с более сложной структурой. Также утверждается о наличии специальных оптимизаций для SSD-накопителей, при этом для обработки графа не требуется его помещение целиком в оперативную память вычислительного узла, таким образом, возможна обработка достаточно больших графов.

Компоненты графовой базы данных — узлы и ребра. Они могут быть дополнены собственным набором полей. Модель такой БД схематично изображена на рисунке.

Терминология Neo4j и графовых баз данных в целом

  • graph database, графовая база данных — база данных построенная на графах — узлах и связях между ними
  • Cypher — язык для написания запросов к базе данных Neo4j (примерно, как SQL в MYSQL)
  • node, нода — объект в базе данных, узел графа. Количество узлов ограниченно 2 в степени 35 ~ 34 биллиона
  • node label, метка ноды — используется как условный «тип ноды». Например, ноды типа movie могут быть связанны с нодами типа actor. Метки нод — регистрозависимые, причем *Cypher не выдает ошибок, если набрать не в том регистре название.
  • relation, связь — связь между двумя нодами, ребро графа. Количество связей ограниченно 2 в степени 35 ~ 34 биллиона
  • relation identirfier, тип связи — в Neo4j у связей. Максимальное количество типов связей 32767
  • properties, свойства ноды — набор данных, которые можно назначить ноде. Например, если нода — это товар, то в свойствах ноды можно хранить id товара из базы MySQL
  • node ID, ID нода — уникальный идентификатор ноды. По умолчанию, при просмотрах результата отображается именно этот ID.

Сохранение данных в Neo4j

Файл nodestore.db содержит определенный размер записей, содержащих информацию о ноде:

  1. Метка, которая показывает, запись активна;
  2. Указатель на первое отношение, которое содержит данная нода;
  3. Указатель на первую свойство, которое содержит данная нода.

Нода не содержит собственного идентификатора. Так как каждая запись в nodestore.db занимает одинаковое количество места, можно рассчитать указатель на ноду.

Файл relationshipstore.db также содержит записи одинакового размера, которые описывают отношения, но они состоят из следующих элементов:

  1. Метка, которая показывает, запись активна;
  2. Указатель на ноду, которая содержит это отношение;
  3. Указатель на ноду, к которой это отношение направлено;
  4. Вид отношения;
  5. Указатель на отношение, которое стоит впереди (в пределах данной ноды);
  6. Указатель на отношение, которое стоит сзади (в пределах данной ноды);
  7. Указатель на отношение, которое стоит впереди (в пределах Ноды, в которой это отношение направлено);
  8. Указатель на отношение, которое стоит сзади (в пределах Ноды, в которой это отношение направлено);
  9. Указатель на первое свойство данного отношения.

Установка Neo4j

Инструкция по установке Neo4j на разные операционные системы подробно написана на официальном сайте.

Для наглядного примера разберем установку Neo4j для Ubuntu.

1. Установка JDK

Для того, чтобы установить Neo4j, необходимо сначала выполнить установку Java Development Kit JDK. Для этого обновим список пакетов:

$ sudo apt-get update 

Далее установим (JDK)

$ sudo apt-get install default-jdk 

2.Добавление репозитория

Вносим ключ Neo4j в менеджер пакетов apt:

$ wget -O — debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add - 

Добавляем Neo4j в список исходных кодов apt:

$ echo 'deb http://debian.neo4j.org/repo stable/' >/tmp/neo4j.list
$ sudo mv /tmp/neo4j.list /etc/apt/sources.list.d 

Обновим менеджер пакетов

$ sudo apt-get update 

3. Установка Neo4j (community edition)

$ sudo apt-get install neo4j 

4. Разрешить удалённый доступ

Откроем файл, который необходимо изменить

$ cd/etc/neo4j
$  sudo neo4j.conf

Затем раскомментируем необходимые строчки

dbms.security.auth_enabled=false
dbms.connectors.default_listen_address=0.0.0.0

Видео по установке

Более детально и наглядно можно рассмотреть установку Neo4j по видео

Язык запросов Cypher

Язык запросов Cypher — самый распространенный язык запросов к графовым базам данных, что обусловлено его использованием в СУБД Neo4j . Cypher является декларативным языком и позволяет создавать, обновлять и удалять вершины, ребра, метки и свойства, а также управлять индексами и ограничениями. Для извлечения данных из хранилища используется запрос, содержащий шаблон фильтрации, позволяющий получать:

  • (n)—>(m) — все направленные ребра из вершины n в вершину m;
  • (n:Person) — все вершины с меткой Person;
  • (n:Person:Russian) — все вершины, имеющие обе метки Person и Russian;
  • (n:Person {name:{value}}) — все вершины с меткой Person и отфильтрованные по дополнительному свойству;
  • (n:Person)—>(m) — ребра между вершинами n с меткой Person и m;
  • (n)—(m) — все ненаправленные ребра между вершинами n и m;

Выполнение простых запросов

Разберем на примере простые запросы, такие как, создание/удаление вершины, создание/удаление ребер, добавление и изменение свойства вершины и тд. Все это подробно показано в видео ниже.