Статьи

Откройте для себя графовые базы данных с Neo4j и PHP

В этой статье мы узнаем о Neo4j, ведущей графовой базе данных, и способах ее использования с PHP. В следующем посте мы создадим правильное графическое приложение на базе Silex.


Графовые базы данных в настоящее время являются одной из основных технологий компаний, работающих с данными с высокой степенью связи.

Бизнес-графики, социальные графы, графы знаний, графы интересов и медиа-графики часто встречаются в (технологических) новостях — и по определенной причине. Графовая модель представляет собой очень гибкий способ обработки отношений в ваших данных, а графические базы данных обеспечивают быстрое и эффективное хранение, поиск и запросы к ним.

Neo4j , самая популярная графовая база данных, доказала свою способность работать с огромными объемами сильно связанных данных во многих случаях.

Во время последней конференции GraphConnect TomTom и Ebay Shuttle продемонстрировали ценность, которую база данных графов добавляет для вашей компании, например, для обеспечения фантастического взаимодействия с клиентами или для обеспечения возможности сложного редактирования карты маршрутов. Neo4j разработан и поддерживается Neo Technology — стартапом, который превратился в уважаемую компанию по созданию баз данных.

Краткое введение

Для новичков, вот краткое введение в графические базы данных и Neo4j, кроме теоретического взгляда на него в прошлом году .

Что такое график?

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

what-is-a-graph

изображение через Википедию

Что такое база данных графиков

Графовая база данных — это база данных, оптимизированная для операций с подключенными данными.
Графические базы данных обеспечивают высокую производительность, подходящую для онлайн-операций, благодаря использованию выделенных структур хранения как для узлов, так и для связей.
Им не нужно вычислять отношения (JOINS) во время запроса, но эффективно хранить их как часть ваших данных.

Давайте возьмем в качестве примера простое социальное приложение, где пользователи следуют за другими пользователями.

Пользователь будет представлен как узел и может иметь метку и свойства . Метки обозначают различные роли для ваших узлов.

A Node

Связь между этими двумя пользователями будет представлена ​​в виде Отношения , которое также может иметь свойства и Тип для определения характера отношений. Отношения добавляют смысловой смысл вашим данным.

Nodes with Relationship

Взгляд на график показывает, насколько естественно представлять данные на графике и сохранять их в базе данных графиков.

MultipleNodesAndEdges

Cypher, Neo4j Графический язык запросов

Запрос графика может показаться не простым. Чтобы упростить задачу, Neo4j разработал Cypher , язык запросов декларативных графов, сфокусированный на удобочитаемости и выразительности для людей как разработчиков, администраторов и экспертов в предметной области.

Будучи декларативным, Cypher фокусируется на выражении того, что извлечь из графа, а не на том, как его извлечь.

Язык запросов состоит из нескольких отдельных пунктов. Подробнее о них вы можете прочитать в руководстве по Neo4j .

Вот несколько предложений, используемых для чтения и обновления графика:

  • МАТЧ: Находит шаблон графа «пример», который вы предоставляете на графике, и возвращает один путь на каждое найденное совпадение.
  • ГДЕ: Фильтрует результаты с помощью предикатов, так же, как в SQL. В Cypher есть еще много предикатов, включая операции сбора и сопоставления графов.
  • ВОЗВРАТ: возвращает результат запроса в нужной форме в виде скалярных значений, элементов графика или путей, коллекций или даже документов.
  • СОЗДАТЬ: Создает элементы графа (узлы и отношения) с метками и свойствами.
  • MERGE: Соответствует существующим образцам или создает их. Это сочетание MATCH и CREATE .

Cypher — это все о шаблонах, он описывает визуальное представление, которое вы уже видели, как текстовые шаблоны (используя ASCII-art).
Он использует круглые скобки для отображения узлов (например, (m:Movie) или (me:Person:Developer) ) и стрелок (например, --> или -[:LOVES]-> ) для отношений.

Глядя на наш последний график пользователей, запрос, который будет извлекать Ханну Хилперт и пользователей, следующих за ней, будет выглядеть следующим образом:

 MATCH (user:User {name:'Hannah Hilpert'})<-[:FOLLOWS]-(follower) RETURN user, follower 

HannahFriendships


Neo4j и PHP

После этого быстрого знакомства с графической базой данных Neo4j ( подробнее здесь ), давайте посмотрим, как мы можем использовать ее из PHP.

Neo4j устанавливается в качестве сервера базы данных.
HTTP-API доступен для управления базой данных и выдачи запросов Cypher.

Если вы хотите установить и запустить графическую базу данных Neo4j, вы можете скачать последнюю версию здесь: http://neo4j.com/download/ , распаковать архив на свой компьютер и запустить ./bin/neo4j start . Обратите внимание, что это только для систем * nix.

Neo4j поставляется с отличным визуальным интерфейсом, браузер Neo4j доступен по адресу http: // localhost: 7474 .
Просто попробуйте! В браузере есть несколько руководств по началу работы, но дополнительную информацию можно найти в Интернете .

Если вы не хотите устанавливать его на свой компьютер, вы всегда можете создать бесплатный экземпляр в GrapheneDB , поставщике услуг Neo4j As A Service.

Неокислородные компоненты

Neoxygen — это набор компонентов с открытым исходным кодом, большинство из которых на PHP, для экосистемы Neo4j, доступной на Github . В настоящее время я главный разработчик. Если вы заинтересованы в том, чтобы внести свой вклад, просто напишите мне .

Мощный клиент для HTTP-API Neo4j называется NeoClient , с поддержкой нескольких баз данных и встроенным управлением высокой доступностью.

Установка и настройка

Установка тривиальна, просто добавьте зависимость neoclient в ваш файл composer.json :

 { "require": { "neoxygen/neoclient":"~2.1" } } 

Вы настраиваете ваше соединение при сборке клиента:

 use Neoxygen\NeoClient\ClientBuilder; $client = ClientBuilder::create() ->addConnection('default', 'http', 'localhost', 7474) ->build(); 

Если вы создали экземпляр на GrapheneDB, вам необходимо настроить защищенное соединение с учетными данными. Это делается добавлением true для использования режима addConnection и ваших учетных данных в метод addConnection :

 <?php use Neoxygen\NeoClient\ClientBuilder; $connUrl = parse_url('http://master.sb02.stations.graphenedb.com:24789/db/data/'); $user = 'master'; $pwd = 's3cr3tP@ssw0rd'; $client = ClientBuilder::create() ->addConnection('default', $connUrl['scheme'], $connUrl['host'], $connUrl['port'], true, $user, $password) ->build(); 

Теперь у вас есть полный доступ к базе данных Neo4j с клиентом, подключающимся к HTTP API.

Библиотека предоставляет удобные методы для доступа к различным конечным точкам. Однако наиболее часто используемый метод — это отправка запроса Cypher .

Обработка графических результатов в необработанном ответе json немного громоздка. Вот почему библиотека поставляется с удобным средством форматирования результатов, которое преобразует ответ в объекты узла и отношения. Форматтер по умолчанию отключен, и вы можете включить его, просто добавив строку кода в процесс построения клиента:

 $client = ClientBuilder::create() ->addConnection('default', 'http', 'localhost', 7474) ->setAutoFormatResponse(true) ->build(); 

Давайте построим что-нибудь классное

Мы собираемся постепенно создавать набор пользовательских узлов и СЛЕДОВАТЬ отношениям. Затем мы сможем запросить информацию о друге, чтобы предоставить предложения о дружбе.

Запрос на создание пользователя выглядит следующим образом:

 CREATE (user:User {name:'Kenneth'}) RETURN user 

Запрос состоит из 5 частей:

query-anatomy

  • Предложение CREATE (синим цветом) указывает на то, что мы хотим создать новый элемент.
  • Идентификатор (оранжевый), используемый для идентификации вашего узла в запросе
  • Метка (красного цвета), используемая для добавления пользователя в группу с меткой « User ».
  • Свойства узла (выделены зеленым цветом) специфичны для этого узла.
  • Предложение RETURN, указывающее, что вы хотите вернуть, здесь созданный пользователь.

Вы также можете попробовать выполнить этот запрос в браузере Neo4j.

Не нужно ждать, давайте создадим этого пользователя с клиентом:

 $query = 'CREATE (user:User {name:"Kenneth"}) RETURN user'; $result = $client->sendCypherQuery($query)->getResult(); 

Вы можете визуализировать созданный узел в своем браузере (открыть помеченную вкладку и запустить «Получить некоторые данные») или получить результат графика с клиентом.

 $user = $result->getSingleNode(); $name = $user->getProperty('name'); 

Мы сделаем то же самое для другого пользователя, теперь с параметрами запроса. Параметры запроса передаются вместе с запросом, и это позволяет Neo4j кэшировать план выполнения запроса, что ускорит ваши дальнейшие идентичные запросы:

 $query = 'CREATE (user:User {name: {name} }) RETURN user'; $parameters = array('name' => 'Maxime'); $client->sendCypherQuery($query, $parameters); 

Как видите, параметры встраиваются в {} и передаются в массив параметров в качестве второго аргумента метода sendCypherQuery .

Если вы посмотрите на график сейчас, вы увидите два пользовательских узла, но они чувствуют себя совершенно одинокими :(, нет?

Imgur

Создание отношений

Чтобы создать отношения между нашими узлами, мы снова будем использовать Cypher.

 $query = 'MATCH (user1:User {name:{name1}}), (user2:User {name:{name2}}) CREATE (user1)-[:FOLLOWS]->(user2)'; $params = ['user1' => 'Kenneth', 'user2' => 'Maxime']; $client->sendCypherQuery($query, $params); 

Некоторые объяснения:

Сначала мы сопоставляем существующих пользователей с именами Kenneth и Maxime (имена предоставляются в качестве параметров), а затем создаем отношения FOLLOWS между ними.

Кеннет будет начальным узлом отношения FOLLOWS а Максим — конечным узлом .
Тип отношений будет следующим.

Глядя на график снова показывает, что отношения были созданы.

Imgur

Создание группы пользователей

Вручную писать все операторы создания для набора из 100 пользователей, и отношения будут скучными.
Я хочу представить очень полезный инструмент под названием Graphgen (один из компонентов Neoxygen) для удобной генерации графических данных.

Он использует спецификацию, очень близкую к Cypher, для описания нужного вам графика.
Здесь мы собираемся создать набор из 50 пользователей и соответствующие FOLLOWS отношения.

Перейдите по адресу http://graphgen.neoxygen.io , скопируйте и вставьте следующий шаблон в область редактора и нажмите « Создать» :

 (user:User {login: userName, firstname: firstName, lastname: lastName} *50)-[:FOLLOWS *n..n]->(user) 

Imgur

Вы можете видеть, что он автоматически генерирует график с 50 пользователями, отношениями и реалистичными значениями для имени входа, имени и фамилии. Впечатляет, нет?

Давайте импортируем этот график в нашу локальную базу данных графиков, нажмите Заполнить вашу базу данных и используйте настройки по умолчанию.

Imgur

В ближайшее время база данных будет заполнена данными.

Если вы откроете браузер Neo4j и снова запустите «Получить некоторые данные», вы увидите все пользовательские узлы и их взаимосвязи.

Imgur

Получение предложений

Получить предложения с Neo4j очень просто, вам просто нужно сопоставить одного пользователя, следовать отношениям FOLLOWS с другими пользователями, а затем для каждого найденного пользователя найти пользователей, за которыми они следуют, и вернуть тех, за которыми вы уже не следите. Предложение также не должно быть пользователем, для которого мы ищем предложения.

В обычном приложении будет система входа в систему, и пользователю будет разрешено видеть только тех пользователей, за которыми он следует. Ради этого поста, который представляет вам Neo4j, вы сможете поиграть со всеми пользователями.

Давайте напишем это в Cypher:

 $query = 'MATCH (user:User {firstname: {firstname}})-[:FOLLOWS]->(followed)-[:FOLLOWS]->(suggestion) WHERE user <> suggestion AND NOT (user)-[:FOLLOWS]->(suggestion) RETURN user, suggestion, count(*) as occurrence ORDER BY occurrence DESC LIMIT 10'; $params = ['firstname' => 'Francisco']; $result = $client->sendCypherQuery($query, $params)->getResult(); $suggestions = $result->get('suggestion'); // Returns a set of nodes 

Если вы выполните этот запрос в браузере neo4j, вы получите своего первого подходящего пользователя и предложения:

Imgur

Вывод

В этой части:

  • Вы обнаружили граф базы данных и Neo4j
  • Вы изучили основы языка запросов Cypher
  • Вы видели, как подключаться и выполнять запросы к базе данных Neo4j с помощью PHP

В следующей статье мы будем использовать все, что мы узнали до настоящего момента, и создадим настоящее PHP-приложение Neo4j Powere Silex.