В этой статье мы узнаем о Neo4j, ведущей графовой базе данных, и способах ее использования с PHP. В следующем посте мы создадим правильное графическое приложение на базе Silex.
Графовые базы данных в настоящее время являются одной из основных технологий компаний, работающих с данными с высокой степенью связи.
Бизнес-графики, социальные графы, графы знаний, графы интересов и медиа-графики часто встречаются в (технологических) новостях — и по определенной причине. Графовая модель представляет собой очень гибкий способ обработки отношений в ваших данных, а графические базы данных обеспечивают быстрое и эффективное хранение, поиск и запросы к ним.
Neo4j , самая популярная графовая база данных, доказала свою способность работать с огромными объемами сильно связанных данных во многих случаях.
Во время последней конференции GraphConnect TomTom и Ebay Shuttle продемонстрировали ценность, которую база данных графов добавляет для вашей компании, например, для обеспечения фантастического взаимодействия с клиентами или для обеспечения возможности сложного редактирования карты маршрутов. Neo4j разработан и поддерживается Neo Technology — стартапом, который превратился в уважаемую компанию по созданию баз данных.
Краткое введение
Для новичков, вот краткое введение в графические базы данных и Neo4j, кроме теоретического взгляда на него в прошлом году .
Что такое график?
Граф — это общая структура данных, состоящая из узлов (объектов), связанных отношениями. Иногда их также называют вершинами и ребрами. В модели графа свойств каждый узел и отношение могут быть помечены и содержать любое количество свойств, описывающих его.
изображение через Википедию
Что такое база данных графиков
Графовая база данных — это база данных, оптимизированная для операций с подключенными данными.
Графические базы данных обеспечивают высокую производительность, подходящую для онлайн-операций, благодаря использованию выделенных структур хранения как для узлов, так и для связей.
Им не нужно вычислять отношения (JOINS) во время запроса, но эффективно хранить их как часть ваших данных.
Давайте возьмем в качестве примера простое социальное приложение, где пользователи следуют за другими пользователями.
Пользователь будет представлен как узел и может иметь метку и свойства . Метки обозначают различные роли для ваших узлов.
Связь между этими двумя пользователями будет представлена в виде Отношения , которое также может иметь свойства и Тип для определения характера отношений. Отношения добавляют смысловой смысл вашим данным.
Взгляд на график показывает, насколько естественно представлять данные на графике и сохранять их в базе данных графиков.
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
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 частей:
- Предложение 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
.
Если вы посмотрите на график сейчас, вы увидите два пользовательских узла, но они чувствуют себя совершенно одинокими :(, нет?
Создание отношений
Чтобы создать отношения между нашими узлами, мы снова будем использовать 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
а Максим — конечным узлом .
Тип отношений будет следующим.
Глядя на график снова показывает, что отношения были созданы.
Создание группы пользователей
Вручную писать все операторы создания для набора из 100 пользователей, и отношения будут скучными.
Я хочу представить очень полезный инструмент под названием Graphgen
(один из компонентов Neoxygen) для удобной генерации графических данных.
Он использует спецификацию, очень близкую к Cypher, для описания нужного вам графика.
Здесь мы собираемся создать набор из 50 пользователей и соответствующие FOLLOWS
отношения.
Перейдите по адресу http://graphgen.neoxygen.io , скопируйте и вставьте следующий шаблон в область редактора и нажмите « Создать» :
(user:User {login: userName, firstname: firstName, lastname: lastName} *50)-[:FOLLOWS *n..n]->(user)
Вы можете видеть, что он автоматически генерирует график с 50 пользователями, отношениями и реалистичными значениями для имени входа, имени и фамилии. Впечатляет, нет?
Давайте импортируем этот график в нашу локальную базу данных графиков, нажмите Заполнить вашу базу данных и используйте настройки по умолчанию.
В ближайшее время база данных будет заполнена данными.
Если вы откроете браузер Neo4j и снова запустите «Получить некоторые данные», вы увидите все пользовательские узлы и их взаимосвязи.
Получение предложений
Получить предложения с 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, вы получите своего первого подходящего пользователя и предложения:
Вывод
В этой части:
- Вы обнаружили граф базы данных и Neo4j
- Вы изучили основы языка запросов Cypher
- Вы видели, как подключаться и выполнять запросы к базе данных Neo4j с помощью PHP
В следующей статье мы будем использовать все, что мы узнали до настоящего момента, и создадим настоящее PHP-приложение Neo4j Powere Silex.