Вместо Neosemantics: обзор Python-библиотеки rdflib-neo4j для графовой СУБД Neo4j

Вместо Neosemantics: обзор Python-библиотеки rdflib-neo4j для графовой СУБД Neo4j

Что не так с Neosemantics и зачем нужна очередная библиотека для Neo4j: знакомство с Python-пакетом для RDF-графов rdflib-neo4j. Возможности, ограничения и пример использования.

Что не так с Neosemantics и зачем нужна очередная библиотека для Neo4j

Что такое RDF-графы, триплеты и плагин Neosemantics для работы с этими концепциями в графовой СУБД Neo4j, мы уже рассматривали здесь. Именно этот плагин был идеальным решением для импорта/экспорта RDF-данных в/из Neo4j и сопоставления моделей. Он также обеспечивал проверку графов с помощью языка SHACL (Shapes Constraint Language), разработанного консорциумом WWW для описания RDF-графов, чтобы улучшить уровни семантической и технической совместимости онтологий.

Для пользователей Neo4j плагин Neosemantics был единственным способом принять любые данные в формате RDF и преобразовать их в размеченный граф свойств в Neo4j. Однако, Neosemantics недоступен в облачных развертываниях Neo4j, т.е. serverless-решении Aura DB. Чтобы устранить это ограничение, пару лет назад была разработана Python-библиотека rdflib-neo4j с открытым исходным кодом. Она представляет эволюцию Neosemantics на стороне клиента, расширяя возможности приема данных не только в локальных сценариях, но и в облачной Neo4j-экосистеме Aura.

Библиотека rdflib-neo4j основана на проекте RDFLib, Python-пакете для работы с RDF, который содержит следующие компоненты:

  • парсеры и сериализаторы для RDF/XML, N3, NTriples, N-Quads, Turtle, TriX, JSON-LD, HexTuples, RDFa и микроданных;
  • реализации хранилища данных в памяти и на диске с использованием BerkeleyDB, а также удаленные конечные точки SPARQL;
  • графический интерфейс к одному графу или к нескольким именованным графам в наборе данных;
  • реализация SPARQL 1.1, языка запросов к данным, представленным по модели RDF, а также протокол для передачи этих запросов и ответов на них, с поддержкой запросов и обновлений.

Чтобы понять основные принципы работы библиотеки rdflib-neo4j, далее рассмотрим пару примеров ее использования.

Пример использования rdflib-neo4j

Напомним, основным объектом данных RDFLib является Graph, который представляет собой Python-коллекцию из RDF-субъектов, предикатов и троек объектов. В основе RDF лежит понятие триплета – тройки из трех элементов, представляющих две вершины, соединенные ребром: субъект-предикат-объект. Субъект будет ресурсом или узлом в графе. Предикат будет представлять ребро (отношение), а объектом будет другой узел или буквальное значение. В модели RDF ресурсы (вершины/узлы) и отношения (ребра) идентифицируются в виде URI, который является уникальным идентификатором. Поэтому в RDF-триплетах узлы и ребра не имеют внутренней структуры, а маркируются уникальной меткой.

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

Сперва надо установить библиотеку rdflib-neo4j с помощью менеджера Python-пакетов pip:

$ pip установить rdflib-neo4j

Затем импортировать нужные модули:

from rdflib_neo4j import Neo4jStoreConfig, Neo4jStore, HANDLE_VOCAB_STRATEGY
from rdflib import Graph

Далее надо настроить подключение к базе данных Neo4j в облачной платформе Aura, указав данные аутентификации: URI базы данных, имя пользователя и пароль. Эти данные можно занести в словарь auth_data, чтобы потом использовать его при подключении.

# set the confguration to connect to your Aura DB
AURA_DB_URI = "your_db_uri"
AURA_DB_USERNAME = "neo4j"
AURA_DB_PWD = "your_db_pwd"

auth_data = {'uri': AURA_DB_URI,
             'database':"neo4j"
             'user':AURA_DB_USERNAME,
             'pwd':AURA_DB_PWD}

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

# Define your custom mappings & store config
config = Neo4jStoreConfig(auth_data=auth_data,
                          custom_prefixes=prefixes,
                          handle_vocab_uri_strategy=HANDLE_VOCAB_URI_STRATEGY.IGNORE
                          batching=True)

Далее следует указать источник данных RDF, которые нужно принять. Сделаем это с помощью переменной file_path:

file_path = 'https://github.com/jbarrasa/gc-2022/raw/main/search/onto/concept-scheme-skos.ttl'

В этом примере исходные данные хранятся в TTL-файле, который используется для RDF. Обычно он содержит разметку графа, модели или онтологии, используемой библиотеками и приложениями, такими как библиотека семантической веб-разработки Jena и WebVOWL.

Теперь создадим граф RDF под названием neo4j_aura, используя класс Graph из библиотеки rdflib. Также инициализируем хранилище Neo4j, используя класс Neo4jStore из библиотеки rdflib-neo4j, настраивая его с использованием ранее определенных учетных данных подключения (auth_data) и других параметров. При этом используется метод синтаксического анализа для чтения и приема данных RDF из файла, размещенного по адресу, заданном в переменной file_path, в граф neo4j_aura. По сути, это и есть импорт RDF-данных в Neo4j на платформе Aura.

# Create the RDF Graph, parse & ingest the data to Neo4j, and close the store(If the field
# batching is set to True in the Neo4jStoreConfig, remember to close the store to prevent the loss
# of any uncommitted records.)
neo4j_aura = Graph(store=Neo4jStore(config=config)

# Calling the parse method will implicitly open the store
neo4j_aura.parse(file_path, format="ttl")

Наконец, надо закрыть хранилище, чтобы гарантировать сохранение всех незафиксированных записей. Это особенно важно, если в конфигурации хранилища включена пакетная обработка (batching=True), которая предотвращает потерю незафиксированных данных.

neo4j_aura.close(True)

В заключение отметим, что rdflib-neo4j пока не может полностью заменить Neosemantics. На данный момент библиотека находится в раннем доступе и имеет только функции импорта, эквивалентные Neosemantics.

Критерий

Neosemantics

Rdflib-Neo4j

Год первого выпуска

2016

2023

Архитектура

На стороне сервера (Server-Side)

На стороне клиента (Client-Side)

Размещение

Только в Neo4j

В Neo4j и в облачном развертывании Aura

Поддержка импорта и экспорта

Да

Только импорт

RDF-базис

SHACL-валидация и вывод

Основана на Python-библиотеке rdflib

Узнайте больше про использование графовых алгоритмов и средств работы с ними для практического применения в реальных проектах аналитики больших данных на специализированных курсах нашего лицензированного учебного центра обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://www.w3.org/RDF/
  2. https://neo4j.com/developer-blog/rdflib-neo4j-rdf-integration-neo4j/
  3. https://github.com/RDFLib/rdflib
  4. https://rdflib.readthedocs.io/en/stable/