Используется против объявленных свойств: В RDF существует разница между с использованием предиката и объявлением предиката. Можно использовать предикат, не объявляя его, и можно объявить предикат, не используя его.
(Также возможно - и часто - объявлять предикат в одном файле и использовать его в другом файле. Так RDF позволяет повторно использовать одну онтологию в разных наборах данных. Может быть или не быть owl:imports
оператор, который связывает два файла.)
Чтобы перечислить все предикаты , используемые на графике по умолчанию:
SELECT DISTINCT ?predicate {
?s ?predicate ?o
}
ORDER BY ?predicate
Чтобы перечислить все предикаты , объявленные в графе по умолчанию, нам необходимо рассмотреть, какой язык схемы используется для его объявления. Чтобы перечислить предикаты, объявленные с RDF Schema :
SELECT ?predicate {
?predicate a rdf:Property
}
ORDER BY ?predicate
Для перечисления предикатов, объявленных с OWL :
SELECT ?predicate ?type {
VALUES ?type { owl:ObjectProperty owl:DatatypeProperty owl:AnnotationProperty }
?predicate a ?type
}
ORDER BY ?predicate
Приведенный выше запрос учитывает, что OWL имеет три различных типа предикатов: свойства объекта, свойства типа данных и свойства аннотации. Таким образом, мы в основном запрашиваем каждую из трех.
С этим знанием должно быть возможно выяснить, какие предикаты используются в онтологии, а какие предикаты объявлены в онтологии.
Теперь о метках. Запросы выше всех возвращают URI - машиночитаемый идентификатор - для предикатов. Чтобы также получить метки, добавьте ?label
в список переменных в предложении SELECT
и добавьте его в блок WHERE { ... }
:
OPTIONAL { ?predicate rdfs:label ?label }
Например:
SELECT ?predicate ?label {
?predicate a rdf:Property
OPTIONAL { ?predicate rdfs:label ?label }
}
ORDER BY ?predicate
Мы делаем шаблон, который извлекает метку, необязательным, поэтому, если метка не предоставлена на графике по умолчанию, предикат все еще возвращается, но без значения для переменной ?label
. Таким образом, можно определить случаи, когда предикат существует (то есть он используется или объявлен), но метка не указана.
Если предикат объявлен, но метка не предоставлена, то я бы предположил, что это онтология низкого качества, в которой при его создании уделялось недостаточно внимания.
Если используется предикат, но метка не указана, я не удивлюсь вообще. Это может означать, что объявление и метка представлены в другом файле, и для запроса меток нужно найти этот файл и добавить его в набор данных.
Построение меток из URI: Если проблема заключается в отсутствии меток в онтологии, и метки также не могут быть найдены в другом месте, то вот версия, которая создает метку с максимальным усилием из последняя часть URI, если метка не объявлена:
OPTIONAL {
?predicate rdfs:label ?tmpl
}
BIND (coalesce(?tmpl, replace(replace(replace(str(?predicate), '.*[#/:]', ''), '_', ' '), '([a-z])([A-Z])', '$1 $2')) AS ?label)
Это берет все после последнего хеша, косой черты или двоеточия в URI, заменяет подчеркивания пробелами и вставляет пробелы между словами в нотации CamelCase.
Наконец, фильтрация по URI. Здесь важно знать, что фильтрация будет происходить только по «сырому» URI, а не по форме с префиксом. Например, следующий фильтр принимает только предикаты с rdfs
в URI:
FILTER regex(str(?predicate), 'rdfs', 'i')
Но на самом деле он отклонит rdfs:label
, rdfs:comment
и любые другие свойства в пространстве имен rdfs
, потому что их полные URI имеют форму
<http://www.w3.org/2000/01/rdf-schema#label>
поэтому URI на самом деле не содержит строку rdfs
. Что-то иметь в виду.