Neo4j что это
Перейти к содержимому

Neo4j что это

  • автор:

Графовая база данных Neo4j в PHP

В последнее время я все чаще слышу о NoSQL и о графовых базах данных в частности. Но воспользовавшись хабропоиском с удивлением обнаружил, что статей на эту тему не так и много, а по запросу «Neo4j», так вообще 4 результата, где косвенно упоминается это название в тексте статей.

Что такое Neo4j?

Neo4j — это высокопроизводительная, NoSQL база данных основанная на принципе графов. В ней нет такого понятия как таблицы со строго заданными полями, она оперирует гибкой структурой в виде нод и связей между ними.

Как я докатился до этого?

Уже более года я не использовал в своих проектах SQL, с того времени, как попробовал документо-ориентированную СУБД “MongoDB“. После MySQL моей радости не было предела, как все просто и удобно можно делать в MongoDB. За год я переписал тройку CMS, использующих основные фишки Mongo c её документами, и с десяток сайтов работающих на их основе. Всё было хорошо, и я уже начал забывать, что такое писать запросы в полсотни строк на каждое действие с БД и все бы ничего пока на мою голову не свалился проект с кучей отношений, которые ну никак не укладывались в документы. Возвращаться к SQL очень не хотелось, и пару дней я потратил чисто на поиск NoSQL решения, позволяющего делать гибкие связи — на графовые СУБД. И по ряду причин мой выбор остановился на Neo4j, одна из главных причин — это то, что мой движок был написан на PHP, а для неё был написан хороший драйвер “Neo4jPHP“, который охватывает почти 100% REST-интерфейса, предоставляющегося сервером Noe4j. Read the full article.

Neo4j. Вместо тысячи join-ов…

Если вы столкнулись с задачей хранения сильно связанных данных, то отличным вариантом будет использовать графовую модель данных. Мы в Текфорс сделали именно так. Почему — разберем в этой статье, где я:

  • приведу общую информацию о том, где применяются графовые БД;
  • расскажу про Neo4j как один из примеров такой БД;
  • покажу на примере как использовать Neo4j через Spring Data.

Статья будет полезна тем, кто:

  • хочет расширить кругозор в плане графовых БД;
  • сомневается в правильности выбора типа БД;
  • ищет вводный материал по работе с Spring Data Neo4J.

Введение

Долгое время стандартом хранения данных были реляционные базы данных. Со временем разнообразных по структуре данных становилось все больше и стандартные способы хранения стали неудобными. В начале 2010-х стали появляться альтернативные варианты хранения, так называемые NoSql базы данных. Каждая имеет свои особенности: скорость выполнения операций, возможность хранить огромные объемы данных, линейная масштабируемость, отказоустойчивость.

Так, документо-ориентированная база данных MongoDB предназначена для хранения слабосвязанных данных, поступающих в виде документов; колоночная база данных ClickHouse быстро работает на вставку и получение данных, но не подразумевает их удаление и изменение.

При выборе базы данных могут возникнуть трудности

Применение графовых БД

Связи многие-ко-многим между объектами есть почти в каждой системе и реляционная база отлично справляется с их хранением. Но что делать, если:

  • связей так много, что таблицы связей больше таблиц данных,
  • запросы получения данных сложны и состоят из множества join-ов,
  • есть необходимость в частом получении данных или глубина поиска достаточно большая (>3)?

Например, в системе по типу социальной сети нужно проверить теорию шести рукопожатий.

Такие операции в реляционных базах стоят очень дорого. И если на небольших наборах данных проблема с производительностью будет не столь очевидна, то с ростом их объема время выполнения запроса существенно возрастет.

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

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

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

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

2. Социальные сети являются разновидностью систем рекомендаций. Они особенно актуальны в наше время, поскольку социальные сети получили колоссальное распространение и популярность. Очевидно, что если нужно предложить пользователю новые связи в социальном кругу, то необходимы рекомендации, предложенные по принципу «друг моего друга — мой друг».

Также графовые БД могут использоваться в системах контроля доступа, анализа влияния (чтобы понять, как бизнес отреагирует на сбои или для выбора оптимального сценария) и других системах.

Больше информации можно найти, например, в книге “Learning Neo4j” (Rik Van Bruggen), где подробно расписаны кейсы использования графовых БД.

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

Графовая модель данных

Формально граф – это система объектов произвольной природы (вершин) и связок (ребер), соединяющих некоторые пары этих объектов.

Графовая модель данных имеет следующие особенности:

Графическая модель данных (Источник: https://neo4j.com/)

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

В качестве примера создадим модель данных для системы рекомендаций, которая хранит информацию о людях и фильмах, которые они посмотрели. Каждый фильм также может относиться к нескольким жанрам.

Простая модель графа в виде схемы

По этой модели легко определить, что Вова — друг Маши, Маша смотрела фильм Титаник, который является драмой.

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

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

Описание Neo4j

После установки Neo4j вам будет доступен Neo4j-browser (по дефолту http://localhost:7474/browser/) – инструмент для выполнения CRUD-операций в БД Neo4j. Он имеет богатый пользовательский интерфейс для визуализации данных в виде графиков.

Граф в браузере Neo4j после выполнения команды Cypher

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

Рассмотрим некоторые примеры запросов для описанной выше модели данных.

Вот как выглядит запрос операции добавления узлов и связей для нашего примера (добавим людей и пару фильмов с жанрами):

CREATE (igor: Person ), (misha: Person ), (olya: Person ), (am_pie: Movie ), (saw: Movie ), (home_alone: Movie ), (comedy: Genre ), (horror: Genre ), (olya) -[:WATCHED]-> (am_pie) -[:HAS_GENRE]-> (comedy), (olya) -[:WATCHED]-> (saw), (olya) -[:WATCHED]-> (home_alone), (misha) -[:WATCHED]-> (saw), (igor) -[:WATCHED]-> (am_pie), (home_alone) -[:HAS_GENRE]-> (comedy), (igor) -[:IS_FRIEND]-> (misha), (misha) -[:IS_FRIEND]-> (olya)

С помощью запроса MATCH (n) RETURN n можно получить все имеющиеся данные. В Neo4j-browser они будут представлены так:

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

Теперь напишем запрос, который получает все фильмы-комедии, которые смотрели друзья друзей пользователя, но которые он не смотрел сам.

MATCH (igor:Person)-[:IS_FRIEND*2]->()-[:WATCHED*0..1]-> (m:Movie)-[]->(comedy: Genre ) WHERE not (igor)-[:WATCHED]->(m) RETURN m

Запрос получился достаточно компактным и простым для понимания.

Подобный запрос для реляционной базы данных выглядел бы громоздким:

select m.* from person p left join person_friend pF1 on p.id = pF1.person_id left join person_friend pF2 on pF1.friend_id = pF2.person_id left join watched watched on pF2.friend_id = watched.person_id left join movie_genre mG on watched.movie_id = mG.movie_id left join genre genre on mG.genre_id = genre.id left join movie m on m.id = mG.movie_id where p.name = 'Igor' and p.id<> pF2.friend_id and genre.name='Comedy' except select m2.* from watched w2 left join person p2 on w2.person_id = p2.id left join movie m2 on m2.id = w2.movie_id where p2.name = 'Igor' 

Для обхода графа в глубину в реляционной базе пришлось бы применять рекурсивные функции, которые усложняют синтаксис и увеличивают время выполнения запроса, тогда как в языке Cypher существует компактная запись ()-[*0..]->(), которая означает 0 или более ребер до узла.

Далее я расскажу о работе с БД Neo4j через Spring Data.

Использование Spring data neo4j

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

Spring Data Neo4j 5 (SDN 5) и ранние версии использовали Neo4j-OGM под капотом.

Neo4j-OGM (Object Graph Mapper) сопоставляет узлы и отношения в графе с объектами и ссылками в доменной модели. Экземпляры объектов сопоставляются с узлами, а ссылки на объекты сопоставляются с помощью отношений или сериализуются в свойства.

Spring Data Neo4j 6 является standalone решением без использования Neo4j-OGM.

В новой версии мы по прежнему можем работать со связями (relationships), которые имеют свойства (properties), но не напрямую через @RelationshipEntity, а через сущности (@Node), определяющие отношения (@Relationship) для их загрузки, изменения и сохранения.

Вот пример использования Spring Data Neo4j 6 для созданного ранее запроса.

  1. Создаем класс для каждого типа узла:
Node("Person") public class PersonNeo4jEntity < @Id @GeneratedValue(GeneratedValue.UUIDGenerator.class) private UUID id; @Property("name") private UUID name; @Relationship(type = "IS_FRIEND", direction = Relationship.Direction.OUTGOING) private Listfriends; >
  1. Описываем каждый тип связи в отдельном классе, помеченном аннотацией @RelationshipProperties:
@RelationshipProperties public class EdgeFriendNeo4j
  1. Для работы с базой создадим репозиторий, который наследуется от одного из интерфейсов Spring Data, например от CrudRepository.
public interface PersonNeo4jRepository extends CrudRepository <>

Это позволяет нам выполнять основные CRUD-запросы к Neo4j, а также дописывать дополнительные методы запросов в терминах Spring Data.

  1. При необходимости создаем методы получения узла:
Optional findOneByPersonName(String name);

Результатом выполнения такого метода будет узел с загрузкой всех связей.

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

@Query("match (n:Person)-[r]->(m) \n" + "where n.person_name=$name\n" + "return n, COLLECT(r), COLLECT(m)") List getNodeByName(String name);

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

@Query("match (n:Person )-[r]->()\n" + " return n") PersonNeo4jEntity getNodeByName(String name);

Пара важных рабочих моментов:

  1. Только стрелки с помощью SDN вернуть нельзя, мы должны вернуть связанный объект-узел, а из него уже получить связи.
  2. В Cypher мы можем написать такой рабочий запрос, который вернет только связи:
match (n)-[r]-(m) return r

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

Заключение

Итак, графовые БД – отличное решение для хранения данных, связанных отношениями многие-ко-многим. Они предназначены для сценариев, в которых любые данные потенциально могут быть взаимосвязаны.

Мы в Текфорс использовали базу данных Neo4j для хранения данных, необходимых для отчетной подсистемы. Они хранились в реляционной базе и по мере наполнения необходимые для отчета данные складывались в Neo4j. При запросе отчета оставалось только обратиться к заранее подготовленным данным из Neo4j. Использование специализированной базы данных позволило избежать ограничений конкретного хранилища данных и эффективно реализовать разнородные запросы. Мартин Фаулер называет такой подход polyglot persistence.

Любая модель данных будет показывать хорошие результаты, если разумно применять ее для подходящий задачи. Надеюсь, что моя статья дала вам понимание того, когда следует использовать графовые базы, а также как работать с БД Neo4j, используя Spring Data Neo4j.

  • Графовые базы подойдут, если в вашем приложении данные связаны иерархически, Neo4j — пример такой БД;
  • Neo4j-browser — удобный инструмент для выполнения операций над данными и визуализации;
  • БД Neo4j имеет собственный язык запросов Cypher. Запросы на нем выглядят лаконичнее и понятнее, чем аналогичные запросы для реляционной БД;
  • Spring Data Neo4j как часть Spring Data позволяет работать с Neo4j из java-кода привычным способом.

Спасибо за внимание!

  • базы данных
  • графовые базы данны
  • neo4j
  • spring data neo4j

База данных Neo4j Graph: возможности для вашего бизнеса

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

Сегодня популярность графовых баз данных значительно возрастает. По оценкам, объем рынка графовых баз данных вырастет с 821,8 млн долларов в 2018 году до 2,5 млрд долларов к 2023 году . Все больше и больше компаний понимают, что реальная сила заключается не в самих данных, а в том, как они связаны между собой.

Многие приложения работают с реляционными базами данных , такими как MySQL и PostgreSQL. Несмотря на свои преимущества, реляционные базы данных вряд ли могут обрабатывать бесчисленные объемы связанных данных. Вот почему нереляционные базы данных, такие как Neo4j, оптимизированы, чтобы помочь вам создавать высокопроизводительные и масштабируемые приложения, которые легко используют бесчисленные объемы подключенных данных. Не многие разработчики знают о возможностях графовых баз данных и Neo4j. В этой статье мы расскажем все о Neo4j и его возможностях.

Концепции и принципы баз данных Neo4j

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

Графовые базы данных: лучшее решение для обработки соединенных данных

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

Вот как работает графовая база данных, такая как Neo4j. Базы данных Graph — это базы данных NoSQL, которые могут хранить, отображать и запрашивать связи между данными. Элементы в графовой базе данных могут соединяться друг с другом любым возможным способом.

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

Реляционные базы данных и нереляционные базы данных

Разработчики, которые на протяжении всей своей карьеры работали только с реляционными базами данных, наверняка зададутся вопросом: «Какой смысл использовать нереляционные модели, такие как Neo4j?»

При использовании реляционных баз данных все кажется простым и понятным. Несмотря на это, есть некоторые существенные недостатки в использовании этих баз данных, о которых вы должны знать:

  • Ограниченный объем: реляционные базы данных плохо оптимизированы для обработки больших объемов данных.
  • Скорость: реляционные хранилища не работают быстро, когда им нужно обрабатывать огромное количество операций.
  • Отсутствие отношений: хранилища реляционных данных ограничены описанием только стандартных отношений, включая отношения «один к одному», «один ко многим» и «многие ко многим».
  • Разнообразие: реляционные базы данных неэффективны при работе с большими двоичными и полуструктурированными данными (JSON и XML).
  • Масштабируемость: горизонтальное масштабирование неэффективно для реляционных баз данных.

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

Графовая база данных Neo4j

Графовые базы данных, такие как Neo4j, в основном основаны на математической теории графов. Графы — это структуры, состоящие из двух основных параметров: вершин и ребер.

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

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

Neo4j имеет тенденцию показывать концепцию теории графов по-своему. Чтобы узнать как именно, нам нужно взглянуть на модель Neo4j ниже.

Попробуйте no-code платформу AppMaster

AppMaster поможет создать любое веб, мобильное или серверное приложение в 10 раз быстрее и 3 раза дешевле

Основные компоненты базы данных Neo4j

Модель Neo4j в основном состоит из следующих основных компонентов:

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

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

В этой простой модели два основных узла — это Алиса и Боб. Они связаны друг с другом отношениями. Оба узла имеют одинаковую метку «Человек». В этой модели только узлу Боба были заданы некоторые свойства; однако в графовой модели Neo4j каждый узел и связь могут содержать свойства.

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

Neo4j в сравнении с реляционными базами и NoSQL

Теперь, когда мы знаем основы базы данных Neo4j и графовой модели данных, вам может быть интересно узнать о разнице между базой данных Neo4j и реляционными хранилищами данных. Хотя Neo4j входит в список инструментов NoSQL, он все же отличается от других баз данных NoSQL. Для этого важно знать различия между базой данных Neo4j и другими реляционными и нереляционными базами данных.

Хранилище данных
В случае хранения данных база данных Neo4j использует структуру хранения графа. Реляционные базы данных используют фиксированные, предопределенные таблицы, состоящие из строк и столбцов. Кроме того, базы данных NoSQL используют подключенное хранилище данных, которое не поддерживается на уровне базы данных.

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

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

Язык запросов
Язык шифрования используется в модели Neo4j, которая является родным языком запросов к графам. Язык SQL используется в реляционных базах данных, что увеличивает сложность по мере роста числа объединений. В случае моделей NoSQL используются разные языки, но ни один из них не разработан должным образом для выражения отношений.

Поддержка сделки
Транзакции ACID поддерживаются как в Neo4j, так и в реляционной модели. Говоря о базах данных NoSQL, транзакции BASE показали свою ненадёжность в отношениях с данными.

Масштабируемость
База данных Neo4j изначально масштабируема для запросов на основе шаблонов. Реляционные базы данных масштабируются за счет репликации, но нерентабельны. Базы данных NoSQL также являются масштабируемыми, но целостность данных в них не заслуживает доверия.

Преимущества базы данных Neo4j

Модели Neo4j специально разработаны для обработки значительных объемов подключенных данных. Эти модели обладают некоторыми основными преимуществами, в том числе:

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

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

Попробуйте no-code платформу AppMaster

AppMaster поможет создать любое веб, мобильное или серверное приложение в 10 раз быстрее и 3 раза дешевле

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

  • Управление отношениями между данными

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

Варианты использования базы данных Neo4j

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

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

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

Прекращение мошенничества

Традиционные меры по предотвращению мошенничества сосредоточены на отдельных точках данных, включая учетные записи, отдельных лиц, устройства или IP-адреса. Проблема здесь в том, что современные преступники сегодня могут избежать этих методов обнаружения, просто создавая мошеннические сети с ненастоящими личностями. Чтобы предотвратить это, необходимо смотреть на связи, которые связывают отдельные точки данных.

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

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

Сеть и ИТ-операции

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

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

Рекомендательные системы

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

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

Приложения для социальных сетей

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

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

Управление идентификацией

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

Попробуйте no-code платформу AppMaster

AppMaster поможет создать любое веб, мобильное или серверное приложение в 10 раз быстрее и 3 раза дешевле

Телекоммуникации

Связь являются основой телекоммуникаций, а графовые базы данных, такие как Neo4j, являются:

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

Neo4j позволяет предприятиям работать быстрее, постоянно улучшая свои данные.

Правительство

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

ИИ и аналитика

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

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

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

Науки о жизни

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

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

Финансовые услуги

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

Крупнейшие пользователи Neo4j в мире

Сегодня крупнейшие организации в мире используют Neo4j для оптимизации управления своими бесчисленными данными. Neo4j — ведущий мировой поставщик масштабируемых графовых технологий, который помогает 75% компаний из списка Fortune 100 улучшать свои подключенные приложения для работы с данными.

На сегодняшний день крупнейшими отраслями и компаниями, использующими технологию Neo4j, являются:

  • 7 из 10 крупнейших ритейлеров мира, таких как eBay, ADEO и ATPCO
  • 3 из 5 крупнейших производителей самолетов в мире, таких как Airbus
  • 8 из 10 крупнейших страховых компаний мира, таких как Bayerische и Allianz
  • Все 20 крупнейших банков Северной Америки, такие как JP Morgan, Citi, Chase и UBS
  • 8 из 10 крупнейших мировых автопроизводителей, таких как Volvo, Toyota и Daimler
  • 3 из 5 лучших отелей мира, таких как Marriott и AccorHotels
  • 7 из 10 крупнейших телекоммуникационных компаний мира, таких как Verizon, Orange, AT&T и Comcast

Заключение

Современные приложения сегодня сталкиваются с серьезной проблемой обработки огромных объемов связанных данных, поэтому они остро нуждаются в эффективных технологиях, которые помогут им справиться с этой проблемой. Графовая технология Neo4j позволяет создавать приложения, способные в режиме реального времени предоставлять полезную информацию о связанных данных для дальнейшего анализа и принятия правильных решений.

Если вы хотите использовать новейшие достижения в мобильной и веб-разработке и включить графовые базы данных, такие как Neo4j, в свои приложения. В таком случае платформа no-code AppMaster — это то, что вам нужно. Платформа позволяет эффективно создавать веб-приложения и мобильные приложения, и, конечно же, есть backend, который является самым мощным из существующих платформ визуального программирования .

NEO4J – графовые базы данных

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

  • Установим и настроим Neo4j;
  • Создадим базы данных с использованием Python;
  • Познакомимся с базовым синтаксисом языка Cypher для создания запросов;
  • Рассмотрим пример использования данной СУБД.
Что такое Neo4j или немного теории

Neo4j — это графовая система управления базами данных с открытым исходным кодом, реализованная на Java. Она является ведущей графовой СУБД в мире. Аналогами Neo4j являются Oracle NoSQL Database, HypherGraphDB, GraphBase, InfiniteGraph и AllegroGraph.

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

Почему графы и где они используются?

Графы – это удобная и наиболее понятная визуальная система описания данных. Обычно они используются в геоинформационных системах, логистике, социальных сетях и т.п.

На этом теории достаточно, переходим к практике

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

Ход работы:

  1. Скачиваем среду разработки Neo4j Desktop с официального сайта. Больше информации можно прочесть в гайде для разработчиков
  2. Создаем базу данных

Кликаем на «New» чтобы создать новый проект. После нажимаем на Add -> local DBMS и уже в самом конце называем её (больше информации тут). После всех проделанных действий нам необходимо запустить её и открыть Neo4j Browser (большая синяя кнопка с надписью «Open»).

3. Добавление администратора.

В Neo4j browser необходимо ввести команду server user add, для того, чтобы добавить пользователя и после заполнить все поля. В поле roles нужно выбрать admin.

4. Python + Neo4j. Подключение к СУБД.

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

pip install neo4j

После импортируем GraphDatabase для подключения к СУБД.

 from neo4j import GraphDatabase

Далее представлен код для подключения

class Neo4jConnection: def __init__(self, uri, user, password): self.driver = GraphDatabase.driver(uri, auth=(user, password)) def close(self): if self.driver is not None: self.driver.close() # Метод, который передает запрос в БД def query(self, query, db=None): assert self.driver is not None, "Driver not initialized!" session = None response = None try: session = self.driver.session(database=db) if db is not None else self.driver.session() response = list(session.run(query)) except Exception as e: print("Query failed:", e) finally: if session is not None: session.close() return response

Запросы в Neo4j пишутся на языке Cypher. Он интуитивно понятный для освоения. Документацию по этому языку можно прочитать перейдя по ссылке.

Итак, подключаемся к СУБД. Создаем объект connection и передаем имя пользователя и пароль (который создавали при регистрации пользователя). Далее передаем запрос на создание самой базы данных «graphDb» — это название БД.

conn = Neo4jConnection(uri="bolt://localhost:7687", user="Mario", password="123123") conn.query("CREATE OR REPLACE DATABASE graphDb")

Далее необходимо загрузить все данные из таблицы в БД (загружаем таблицу Product). Для этого пишем запрос:

query_string = ''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/bd/main/Product.csv' AS line FIELDTERMINATOR ',' MERGE (product:Product ) ON CREATE SET product.productName = line.ProductName, product.UnitPrice = toFloat(line.UnitPrice); ''' conn.query(query_string, db='graphDb')

Как работает данный запрос? Он загружает CSV-файл из github, после построчно считывает данные, разделяя их по запятой (FIELDTERMINATOR ‘,’). Далее связываем узлы (объекты) и создаем свойства объекта

product.productName = line.ProductName

После запускаем код и переходим в Neo4j browser. В окне «Node Labels» кликаем по появившейся кнопке «Product».

Поздравляю! Вывели узлы Product. Если нажать на один узел, то в окне справа появятся все свойства (productName, productID, UnitPrice), которые мы прописывали в запросе.

Далее создаем запросы на загрузку остальных данных из других таблиц. Код можно посмотреть в GitHub. В итоге в левом окне должно быть 5 узлов:

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

MATCH (n) RETURN n 

Пока наши узлы (объекты) не имеют отношений с другими узлами.

5. Запросы на создание отношений.

Допустим, нам нужно посмотреть какие заказы выполнили сотрудники. Для этого нужно связать узлы (объекты) Order и Employee. Создаем следующий запрос:

query_string =''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/bd/main/Order.csv' AS line MATCH (order:Order ) MATCH (employee:Employee ) CREATE (employee)-[:SOLD]->(order); ''' conn.query(query_string, db='graphDb')

MATCH – это основной способ получения данных в текущем наборе привязок. С помощью CREATE создаем саму связь, синтаксис напоминает строение графа, в «[]» прописываем название связи. Более наглядно это можно продемонстрировать следующим образом:

Данный запрос создаст связь, которая отобразиться в левом окне. Эта связь показывает отношение между сотрудником и заказами, который выполнил сотрудник. Например, Aleekseev -> SOLD-> Grandma’s Bakery, означает, что сотрудник Алексеев продал что-то Grandma’s Bakery (это что-то мы узнаем чуть позже).

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

Теперь нам необходимо узнать, какой именно продукт приобрели в заказе. Для этого пишем следующий запрос:

query_string = ''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/bd/main/Order.csv' AS line MATCH (order:Order ) MATCH (product:Product ) MERGE (order)-[op:PURCHASED]->(product) ON CREATE SET op.quantity = toFloat(line.Quantity); ''' conn.query(query_string, db='graphDb')

И так, у нас есть связи сотрудника с заказом и с проданным в заказе продуктом. Теперь создадим связь между продуктом и поставщиком, а также свяжем его с категорией товара. Для этого выполните два запроса:

query_string = ''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/bd/main/Product.csv ' AS line MATCH (product:Product ) MATCH (supplier:Supplier ) MERGE (supplier)-[:SUPPLIES]->(product); ''' conn.query(query_string, db='graphDb'

query_string = ''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/bd/main/Product.csv' AS line MATCH (product:Product ) MATCH (category:Category ) MERGE (product)-[:IS_CATEGORY]->(category); ''' conn.query(query_string, db='graphDb')

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

Давайте проанализируем сотрудника Timofeeva. Из графа видно, какие именно товары она продала «Fresh product», и кто был поставщиком данных товаров.

Также помним, что это все-таки база данных, и здесь можно узнать имя, фамилию и должность сотрудника — кликнув по объекту.

6. Запросы для поиска конкретной информации.

До этого все запросы писались через Python, но их можно создавать в самой Neo4j browser (в строке сверху).

Допустим, нужно найти конкретного поставщика (например, Peter ‘s Lands), и какие продукты он поставляет. Пишем запрос:

MATCH (s:Supplier)-[r1:SUPPLIES]->(p:Product) RETURN s, r1, p;

Необязательно всегда выводить нужную информацию в графах, можно и в таблице. Например, выведем информацию о том какие продукты продал сотрудник Nekrasov.

MATCH (p:Product)<-[:PURCHASED]-(:Order)<-[:SOLD]-(em:Employee) RETURN em.lastName + ' '+em.firstName as Full_name, p.productName as sold_products

Результатом этого запроса будет:

Разница в том, какие данные возвращаем. Если это свойства объекта, то результатом выполнения запроса будет таблица.

Также мы можем выгрузить данные из БД. Для этого импортируем pandas.

query_string = ''' MATCH (em:Employee) RETURN em.firstName, em.lastName, em.post ''' dtf_data = DataFrame([dict(_) for _ in conn.query(query_string, db='graphDb')]) print(dtf_data)

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

После того, как рассмотрели базовые вопросы, касаемые Neo4j, нужно разобраться с вопросом, где же все-таки применяются графовые базы данных в реальных проектах? Один из таких примеров — это рекомендации по предложению продукта (товара). Мы же рассмотрим пример «Рекомендация статей для читателей» с использование Neo4j.

Пример «Рекомендация статей для читателей»

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

Чтобы показать, как это работает, давайте создадим модель данных:

Наша система рекомендаций будет содержать следующие объекты с атрибутами:

  • articles – title,
  • category_articles – title,
  • reader – name, email, nickname,
  • RecommendationArticleToReader – nickname

Отношения будут следующие:

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

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

2. Работа в Neo4J:

Заполняем нашу БД в соответствии с моделью, которую мы определили выше. Запросы будем писать в Neo4j Browser.

Загружаем данные в формате csv c github:

# LOAD CATEGORY query_string = ''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/ArticleBD/main/Category.csv' AS line FIELDTERMINATOR ',' MERGE (category:Category ) ON CREATE SET category.title = line.title; ''' conn.query(query_string, db='graphDb') # LOAD ARTICLES query_string = ''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/ArticleBD/main/Articles.csv' AS line FIELDTERMINATOR ',' MERGE (article:Article ) ''' conn.query(query_string, db='graphDb') # LOAD READER query_string = ''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/ArticleBD/main/Reader.csv' AS line FIELDTERMINATOR ',' MERGE (reader:Reader ) ON CREATE SET reader.nickname = line.nickname,reader.email = line.email; ''' conn.query(query_string, db='graphDb')

Далее создаем отношения article-[:IS_IN]-> category и reader-[:READ]->article:

# LOAD CATEGORY_ARTICLES query_string =''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/ArticleBD/main/Category_articles.csv' AS line MATCH (category:Category ) MATCH (article:Article ) CREATE (article)-[:IS_IN]->(category); ''' conn.query(query_string, db='graphDb') # LOAD READ_ARTICLES query_string =''' LOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/Mario-cartoon/ArticleBD/main/read_articles.csv' AS line MATCH (reader:Reader ) MATCH (article:Article ) CREATE (reader)-[:READ]->(article); ''' conn.query(query_string, db='graphDb')

3. Создадим рекомендации статей для читателей основываясь на прочитанных статьях. Для этого пишем запрос:

MATCH (reader:Reader) MATCH (unread_article:Article) WHERE NOT ((reader)-->(unread_article)) MATCH (article:Article) WHERE ((reader)-->(article)) MATCH (unread_article)-[:IS_IN]->()) WITH rec, unread_article, reader MERGE(rec)-[rel:USED_TO_PROMOTE ]->(unread_article) RETURN rec, unread_article, rel;

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

Обращаю внимание, что в связи: RECOMMEND_READING передается email читателя.

Итак, теперь выведем все связи и сущности, а также проанализируем получившийся граф, а именно, возьмем одного читателя и посмотрим все связи. Для примера возьмем Ivan Ivanov. Из графа видно, что он прочёл, и какие статьи ему предлагается прочитать.

Давайте напишем запрос чтобы вывести только рекомендации по читателю Ivan Ivanov:

MATCH (rec: RecommendationArticleToReader )-[:RECOMMEND_READING]->(article:Article) RETURN article,rec;

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

MATCH (reader:Reader)-->(article:Article) RETURN reader, article;

Из графа видно, что у многих читателей есть общие прочитанные статьи, и мы можем рекомендовать им те статьи, которые прочёл читатель (с которым есть общая прочтённая статья), но не прочел другой. Для примера возьмем читателя Ivan Ivanov. Пишем запрос:

MATCH (reader_1:Reader)-->(article_1:Article)(article_2:Article) WHERE (article_2 <> article_1) RETURN reader_1, reader_2, article_2,article_1;

С помощью этого запроса мы возвращаем статью, не прочитанную Ivan’ом, но прочитанную читателем, с которым у Ivan’a есть общая прочитанная статья. Т.е. в переменной article_2 хранится статья, не прочитанная Ivan’ом. Для примера возвратили все переменные чтобы увидеть связь между сущностями.

Но, чтобы вывести только нужные статьи, достаточно вернуть только переменную article_2.

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

  • Python
  • Программирование
  • Визуализация данных

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *