Что не так с 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 в Москве:
Источники