Запрос SPARQL для поиска всех подклассов и суперкласса данного класса

Мне нужно написать запрос SPARQL, чтобы найти суперкласс / подклассы данного класса.

Например, для данного http://139.91.183.30:9090/RDF/VRP/Examples/Phenomenon.rdf Файл словаря RDFS, я хочу найти суперкласс 'AcousticWave' (то есть 'Wave').

Точно так же, если пользователь вводит «Волна», я хочу получить все подклассы «Волны» (это «Акустическая волна», «Гравитационная волна», «Внутренняя волна» и «Прилив»).

введите описание изображения здесь

Как мне написать такой SPARQL-запрос?


person Ajinkya Kulkarni    schedule 26.09.2011    source источник


Ответы (1)


Предикат, используемый в rdfs для отношений подкласса / суперкласса состояния, равен rdfs:subClassOf. Имея это в виду, вам просто нужно написать тройные шаблоны в вашем запросе SPARQL, которые связывают этот предикат и субъект или объект, которому вы хотите сопоставить --- AcousticWave в вашем случае.

Я надеюсь, что следующие вопросы не требуют пояснений.

для суперклассов ...

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ns: <http://www.domain.com/your/namespace/>

SELECT ?superClass WHERE { ns:AcousticWave rdfs:subClassOf ?superClass . }

А для подклассов ...

SELECT ?subClass WHERE { ?subClass rdfs:subClassOf ns:Wave . }

Если вы хотите получить метки для каждого подкласса ns:Wave, сделайте что-то вроде ...

SELECT ?subClass ?label WHERE { 
        ?subClass rdfs:subClassOf ns:Wave . 
        ?subClass rdfs:label ?label . 
}

Если вам нужно транзитивное закрытие подклассов / суперклассов, у вас есть два варианта:

  1. Рекурсивно перебирайте эти запросы, пока не соберете закрытие.
  2. Передайте свои данные RDF через средство рассуждений RDF / RDFS, чтобы перенаправить цепочку всех следствий и утвердить их в своей базе данных RDF.
person Manuel Salvadores    schedule 26.09.2011
comment
Какое пространство имен я должен использовать для класса Wave здесь, в файле выше? - person user1583465; 04.02.2015
comment
Это действительно зависит от данных. Я поместил образец пространства имен, потому что не знал, когда отвечу на вопрос здесь. - person Manuel Salvadores; 04.02.2015
comment
Существует способ SPARQL для выполнения транзитивного запроса с использованием оператора * или + по предикату, см. Путь к свойству часть от W3C. Для всех транзитивных подклассов owl: thing: SELECT ?subClass WHERE { ?subClass rdfs:subClassOf* owl:thing .} Он должен отвечать: ns: Wave, ns: Tide… См. Также это вопрос. - person Marc_Alx; 04.04.2016