#python #rdf #owl #rdflib #turtle-rdf
#python #rdf #owl #rdflib #turtle-rdf
Вопрос:
Есть ли способ использовать rdflib
или аналогичный пакет для проверки набора элементов?
например
from rdflib import Graph, Namespace, Literal
from rdflib.namespace import DCTERMS
n = Namespace("http://example.org/books/")
n.book
g = Graph()
g.bind("dc", DCTERMS)
g.bind("ex", n)
g.add((n["book"], DCTERMS["title"], Literal("Example Title"))) # Valid
g.add((n["book"], DCTERMS["tite"], Literal("Example Title"))) # Invalid
Или как это будет выглядеть как файл .ttl:
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix ex: <http://example.org/books/>
ex:book dc:title "Example Title" . # Valid
ex:book dc:tite "Example Title" . # Invalid
Есть большая вероятность, что я подхожу к этому с неправильной точки зрения, поэтому любая помощь приветствуется.
Комментарии:
1. почему вторая тройка «недействительна»? Из-за опечатки? Если да, то как фреймворк узнает, какой из них правильный? Я имею в виду, что вы, как человек, можете легко принять решение об этом, но для
rdflib
них это просто URI. Все, о чем я могу думать, это проверить, является ли свойство частью словаря DCTerms — что тривиально проверить, верно? Вопрос в том, как насчет других свойств из неизвестных словарей?2. @UninformedUser — это то, о чем я спрашиваю. Очевидно,
rdflib
что невозможно определить, что является допустимым / недопустимым само по себе. Вы сказали, что один из способов — проверить, является ли свойство частью словаря DCTerms, и что это тривиально, но я на самом деле не уверен, как это сделать легко (очень ново для этого пространства). И да, моим следующим вопросом будет способ сделать это для пользовательских пространств имен. Я думал, что может быть какой-то «белый список» свойств, которые мы могли бы передать,rdflib
но я не думаю, что это будет так.3. Нет, это не часть
rdflib
— я также думаю, что это было бы полезно. Можно возразить, словарь может быть закрыт, но, в конце концов, вся идея семантической сети должна быть открытой — вы можете использовать любое пространство имен для своих собственных URI — если это имеет смысл, это действительно другая история.4. Короче говоря, я ошибся с предложением выполнить итерацию. Не все пространства имен закрыты
rdflib
: проверьте исходный код здесь: github.com/RDFLib/rdflib/blob/master/rdflib/namespace.py — например, FOAF закрыт, поэтому вы можете просто проверить, входит ли предикат в число определенных терминов, а DCTERMS — нет. Итак, вы должны заранее проделать некоторую работу и предоставить свой собственный белый список. Для ваших пользовательских словарей действительно можно создатьClosedNamespace
— это вызовет ошибку, если она не входит в заранее определенные термины.5. Просто чтобы вы знали: мы (разработчики RDFLib) планируем изменить способ работы Namespace / ClosedNamespace в rdflib 6.0.0, чтобы пространства имен указывали на проблему при использовании недопустимых терминов, но, возможно, не вызывали ошибку как таковую. И мы, вероятно, добавим гораздо больше закрытых пространств имен к сотням rdflib — подобных. Всякий раз, когда есть большая вероятность, что новые термины не добавляются. Скорее всего, мы добавим DCTERMS таким образом.
Ответ №1:
@UninformedUser прокомментировал:
проверьте, является ли свойство частью словаря DCTerms, что тривиально для проверки
- загрузите словарь — либо в коде, либо отдельно
- загрузите словарь в другой граф RDFLib
- проверьте, есть ли какое-либо свойство, которое вы используете
rdf:Property
, в другом графике, согласно:
if not (the_property_being_tested, RDF.type, RDF.Property) in graph:
Или просто посмотрите, является ли это предметом на графике (более слабый тест):
in_graph = False
for s, p, o in g.triples((the_property_being_tested, None, None)):
in_graph = True
Комментарии:
1. Это потрясающе — именно тот ответ, который я искал. Приветствия!