Графы и базы данных: Neo4j

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

Neo4j — это NoSQL графовая СУБД с открытым исходным кодом, реализованная на Java и Scala. Разработкой проекта c 2003 года занимается американская компания Neo Technology. Neo4j поставляется в двух редакциях: Community и Enterprise. Исходный код доступен на GitHub. По состоянию на текущий момент Neo4j является самой распространенной графовой СУБД.

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

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

Если вам приходилось работать с объектной моделью данных или диаграммами связей, то работа с Neo4j вам покажется знакомой. В БД граф состоит из узлов и связей. Каждый узел может содержать произвольное число атрибутов (ключ-значение), произвольное число тегов, служащих для определения роли узла и мета-данные (индексы и ограничения). Связи между узлами всегда имею направления, начальный и конечный узел, тип. Связи также как и узлы могут иметь атрибуты (наиболее типичные - вес, время, рейтинг и т.п.). Основное требование в Neo4j - не должно быть сломанных связей (нельзя удалить узел, не удалив все его связи или создать связь не указав двух узлов).

Если вы используете в качестве сервера Debian, то для установки доcтаточно выполнить следующие команды:

wget -O - https://debian.neo4j.org/neotechnology.gpg.key \
  | sudo apt-key add -
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
sudo apt-get install neo4j

В СУБД используется собственный язык запросов — Cypher. Он является не только языком запросов, но и языком манипулирования данными, так как предоставляет функции CRUD для графового хранилища. Пример запроса на Cypher:

MATCH (p:Person)<-[:EMPLOYEE]-(d:Department)
WHERE d.name = "IT Department"
RETURN p.name

Что эквивалентно SQL запросу в реляционной СУБД

SELECT name
FROM Person
LEFT JOIN Person_Department ON Person.Id = Person_Department.PersonId
LEFT JOIN Department ON Department.Id = Person_Department.DepartmentId
WHERE Department.name = "IT Department"

Для создания структуры, графа можно воспользоваться запросом вида

CREATE
(users {name:"Users"}),
(projects {name:"Projects"}),
(project:Project {name:"Operator X"}),
(craig:User {name:"Craig"}),
(jonas:User {name:"Jonas"}),
(john:User {name:"John"}),
(users)-[:user]->(craig),
(users)-[:user]->(jonas),
(users)-[:user]->(john),
(projects)-[:project]->(project),
(craig)-[:su]->(project),
(jonas)-[:su]->(project)

Результатом выполнения будет граф:

Для извлечения пользователей, которые имеют доступ к проекту Operator X достаточно выполнить запрос

MATCH (u)-[:su]->(p)
WHERE p.name = 'Operator X'
RETURN u.name AS `Users WITH access to Operator X data`

Для получения более детальной информации по Neo4j посетите сайт проекта

31.08.2016









 
архив

подписка