Получение DBPedia Infobox категорий

В настоящее время я ищу способ запроса базы данных Infobox Onyology DBPedia через конечную точку SPARQL, чтобы получить список классов, подклассов выбранного класса и свойств данного класса. Насколько я смог найти, вам нужно либо знать свойство, которое вы ищете, либо искать что-то конкретное - все примеры, которые я нашел, основаны на идее, что вы захотите найти что-то конкретное (например, население городов выше определенной высоты и т. д.), тогда как я хотел бы создать что-то, где я мог бы эффективно "просматривать" категории. Например, начиная со списка подклассов "owl:Thing" на этой диаграмме иерархии классов и представляя пользователю список подклассов выбранного подкласса. Кажется возможным просматривать что-то подобное через вики-сопоставления, но было бы предпочтительнее напрямую запросить конечную точку SPARQL.

Есть ли какой-нибудь простой запрос SPARQL, который бы возвращал доступные классы и свойства этих классов?

Обновление: я нашел способ получить иерархию классов, как кажется, путем итерации этого запроса:

SELECT ?subject WHERE {
     ?subject rdfs:subClassOf owl:Thing
}

Который возвращает список подклассов owl:Thing, и если я заменю owl: Thing одним из подклассов, я получаю список подклассов этого, пока нет подклассов, после чего я могу выбрать все ресурсы, которые имеют тип, заданный выбранным подклассом. Я все еще не совсем уверен, как получить все свойства, общие для подкласса.

Обновление 2 Становится ближе сейчас. Этот запрос возвращает мне все свойства (потомки dbpedia: property), которые также являются страной, а также их названия:

SELECT DISTINCT ?prop ?title WHERE {
     ?country ?prop ?value.
     ?country a <http://dbpedia.org/ontology/Country>.
     ?prop rdf:type rdf:Property.
     ?prop rdfs:label ?title
}

Что на самом деле все, что я действительно просил. Последнее, что я пытаюсь сделать сейчас, это попытаться упорядочить их по количеству страниц, на которых они появляются (предположительно, наиболее распространенные свойства будут наиболее интересными).

4 ответа

Решение

Итак, я на самом деле разобрался более или менее точно, как это сделать, поэтому я представляю это как ответ, а не просто как правку. Мне кажется, что именно то, что я ищу, - это начать с перебора класса heirarchy, используя этот запрос:

SELECT ?class ?label WHERE {
     ?class rdfs:subClassOf owl:Thing.
     ?class rdfs:label ?label. 
     FILTER(lang(?label) = "en")
}

Подача выбранного результата в запрос вместо owl:Thing каждый раз.

После того, как пользователь выбрал класс самого низкого уровня, который ему нужен, для отображения списка свойств в порядке убывания по количеству записей, в которых они появляются, я использую этот запрос:

SELECT ?prop ?title WHERE {
     ?country ?prop [].
     ?country a <http://dbpedia.org/ontology/Country>.
     ?prop rdf:type rdf:Property.
     ?prop rdfs:label ?title
} ORDER BY DESC(COUNT(DISTINCT ?country))

Конечно, если вы действительно посмотрите на эти результаты, то там есть несколько прикольных свойств, которые не имеют очень описательных меток ("s"? Что?), Но это по крайней мере то, что я искал в первую очередь.

(1) Запрос для всех существующих классов:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?class
WHERE {
  ?s rdf:type ?class .
}

(2) Запрос всех свойств, используемых в любом экземпляре класса C:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?property
WHERE {
  ?s rdf:type <C> .
  ?s ?property ?o
}

Это даст вам все свойства, чьи rdfs:domain является SpaceMissions:

select ?property where {
    ?property rdfs:domain <http://dbpedia.org/ontology/SpaceMission>
}

Эти свойства все принимают SpaceMission как предмет.

Обратите внимание, что в RDF(S) не обязательно иметь явный rdfs:domain заявление для каждого свойства, потому что rdfs:domains может подразумеваться при использовании свойства. Поэтому вы можете обнаружить, что этот запрос даст вам список всех свойств, которые были определены с доменом SpaceMission но не даст вам список всех свойств, которые на самом деле используются со всеми экземплярами SpaceMission,

Вполне возможно, что некоторые свойства фактически не определены как таковые:

? p rdf: Недвижимость.

но любой термин в средней позиции по определению является свойством. Таким образом, вы можете получить больше результатов с:

ВЫБЕРИТЕ? Prop? Title WHERE {? страна a .
     "страна" опора [] .?prop rdfs:label? название.
} 
ЗАКАЗАТЬ НА DESC(COUNT(DISTINCT? Страна))

(слегка переупорядочено, выборочно в начале может улучшить производительность)

Другие вопросы по тегам