РДФлиб
![]() | Эта статья написана как руководство или руководство . ( июль 2021 г. ) |
![]() | |
Разработчик(и) | Дэниел Креч (создатель), Гуннар Гримнес, Йорн Хис (бывшие сопровождающие), Николас Дж. Кар (сопровождающий) |
---|---|
Первоначальный выпуск | 4 июня 2002 г |
Стабильная версия | 6.2.0
/ 16 июля 2022 г [ 1 ] |
Репозиторий | |
Написано в | Питон |
Операционная система | Кросс-платформенный |
Тип | Библиотека |
Лицензия | БСД |
Веб-сайт | рдфлиб ![]() |
RDFLib — это библиотека Python для работы с RDF , [ 2 ] простой, но мощный язык для представления информации. Эта библиотека содержит анализаторы/сериализаторы практически для всех известных сериализаций RDF, таких как RDF/XML, Turtle, N-Triples и JSON-LD, многие из которых теперь поддерживаются в обновленной форме (например, Turtle 1.1). Библиотека также содержит как хранящиеся в памяти, так и постоянные Graph серверные части для хранения информации RDF, а также многочисленные удобные функции для объявления пространств имен графов, размещения SPARQL. [ 3 ] запросы и так далее. Он находится в постоянной разработке, последняя стабильная версия rdflib 6.1.1 была выпущена 20 декабря 2021 года. Первоначально она была создана Дэниелом Кречем, а первый выпуск состоялся в ноябре 2002 года.
Ряд других проектов Python используют rdflib для манипуляций с RDF, в том числе:
- OWL-RL — простая реализация профиля OWL2 RL. [ 4 ] (рассуждающая машина)
- pySHACL Python SHACL — валидатор
- pyLDAPI — дополнительный модуль для веб-фреймворка Python Flask, используемый для доставки связанных данных.
- pyLODE — на языке веб-онтологии. инструмент документации
История и статус
[ редактировать ]![]() | Этот раздел пуст. Вы можете помочь, добавив к нему . ( июль 2010 г. ) |
Обзор
[ редактировать ]Идиомы RDFLib и Python
[ редактировать ]Использование RDFLib различных идиом Python означает, что программистам, имеющим лишь начальные навыки работы с Python, довольно легко манипулировать RDF. С другой стороны, идиомы Python достаточно просты, поэтому человек, знакомый с RDF, но не с Python, вероятно, сможет довольно легко понять, как использовать rdflib.
Базовым классом RDFLib является Graph , который представляет собой словарь Python, используемый для хранения в памяти коллекций троек RDF. Он переопределяет некоторые встроенные методы объектов Python, чтобы продемонстрировать простое поведение графа, например простое слияние графов посредством сложения (т. е. g3 = g1 + g2
).
Графики RDFLib имитируют типы контейнеров, и их лучше всего рассматривать как набор троек из трех элементов:
set([ (subject,predicate,object), (subject1,predicate1,object1), ... (subjectN,predicateN,objectN) ])
Графики RDFLib не являются отсортированными контейнерами; у них есть обычные операции с наборами Python, например add()
методы, которые ищут тройки и возвращают их в произвольном порядке.
Термины графа RDF
[ редактировать ]Следующие классы RDFLib (перечисленные ниже) моделируют термины RDF в виде графика и наследуют от общего класса Identifier , который расширяет Юникод Python. Их экземплярами являются узлы в графе RDF.
Утилиты пространства имен
[ редактировать ]RDFLib предоставляет механизмы управления пространствами имен. В частности, существует класс пространства имен , который принимает (в качестве единственного аргумента) базовый URI пространства имен. Полные URI в пространстве имен могут быть созданы путем доступа к атрибутам/словарям в экземплярах пространства имен:
>>> from rdflib import Namespace
>>> SDO = Namespace("https://schema.org/")
>>> SDO.Person
https://schema.org/Person
>>> SDO['url']
https://schema.org/url
Графы как итераторы
[ редактировать ]Графики RDFLib также переопределяют __ iter __, чтобы поддерживать итерацию по содержащимся тройкам:
for subject, predicate, object_ in someGraph:
assert (subject, predicate, object_) in someGraph, "Iterator / Container Protocols are Broken!!"
Установите операции над графиками RDFLib
[ редактировать ]__ iadd __ и __ isub __ переопределяются для поддержки добавления и вычитания графиков друг из друга (на месте):
- Г1 += Г1
- G2 = G2
Базовое тройное соответствие
[ редактировать ]Графики RDFLib поддерживают базовое сопоставление тройных шаблонов с помощью функции тройки (( субъект , предикат , объект )). Эта функция является генератором троек, соответствующих шаблону, заданному аргументами. Их аргументами являются термины RDF, которые ограничивают возвращаемые тройки. Термины, имеющие значение None, рассматриваются как подстановочные знаки.
for subject, predicate, object_ in someGraph.triples((None, URIRef("https://schema.org/name"), None)):
print("{} has name {}".format(s, o)) # prints all the triples with the predicate being https://schema.org/name
Удобные API RDF (коллекции/контейнеры RDF)
[ редактировать ]Управление тройками
[ редактировать ]Добавление троек
[ редактировать ]Тройки можно складывать двумя способами:
- Их можно добавить с помощью функции синтаксического анализа ( source , publicID = None , format ="xml"). Первый аргумент может быть источником разных типов, но наиболее распространенным является сериализация (в различных форматах: RDF/XML, Notation 3 , N-тройки графа RDF в виде строки). Параметр формата может быть одним из черепах, n3, xml, n-triples или JSON-LD (последний, когда используется плагин JSON-LD). publicID — это имя графа, в котором будет анализироваться сериализация RDF.
- Тройки также можно добавить с помощью функции add : add (( subject , predicate , object )).
Удаление троек
[ редактировать ]Подобным образом тройки можно удалить вызовом удаления : удалить (( субъект , предикат , объект ))
Литеральная поддержка RDF
[ редактировать ]RDFLib 'Литералы по существу ведут себя как символы Юникода с типом данных XML-схемы или языковым атрибутом. Класс предоставляет механизм как для преобразования литералов Python (и их встроенных функций, таких как время/дата/дата-время) в эквивалентные литералы RDF, так и (наоборот) для преобразования литералов в их эквиваленты в Python. Существует некоторая поддержка рассмотрения типов данных при сравнении экземпляров Literal, реализованная как переопределение __ eq __. Это сопоставление с литералами Python и обратно достигается с помощью следующих словарей:
PythonToXSD = {
basestring : (None, None),
float : (None, XSD_NS+u'float'),
int : (None, XSD_NS+u'int'),
long : (None, XSD_NS+u'long'),
bool : (None, XSD_NS+u'boolean'),
date : (lambda i:i.isoformat(), XSD_NS+u'date'),
time : (lambda i:i.isoformat(), XSD_NS+u'time'),
datetime : (lambda i:i.isoformat(), XSD_NS+u'dateTime'),
}
Сопоставляет экземпляры Python с литералами с типом данных WXS.
XSDToPython = {
XSD_NS+u'time' : (None, _strToTime),
XSD_NS+u'date' : (None, _strToDate),
XSD_NS+u'dateTime' : (None, _strToDateTime),
XSD_NS+u'string' : (None, None),
XSD_NS+u'normalizedString' : (None, None),
XSD_NS+u'token' : (None, None),
XSD_NS+u'language' : (None, None),
XSD_NS+u'boolean' : (None, lambda i:i.lower() in ['1','true']),
XSD_NS+u'decimal' : (float, None),
XSD_NS+u'integer' : (long, None),
XSD_NS+u'nonPositiveInteger' : (int, None),
XSD_NS+u'long' : (long, None),
XSD_NS+u'nonNegativeInteger' : (int, None),
XSD_NS+u'negativeInteger' : (int, None),
XSD_NS+u'int' : (int, None),
XSD_NS+u'unsignedLong' : (long, None),
XSD_NS+u'positiveInteger' : (int, None),
XSD_NS+u'short' : (int, None),
XSD_NS+u'unsignedInt' : (long, None),
XSD_NS+u'byte' : (int, None),
XSD_NS+u'unsignedShort' : (int, None),
XSD_NS+u'unsignedByte' : (int, None),
XSD_NS+u'float' : (float, None),
XSD_NS+u'double' : (float, None),
XSD_NS+u'base64Binary' : (base64.decodestring, None),
XSD_NS+u'anyURI' : (None,None),
}
Сопоставляет литералы с типом данных WXS с Python. Это сопоставление используется методом toPython (), определенным во всех экземплярах Literal.
SPARQL-запросы
[ редактировать ]![]() | Этот раздел необходимо обновить . ( октябрь 2019 г. ) |
RDFLIb поддерживает большую часть текущей спецификации SPARQL 1.1 и включает в себя средства общедоступного набора тестов RDF DAWG. Поддержка SPARQL осуществляется двумя способами:
rdflib.graph.query()
- используется для отправки запросов SPARQL или ASK к графу (или хранилищу графов SELECT )rdflib.graph.update()
— используется для изменения содержимого графа или возврата RDF с помощью INSERT , DELETE и CONSTRUCT SPARQL. операторов
Сериализация (NTriples, N3 и RDF/XML)
[ редактировать ]API хранилища RDF
[ редактировать ]Универсальный интерфейс хранилища RDF
В этом документе предпринята попытка обобщить некоторые фундаментальные компоненты хранилища RDF. Цель состоит в том, чтобы наметить стандартный набор интерфейсов для обеспечения необходимой поддержки, необходимой для сохранения графа RDF универсальным и не привязанным к какой-либо конкретной реализации. По большей части соблюдается базовая модель RDF, а также терминология, соответствующая спецификациям модели RDF. Однако этот предлагаемый интерфейс также расширяет хранилище RDF дополнительными требованиями, необходимыми для облегчения аспектов нотации 3, которые выходят за рамки модели RDF и обеспечивают основу для обработки и сохранения логики предикатов первого порядка.
Терминология
[ редактировать ]- Контекст
- Именованный неупорядоченный набор операторов. Также можно назвать подграфом. Названная литература и онтология графов соответствуют этой концепции. Контекст можно рассматривать только как связь между тройкой RDF и подграфом (именно так термин контекст используется на странице «Проблемы проектирования Notation 3»), в котором он находится, или самим подграфом.
- Стоит отметить, что концепция логической группировки троек внутри адресного «множества» или «подграфа» едва выходит за рамки модели RDF. Модель RDF определяет граф как произвольный набор троек и семантику этих троек, но не дает указаний о том, как последовательно обращаться к таким произвольным наборам. Хотя коллекцию троек можно рассматривать как ресурс, связь между тройкой и коллекцией, частью которой она является, не рассматривается.
- Конъюнктивный граф
- Это относится к графику «верхнего уровня». Это совокупность всех контекстов внутри него, а также подходящая абсолютная граница для предположений/моделей закрытого мира. Это различие является легко получаемой частью RDF на пути к семантической сети, и большая часть его ценности заключается в (корпоративных/корпоративных) реальных проблемах:
- Есть как минимум две ситуации, когда используется предположение о закрытом мире. В первом случае предполагается, что база знаний содержит все соответствующие факты. Это обычное явление в корпоративных базах данных. То есть информация, содержащаяся в нем, считается полной.
- С точки зрения магазина, предположения о закрытом мире также обеспечивают преимущество в виде сокращения времени ответа на запросы из-за явных границ закрытого мира. Границы закрытого мира можно сделать прозрачными с помощью объединенных запросов, которые предполагают, что каждый ConjunctiveGraph является частью более крупной, неограниченной вселенной. Таким образом, предположение о закрытом мире не исключает предположения об открытом мире .
- В целях устойчивости конъюнктивные графы должны различаться идентификаторами (которые не обязательно могут быть идентификаторами RDF или могут быть нормализованными идентификаторами RDF — возможно, SHA1/MD5 — для целей именования базы данных), на которые можно ссылаться для обозначения конъюнктивных запросов (запросов, сделанных по всему конъюнктивному графу) или появляются как узлы в утвержденных утверждениях. В последнем случае подобные утверждения можно было бы интерпретировать как сделанные в отношении всей «известной» Вселенной. Например:
<urn:uuid:conjunctive-graph-foo> rdf:type :ConjunctiveGraph
<urn:uuid:conjunctive-graph-foo> rdf:type log:Truth
<urn:uuid:conjunctive-graph-foo> :persistedBy :MySQL
- Цитируемое заявление
- Утверждение, которое не утверждается, но упоминается каким-либо образом. Чаще всего это происходит, когда мы хотим сделать заявление о другом утверждении (или наборе утверждений), не обязательно утверждая, что эти цитируемые утверждения (истинны). Например:
Чимези сказал, что «утверждения высшего порядка сложны»
- Что можно записать как (в N3):
:chimezie :said {:higherOrderStatements rdf:type :complicated}
- Формула
- Контекст, утверждения которого являются цитируемыми или гипотетическими.
- Цитирование контекста можно рассматривать как очень похожее на овеществление. Основное отличие состоит в том, что цитируемые утверждения не утверждаются и не рассматриваются как утверждения истины о Вселенной, и на них можно ссылаться как на группу: гипотетический RDF-граф.
- Универсальные квантификаторы/переменные. (соответствующие ссылки):
- OWL Определение SWRL. (просматривать)
- Переменная SWRL/RuleML
- Условия
- Термины — это типы объектов, которые могут появляться в тройке, заключенной в кавычки/утверждения. Сюда входят те, которые являются основными для RDF:
- Пустые узлы
- Ссылки URI
- Литералы (которые состоят из буквального значения, типа данных и языкового тега)
- Те, которые расширяют модель RDF до N3:
- Формулы
- Универсальные количественные оценки (переменные)
- И те, которые в первую очередь предназначены для сопоставления с «Узлами» в базовом графике:
- РЕГЭКС-выражения
- Диапазоны дат
- Числовые диапазоны
- Узлы
- Узлы — это подмножество Условий, которые фактически сохраняются в базовом хранилище. Набор таких Условий зависит от того, поддерживает ли магазин формулы. Магазины, которые не поддерживают формулы, сохранят только те термины, которые являются основой модели RDF, а магазины, которые поддерживают формулы, смогут также сохранять расширения N3. Однако служебные термины, которые служат только для сопоставления узлов по шаблонам терминов, вероятно, будут только терминами, а не узлами.
- «Набор узлов графа RDF — это набор субъектов и объектов троек в графе.
- Контекстно-зависимый
- Хранилище RDF, способное хранить операторы в контекстах, считается контекстно-зависимым. По сути, такое хранилище способно разделить представляемую им RDF-модель на отдельные именованные и адресуемые подграфы.
- Знание формул
- Хранилище RDF, способное различать утверждаемые и цитируемые утверждения, считается поддерживающим формулы.
- Такое хранилище отвечает за поддержание этого разделения и обеспечение того, чтобы запросы ко всей модели (агрегирование всех контекстов, указанное путем не ограничения «запроса» конкретным контекстом имени) не включали операторы в кавычках. Также он отвечает за различение кванторов универсальности (переменных).
- Эти две дополнительные концепции (формулы и переменные) следует рассматривать как основные расширения и отличать их от других членов тройки (по крайней мере, ради устойчивости туда и обратно). Стоит отметить, что «область действия» кванторов всеобщности (переменных) и кванторов существования (BNodes) — это формула (или контекст, если быть точным), в которой находятся их утверждения. Помимо этого, магазин с поддержкой формул ведет себя так же, как и магазин с поддержкой контекста.
- Конъюнктивный запрос
- Любой запрос, который не ограничивает хранилище поиском только в пределах именованного контекста. Такой запрос предполагает, что контекстно-зависимое хранилище будет искать во всей заявленной вселенной (конъюнктивный граф). Ожидается, что хранилище с поддержкой формул не будет включать операторы в кавычках при сопоставлении с таким запросом.
- N3 Туда и обратно
- Это относится к требованиям к механизму сохранения RDF-хранилища с поддержкой формул, необходимому для его правильного заполнения синтаксическим анализатором N3 и отображения синтаксиса сериализатором N3.
- Транзакционный магазин
- Хранилище RDF, способное обеспечить транзакционную целостность операций RDF, выполняемых над ним.
Интерпретация синтаксиса
[ редактировать ]Следующий документ с обозначением 3:
{?x a :N3Programmer} => {?x :has [a :Migraine]}
Может привести к утверждению в хранилище следующих утверждений:
_:a log:implies _:b
Это утверждение будет утверждаться в разделе, связанном с цитируемыми утверждениями (в формуле с именем _:a).
?x rdf:type :N3Programmer
Наконец, эти утверждения будут утверждаться в одном и том же разделе (в формуле с именем _:b).
?x :has _:c
_:c rdf:type :Migraine
Формулы и переменные как термины
Формулы и переменные отличаются от ссылок URI, литералов и BNodes следующим синтаксисом:
{ .. } - Formula
?x - Variable
Они также должны отличаться по стойкости, чтобы их можно было использовать в обоих направлениях. Другие вопросы, касающиеся сохранения условий N3.
Управление базой данных
[ редактировать ]Хранилище RDF должно предоставлять стандартные интерфейсы для управления подключениями к базе данных. Такие интерфейсы являются стандартными для большинства систем управления базами данных (Oracle, MySQL, Berkeley DB, Postgres и т. д.). Для обеспечения этой возможности определены следующие методы:
- def open(self, Configuration, create=True) — открывает хранилище, указанное в строке конфигурации. Если create имеет значение True, будет создано хранилище, если оно еще не существует. Если create имеет значение False и хранилище еще не существует, возникает исключение. Исключение также возникает, если магазин существует, но для его открытия недостаточно разрешений.
- def close(self, commit_pending_transaction=False) — закрывает соединение с базой данных. Параметр commit_pending_transaction указывает, следует ли фиксировать все ожидающие транзакции перед закрытием (если хранилище является транзакционным).
- def Destroy(self, Configuration) — уничтожает экземпляр хранилища, указанный в строке конфигурации.
Строка конфигурации понимается реализацией хранилища и представляет все необходимые параметры, необходимые для поиска отдельного экземпляра хранилища. Это может быть похоже на строку ODBC или фактически быть строкой ODBC, если протокол подключения к базовой базе данных — ODBC. Функция open должна разумно отказать, чтобы четко выразить, что хранилище (идентифицированное данной строкой конфигурации) уже существует или что хранилища нет (в месте, указанном строкой конфигурации) в зависимости от значения create.
Тройные интерфейсы
[ редактировать ]Хранилище RDF может предоставлять стандартный набор интерфейсов для манипулирования, управления и/или извлечения содержащихся в нем троек (утвержденных или цитируемых):
- def add(self, (subject, predicate, object), context=None, quote=False) — добавляет данный оператор в определенный контекст или в модель. Цитируемый аргумент интерпретируется хранилищами, поддерживающими формулы, чтобы указать, что это утверждение является цитируемым/гипотетическим. Если не указать контекст, а аргумент в кавычках должен иметь значение True, это должно быть ошибкой. Если аргумент в кавычках имеет значение True, это также должно быть ошибкой, если хранилище не поддерживает формулы.
- def Remove(self, (субъект, предикат, объект), контекст)
- def Triples(self, (subject, predicate, object), context=None) — возвращает итератор по всем тройкам (внутри конъюнктивного графа или только в заданном контексте), соответствующим заданному шаблону. Шаблон указывается путем предоставления явных условий оператора (которые используются для сопоставления с узлами в базовом хранилище) или «Нет», что указывает на подстановочный знак. ПРИМЕЧАНИЕ. Ожидается, что этот интерфейс вернет итератор кортежей длиной 3, соответствующий трем терминам операторов сопоставления, которые могут быть следующими: URIRef, Пустой узел, Литерал, Формула, Переменная или (возможно) Контекст.
Эту функцию можно рассматривать как основной механизм создания троек с узлами, которые соответствуют соответствующим терминам и предоставленному шаблону терминов. Конъюнктивный запрос может быть указан либо путем предоставления значения NULL/None/Empty строкового значения для контекста, либо идентификатора, связанного с конъюнктивным графом.
- def __len__(self, context=None) — Количество операторов в хранилище. Это должно учитывать только не заключенные в кавычки (утвержденные) операторы, если контекст не указан, в противном случае он должен возвращать количество операторов в заданной формуле или контексте.
Формула/контекстные интерфейсы
[ редактировать ]Эти интерфейсы работают с контекстами и формулами (для магазинов, поддерживающих формулы) взаимозаменяемо.
- def contexts(self, тройное=None) — Генератор всех контекстов в графе. Если указана тройка, генератор для всех контекстов, в которых находится тройка.
- def remove_context(self, идентификатор) -
Именованные графы/конъюнктивные графы
[ редактировать ]RDFLib определяет следующие виды графиков:
- 'График'(_ магазин _,_ идентификатор _)
- 'QuotedGraph'(_ магазин _,_ идентификатор _)
- 'ConjunctiveGraph'(_ store _,_ умолчанию идентификатор по _= None )
Конъюнктивный граф — это наиболее подходящий набор графов, который считается границей предположений о закрытом мире . Эта граница эквивалентна границе экземпляра Store (который сам по себе уникально идентифицирован и отличается от других экземпляров Store, обозначающих другие конъюнктивные графы). Он эквивалентен всем именованным графам внутри него и связан с графом _default_, которому автоматически назначается BNode для идентификатора, если он не указан.
Формулы
[ редактировать ]Графики RDFLib поддерживают дополнительное расширение семантики RDF для формул. Для тех, кто склонен к академическому образованию, вероятно, будет полезно прочитать «формальное» расширение Грэма Клайна (см. Внешние ссылки).
Формулы формально представлены классом «QuotedGraph» и отличаются от обычных графиков RDF тем, что их утверждения заключаются в кавычки.
Упорство
[ редактировать ]RDFLib предоставляет абстрактный API Store для сохранения RDF и Notation 3 . Класс Graph работает с экземплярами этого API (в качестве первого аргумента своего конструктора) для тройного управления хранилищем RDF, включая сбор мусора, управление транзакциями, обновление, сопоставление с образцом, удаление, длину и управление базой данных ( _ открыть _ / _ закрыть _ / _ уничтожить _ ) . Дополнительные механизмы сохранения могут поддерживаться путем реализации этого API для другого хранилища. В настоящее время поддерживаются базы данных:
- HDT
- MySQL
- SQLite
- Беркли ДБ
- База данных объектов Zope
- Оперативная память
- Платформа приложений Redland RDF
Экземпляры магазина можно создать с помощью функции плагина :
from rdflib import plugin
from rdflib.store import Store
plugin.get('.. one of the supported Stores ..', Store)(identifier=.. id of conjunctive graph ..)
Идиомы «высшего порядка»
[ редактировать ]Существует несколько API высокого уровня, которые расширяют графы RDFLib на другие идиомы Pythonic. Для более явной привязки к Python существуют Sparta , SuRF и FunOWL .
Ссылки
[ редактировать ]- ^ «rdflib/CHANGELOG.md в версии 6.2.0 · RDFLib/rdflib · GitHub» .
- ^ Циганиак, Ричард; Вуд, Дэвид; Ланталер, Маркус (25 февраля 2014 г.), Концепции RDF 1.1 и абстрактный синтаксис , W3C , получено 18 апреля 2020 г.
- ^ Харрис, Стив; Сиборн, Энди (21 марта 2013 г.), SPARQL 1.1 Query Language , W3C , получено 18 апреля 2020 г.
- ^ Мотик, Борис; Куэнка Грау, Бернардо; Хоррокс, Ян; Ву, Чжэ; Фокуэ, Ахилл; Лутц, Карстен (11 декабря 2012 г.), Языковые профили веб-онтологии OWL 2 (второе издание) , W3C , получено 18 апреля 2020 г.