Статьи

Использование базы данных Graph с Ruby. Часть I: Введение

Отказ от ответственности: доступно несколько проектов баз данных Graph, включая проекты с открытым исходным кодом и коммерческие проекты, проекты, которые нацелены быть API-интерфейсами для баз данных Graph, и проекты, специализирующиеся на распределенной обработке графов. В статьях из серии «Использование графической базы данных с Ruby» я собираюсь обсудить и использовать исключительно Neo4j .

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

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

База данных графиков не является базой данных для хранения графики или изображений, как можно предположить из ее названия. Это база данных, которая использует графовые структуры, такие как узлы, свойства и ребра, для представления и хранения данных. Кроме того, он позволяет представлять любые данные без ограничения обычных баз данных.

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

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

Свойства : Свойства, иногда называемые атрибутами, являются именованными значениями, которые относятся к узлам. Например, если мы примем во внимание наше представление City узла, одно из свойств будет «name», другое — «population» и т. Д.

Края : края, иногда называемые Отношениями, соединяют узлы с узлами и объединяют их в произвольные структуры, такие как Карта, Список или Дерево. Важно отметить, что когда узел является начальным узлом отношения, отношения с точки зрения этого узла будут исходящими отношениями. И когда узел находится в конце отношения, отношения с точки зрения этого узла будут входящими отношениями. Понимание этого поможет вам следовать примерам.

Для чего может использоваться база данных графиков?

Есть много сценариев, для которых можно рассмотреть возможность использования базы данных графиков. Прежде чем перечислить несколько примеров, как и в случае любого архитектурно-технического решения, необходимо проанализировать все возможные решения. Затем вы можете выбрать те, которые лучше для вас, в соответствии с вашими требованиями.

Некоторые из этих сценариев включают в себя: социальные сети, обнаружение мошенничества, рекомендации людей / фильмов / музыки, производство и т. Д. Используя пример социальных сетей, было бы несколько тривиально сделать что-то вроде «учитывая тот факт, что Боб мой друг, дайте мне все друзья, которые друг друга друзей друга Боба ». Это возможно из-за того, что задействованные алгоритмы поиска путей легко реализовать путем обхода графа. Представляете, что делаете это через реляционную базу данных? Кошмар!

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

Пример базы данных графиков

Давайте рассмотрим следующий сценарий и то, как мы его структурировали бы, используя базу данных графиков: Джон дружит с Бобом, а Боб дружит с Марком. Визуально, вот как мы могли бы представить сценарий:

Вы замечаете, что визуальное представление в значительной степени соответствует тому, как мы устно выражали наш сценарий. Это очень простой пример, который мы можем использовать для сравнения реализации традиционной структуры базы данных SQL и структуры базы данных Graph:

Традиционный SQL

В традиционной структуре SQL каждая строка в таблице users представляет пользователя, а каждая строка в таблице friends представляет отношение между двумя пользователями. Если мы решим добавить дополнительные свойства в таблицу users позже, нам придется изменить базовую структуру этой таблицы. И если бы мы хотели добавить новые свойства только к подмножеству пользователей, нам все равно пришлось бы изменить всю таблицу пользователей или создать новую таблицу для размещения новых значений только для подмножества пользователей. Не идеальный сценарий при работе с десятками миллионов записей.

База данных графиков

Структура базы данных графа

С другой стороны, база данных Graph не имеет заданной структуры или схемы для данных, как и база данных NoSQL. Теперь давайте разберемся, что представляет собой приведенный выше график: каждый узел представляет собой сущность — пользователя в нашем случае; каждый узел содержит значения свойств, в данном случае это имя пользователя; и каждая строка представляет отношение между узлами. Это так просто, как только может. И чтобы дополнить сценарий, описанный в традиционном примере SQL, если бы мы решили добавить дополнительные свойства для подмножества пользователей, мы могли бы легко выполнить это действие на уровне узла вместо транзакции всей таблицы.

Что такое Neo4j

Neo4j — «Ведущая графическая база данных в мире», по словам Neo Technology, разработчика проекта. Это коммерчески поддерживаемая графическая база данных с открытым исходным кодом, реализованная на Java, и некоторые из ключевых характеристик включают в себя:

  • Представление данных с использованием интуитивно-ориентированной граф-ориентированной модели.
  • Связывание для ряда языков, включая Ruby, Python и Closure.
  • Встроенный диспетчер хранения на основе дисков, полностью оптимизированный для хранения структур графиков, обеспечивает максимальную производительность и масштабируемость.
  • Большая масштабируемость позволяет обрабатывать графики нескольких миллиардов узлов / отношений / свойств на одном компьютере.
  • Простой в использовании и удобный объектно-ориентированный API.
  • Работает с большими графиками, которые не помещаются в памяти, с долговечностью и полностью постоянным транзакционным хранилищем.
  • Мощная структура обхода для скоростных обходов в пространстве узлов.
  • Оптимизирован для сильно связанных данных.
  • Небольшая площадь, всего около 750 тыс. Фляг.
  • Он предоставляет интерфейс REST для языков, не поддерживаемых его привязками.
  • Он способен преодолевать глубины более 1000 уровней на миллисекундных скоростях.
  • Он предоставляет двойную лицензию: с открытым исходным кодом и коммерческой.
  • Он легко интегрируется с Lucene, предоставляя полнотекстовый поиск по узлам и отношениям, включая запросы фраз, групповые запросы, запросы близости, ранжированный поиск, сортировку и многое другое.

Использование Neo4j с Ruby

Существуют различные способы интеграции Neo4j с приложением Ruby (или Rails), и прежде чем перечислять их здесь, ниже приведены некоторые из объединенных функций из доступных решений:

  • Объектно-ориентированное картирование
  • «Вставная» замена для ActiveModel
  • Встроенная база данных
  • Тонкая рубиновая оболочка для Neo4j REST Api
  • Индексирование для полнотекстового поиска
  • Цепные методы, например: method (x) .method (y) .method (z)
  • При использовании с Rails синтаксис очень похож на ActiveRecord

Аккуратно, не правда ли? И без дальнейших церемоний, вот драгоценные камни, которые мы будем использовать в следующей статье:

  • Neo4j.rb: графовая база данных для JRuby
  • Neoid: использует Neo4j.rb для питания своих объектов поиска
  • Neography: Rest API для сервера Neo4j

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

Что дальше

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