Поиск классов, которые должны быть экземплярами sparql; Поиск классов с ровно 1 подклассом

Звучит довольно просто, но мне пока не удалось найти красивое решение. Я ищу классы в моей онтологии, которые имеют ровно один подкласс.

До сих пор я подходил к этому следующим образом:

SELECT (COUNT(?anything) AS ?count) ?class
WHERE {
GRAPH <> {

    ?class rdf:type owl:Class.
    ?class rdfs:subClassOf ?anything.
    ?anything rdf:type owl:Class.
   
} group by ?class 

Затем теоретически я должен иметь возможность сортировать по количеству, а результаты со значением 1 должны иметь только 1 подкласс. Однако, когда я выполняю этот запрос, счетчики совсем не соответствуют тому, что я ожидаю, например. мой тестовый пример должен вернуть 1, что он и делает, но другой класс, у которого вообще нет подкласса, также возвращает 1. А класс с 3 подклассами возвращает количество 4.

на изображении ниже он должен обнаружить, что количество выделенных классов равно 1. картинка структуры класса


person Robin    schedule 01.02.2021    source источник
comment
вы должны опустить тривиальные случаи: 1) любой класс является подклассом самого себя 2) owl:Nothing является подклассом любого класса.   -  person UninformedUser    schedule 01.02.2021


Ответы (1)


Запрос SPARQL, который вы ищете, будет выглядеть примерно так:

SELECT ?class WHERE {
  ?sub rdfs:subClassOf ?class
}
GROUP BY ?class 
HAVING (COUNT(DISTINCT ?sub) = 1)

Как упоминалось в комментарии UninformedUser в , однако, если доступен вывод OWL, может быть много ответов, которых вы, возможно, не ожидаете, например

owl:Nothing rdfs:subClassOf ex:YourClass

и

ex:YourClass rdfs:subClassOf ex:YourClass

Если они не позволяют запросу давать результаты, которые вы ищете, вы должны добавить фильтр, например

SELECT ?class WHERE {
  ?sub rdfs:subClassOf ?class
  FILTER ( ?sub != ?class && ?sub != owl:Nothing )
}
GROUP BY ?class 
HAVING (COUNT(DISTINCT ?sub) = 1)
person Joshua Taylor    schedule 01.02.2021
comment
Спасибо вам обоим! Это очень помогло. Теперь я узнал о Имении. Я также не знал, что класс может быть подклассом самого себя, поэтому фильтры полезны. - person Robin; 02.02.2021
comment
Возможно, более показательным и разочаровывающим для меня было то, что настоящей проблемой было мое объявление в операторе WHERE, если бы я перевернул этот оператор: ?class rdfs:subClassOf ?anything. В моем случае я бы уже получил правильные ответы, но хорошо знать, что это не всегда может быть правильным, отсюда и фильтры. - person Robin; 02.02.2021
comment
@robin да, класс X является подклассом Y, когда все, что имеет тип X, также имеет тип Y. Итак, каждый класс является подклассом самого себя. Как правило, мы не утверждаем это напрямую, но рассуждающий на OWL признает это. - person Joshua Taylor; 02.02.2021