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

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

Stephen_King: Person & sqcap; Писатель & sqcap; Мужской & sqcap;... (наиболее конкретные классы)

Ответ 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