Проверка элементов .ttl с помощью rdflib

Есть ли способ использовать rdflib или аналогичный пакет для проверки набора элементов?

e.g.

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

Есть большая вероятность, что я подхожу к этому совершенно с неправильной точки зрения, поэтому любая помощь приветствуется.


person jarthur    schedule 25.09.2020    source источник
comment
почему вторая тройка недействительна? Из-за опечатки? Если да, то как фреймворк узнает, что правильно? Я имею в виду, что вы, как человек, можете легко принять решение, но для rdflib это просто URI. Все, что я могу придумать, это проверить, является ли свойство частью словаря DCTerms, а это тривиально, верно? Вопрос в том, как насчет других свойств из неизвестных словарей?   -  person UninformedUser    schedule 25.09.2020
comment
@UninformedUser - вот о чем я спрашиваю. Очевидно, что rdflib не может самостоятельно определить, что допустимо/недопустимо. Вы сказали, что один из способов - проверить, является ли свойство частью словаря DCTerms, и что это тривиально, но я на самом деле не уверен, как это сделать легко (очень плохо знаком с этой областью). И да, мой следующий вопрос будет о способе сделать это для пользовательских пространств имен. Я думал, что может быть какой-то «белый список» свойств, которые мы могли бы передать rdflib, но я не думаю, что это произойдет.   -  person jarthur    schedule 28.09.2020
comment
Нет, это не часть rdflib — я тоже думаю, что это было бы полезно. Можно возразить, что словарь может быть закрытым, но, в конце концов, вся идея Semantic Web должна быть открытой — вы можете использовать любое пространство имен для своих собственных URI — если это имеет смысл, это действительно другая история.   -  person UninformedUser    schedule 28.09.2020
comment
Короче говоря, я ошибся с предложением повторить. Не все пространства имен закрыты в rdflib: проверьте исходный код здесь: github. com/RDFLib/rdflib/blob/master/rdflib/namespace.py — например, FOAF закрыт, поэтому вы можете просто проверить, есть ли предикат среди определенных терминов, а DCTERMS — нет. Итак, вы должны заранее поработать и предоставить свой собственный белый список. Для ваших пользовательских словарей вы действительно можете создать ClosedNamespace - это вызовет ошибку, если это не в заранее определенных терминах.   -  person UninformedUser    schedule 28.09.2020
comment
@UninformedUser Спасибо за информацию, особенно за указание на ClosedNamespace. В итоге я, по сути, перекатил свою собственную версию, но теперь вместо этого переключусь на эту. Если бы вы хотели добавить это как ответ, я бы с радостью принял его.   -  person jarthur    schedule 28.09.2020
comment
Просто чтобы вы знали: мы (сопровождающие RDFlib) планируем изменить способ работы пространства имен / ClosedNamespace в rdflib 6.0.0, чтобы пространства имен указывали на проблему при использовании недопустимых терминов, но, возможно, не вызывали ошибку как таковую. И мы, скорее всего, добавим в rdflib намного больше закрытых пространств имен — например, сотни. Всякий раз, когда есть хороший шанс, что новые термины не добавляются. Мы, вероятно, добавим DCTERMS таким образом.   -  person Nicholas Car    schedule 30.09.2020


Ответы (1)


@UninformedUser прокомментировал:

проверить, является ли свойство частью словаря DCTerms — проверить это несложно

  1. скачать словарь - либо в коде, либо отдельно
  2. загрузить словарь в другой график RDFlib
  3. проверьте, является ли какое-либо свойство, которое вы используете, 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
person Nicholas Car    schedule 30.09.2020
comment
Это потрясающе - именно такой ответ я искал. Ваше здоровье! - person jarthur; 01.10.2020