извлечение наиболее конкретных классов экземпляров

Возможно ли получить определение ресурса (из DBpedia) с помощью запроса SPARQL? Я хочу иметь что-то вроде TBox и ABox, которые показаны в (Conceptual) Методы кластеризации для Семантическая сеть: проблемы и приложения (слайды 10–11). Например, для ресурса DBpedia Stephen King я хотел бы иметь:

Stephen_King : человек, писатель, мужчина … (наиболее специфические классы)


person user2837896    schedule 28.10.2013    source источник


Ответы (1)


Вы можете использовать следующий запрос, чтобы запросить классы, экземпляром которых является Стивен Кинг, не имеющие подклассов, экземпляром которых также является Стивен Кинг. Кажется, это хорошо согласуется с идеей «наиболее специфичных классов». Однако, поскольку (насколько мне известно) к конечной точке DBpedia SPARQL не привязано средство рассуждений, могут существовать отношения подклассов, которые можно вывести, но которые явно не присутствуют в данных.

select distinct ?type where { 
   dbr:Stephen_King a ?type .
  filter not exists { 
    ?subtype ^a  dbr:Stephen_King ;
             rdfs:subClassOf ?type .
  }
}

Результаты SPARQL

На самом деле, поскольку каждый класс сам по себе является rdfs:subClassOf, вы можете добавить еще одну строку в этот запрос, чтобы исключить случай, когда ?subtype и ?type совпадают:

select distinct ?type where { 
   dbr:Stephen_King a ?type .
  filter not exists { 
    ?subtype ^a  dbr:Stephen_King ;
             rdfs:subClassOf ?type .
    filter ( ?subtype != ?type )
  }
}

Результаты SPARQL

Если вам действительно нужна результирующая строка, подобная той, что показана на этих слайдах, вы можете использовать values для привязки переменной к dbr:Stephen_King, а затем использовать некоторую группировку и конкатенацию строк, чтобы получить что-то более красивое (вроде):

select
  (concat( ?person, " =\n", group_concat(?type; separator=" AND\n")) as ?sentence)
where { 
  values ?person {  dbr:Stephen_King }
  ?type ^a ?person .
  filter not exists { 
    ?subtype ^a ?person ;
             rdfs:subClassOf ?type .
    filter ( ?subtype != ?type )
  }
}
group by ?person

Результаты SPARQL

http://dbpedia.org/resource/Stephen_King =
http://dbpedia.org/class/yago/AuthorsOfBooksAboutWritingFiction AND
http://dbpedia.org/ontology/Writer AND
http://schema.org/Person AND
http://xmlns.com/foaf/0.1/Person AND
http://dbpedia.org/class/yago/AmericanSchoolteachers AND
http://dbpedia.org/class/yago/LivingPeople AND
http://dbpedia.org/class/yago/PeopleFromBangor,Maine AND
http://dbpedia.org/class/yago/PeopleFromPortland,Maine AND
http://dbpedia.org/class/yago/PeopleFromSarasota,Florida AND
http://dbpedia.org/class/yago/PeopleSelf-identifyingAsAlcoholics AND
http://umbel.org/umbel/rc/Artist AND
http://umbel.org/umbel/rc/Writer AND
http://dbpedia.org/class/yago/20th-centuryNovelists AND
http://dbpedia.org/class/yago/21st-centuryNovelists AND
http://dbpedia.org/class/yago/AmericanHorrorWriters AND
http://dbpedia.org/class/yago/AmericanNovelists AND
http://dbpedia.org/class/yago/AmericanShortStoryWriters AND
http://dbpedia.org/class/yago/CthulhuMythosWriters AND
http://dbpedia.org/class/yago/HorrorWriters AND
http://dbpedia.org/class/yago/WritersFromMaine AND
http://dbpedia.org/class/yago/PeopleFromDurham,Maine AND
http://dbpedia.org/class/yago/PeopleFromLisbon,Maine AND
http://dbpedia.org/class/yago/PostmodernWriters
person Joshua Taylor    schedule 28.10.2013
comment
@BlockER Да, DBpedia изменила пространства имен, которые предопределены в их общедоступной конечной точке. Я ответил на так много запросов SPARQL на основе DBpedia, что не могу вернуться и исправить их. Я думаю, что для этих вам нужно всего лишь заменить dbpedia: на dbr:. Или определите префикс dbpedia:. - person Joshua Taylor; 30.05.2018