Как выбрать предикаты и соответствующие им метки в SPARQL? - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь перечислить все предикаты онтологии ( NIF ) и их метки. Если не запрашивать метку, он выдает 80 результатов. Итак, я предполагаю, что есть 80 предикатов с термином «nif» в них.

Затем я добавил строку, содержащую rdfs:label, и она не дала результатов. Итак, я написал код ниже, чтобы сначала отфильтровать URI, содержащие 'nif':

SELECT DISTINCT ?p ?label WHERE{ ?s ?p ?o . FILTER (REGEX(STR(?p), "nif", "i")) . ?p rdfs:label ?label . } ORDER BY ?p

Но это не сработало. Я попытался использовать ?p a rdf:Property вместо ?s ?p ?o, и это тоже не сработало. Затем я попробовал Exist и Values ?p {"nif"}, но мне эти два тоже не удалось!

Где я делаю ошибку?

1 Ответ

2 голосов
/ 28 июня 2019

Используется против объявленных свойств: В 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. Что-то иметь в виду.

...