В рамках продвижения нашего нового курса по графовой для аналитики больших данных аналитике больших данных, сегодня познакомимся с клиентской Python-библиотекой Neo4j под названием Py2neo, которая позволяет отказаться от языка запросов Cypher. Читайте далее, что это такое, как работает и где пригодится.
Python вместо Cypher в приложениях для Neo4j
Манипуляции с данными в графовой базе Neo4j выполняются средствами SQL-подобного языка запросов Cypher. Он оптимизирован для графов, определяет и использует отношения данных, исследуя взаимосвязи во всех направлениях, чтобы обнаружить ранее невидимые отношения и кластеры. Однако, Python дает большую гибкость в работе с данными. Поэтому многие Data Scientist’ы предпочитают его для различных программ, включая автоматизацию процесса создания узлов и связей. В этом случае отлично пригодится библиотека Py2neo – Python-пакет, который работает с Neo4j. Его можно установить его с помощью менеджера пакетов pip через всем известную команду pip install py2neo в командной строке. Далее можно открывать любимый Python-редактор и запускать граф в Neo4j.
Итак, клиентская Python-библиотека Py2neo включает набор инструментов для работы с Neo4j из приложений Python и из командной строки. Библиотека поддерживает как Bolt, так и HTTP и предоставляет высокоуровневый API, OGM, инструменты администрирования, интерактивную консоль, лексический шифратор Cypher для Pygments и многие другие функциональные возможности, которые пригодятся для анализа графов. Напомним, Bolt — это прикладной протокол для выполнения запросов к базе данных с помощью языка запросов Cypher через обычное TCP-соединение или WebSocket. Bolt наследует свою базовую систему типов от PackStream, по которой обычно передаются его сообщения. Каждая версия Bolt предоставляет ряд расширений системы типов через механизм расширения типов PackStream – двоичный формат представления для обмена данными с широким набором типов, который обеспечивает уровень синтаксиса для протокола обмена сообщениями Bolt.
Начиная с версии 2021.1, Py2neo содержит полную поддержку маршрутизации, представленную кластером Neo4j, что можно включить с помощью URI neo4j://… или путем передачи параметра routing=True в конструктор Graph. Вообще Py2neo состоит из нескольких отдельных областей API, ядром которых является Graph API. Класс Graph представляет базу данных графа, предоставляемую службой Neo4j, работающей на одном экземпляре или кластере, и которая обеспечивает доступ к большей части наиболее часто используемых функций Py2neo. Для удобства все основные функции и классы экспортируются из корневого пространства имен Py2neo, включая все функции подключения и управления базами данных, а также сопоставление сущностей и основные ошибки. Объекты Node и Relationship являются ключевыми в этой библиотеке, расширяя класс Subgraph и предоставляя исчерпывающий набор типов данных и операций структуры графа.
Что внутри библиотеки Py2neo и как с ней работать
Импортировав Py2neo в свой Python-скрипт, можно подключиться к графу в Neo4j, создав объект Graph:
from py2neo import Graph graph = Graph("bolt://myserver:7687", auth=("neo4j", "psswrd"))
Как показывает этот пример кода, помимо URI подключения нужно передать настройки, принимаемые конструктором Graph: учетные данные (пользователь, пароль), хост и порт. Также можно передать логический флаг безопасности, указать нужную схему данных и user_agent. Py2neo предоставляет несколько логических уровней API поверх официального драйвера Python. API-интерфейс Cypher самого низкого уровня предоставляет средства выполнения Cypher, очень похожие на те, что есть в драйвере, но с некоторыми дополнительными функциями, например, приведение к объекту таблицы:
graph.run("MATCH (a:Person) RETURN a.name, a.born LIMIT 3").to_table()
Следующий уровень, Entity API, оборачивает Cypher в удобные функции, которые обеспечивают полный набор CRUD-операций над объектами Node и Relationship. Это может сделать код приложения более понятным. Например, NodeMatcher создает и выполняет оператор Cypher MATCH и возвращает объекты Node:
[(a["name"], a["born"]) for a in graph.nodes.match("Person").limit(3)]
Другие методы Entity API включают Graph.create(), Graph.delete() и Graph.merge(), а также аналогичные варианты транзакций. При этом Graph.merge()полностью переписан для внутреннего использования UNWIND-предложения Cypher, чтобы устранить некоторые предыдущие проблемы с производительностью для метода при масштабном использовании. О том, как работает MERGE-запрос в Neo4j, мы писали здесь.
Наконец, на самом верхнем уровне в Py2neo находится API OGM, который позволяет создавать объекты GraphObject, которые заключают узлы в собственные классы и предоставляют атрибуты для моделирования их отношений и свойств. Сопоставитель узлов NodeMatcher предлагает DSL, который можно использовать для поиска узлов, соответствующих определенному набору критериев. Обычно, один узел можно идентифицировать, передав определенную пару ключ-значение метки и свойства. Однако, допускается любое количество меток и любое условие, поддерживаемое предложением WHERE в запросе Cypher.
Узнайте, как применять эти и другие средства анализа графов для аналитики больших данных в реальных проектах, вы узнаете на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники