2013-09-11 1 views
0

Я пытаюсь получить все виды из DBpedia используя этого SPARQL запроса:Извлечение всех типов и их метки на английском языке с DBpedia

select ?type { 
    ?type a owl:Class . 
} 

Теперь я хочу также включить английскую метку каждого типа возвращаемого запрос. Что мне нужно добавить к моему запросу?

+0

Обратите внимание, что ответы на этот вопрос также позволяют решить [ваш вопрос из комментариев другого сообщения] (http://stackoverflow.com/questions/18579620/extract-date-time-based-predicates-from -dbpedia # comment27385469_18594277). –

ответ

15

Это хорошая возможность, чтобы узнать немного больше о том, как получить произвольную информацию из DBpedia. Ваш первый запрос (с ограничением добавленной) является:

select ?type { 
    ?type a owl:Class . 
} 
limit 10 

SPARQL results

Одним из результатов http://dbpedia.org/ontology/Animal, которые вы можете посетить в веб-браузере, и соответствующая страница будет отображать все, что ресурсы свойства. Для animal, есть не все, что много, но те из них, представляющие интерес для нас

rdfs:label Tier 
rdfs:label animal 
rdfs:label animal 
rdfs:label žival 
rdfs:label 동물 

свойство, которое нас интересует здесь rdfs:label, поэтому мы можем расширить запрос

select ?type ?label { 
    ?type a owl:Class . 
    ?type rdfs:label ?label . 
} 
limit 10 

, который мы можем на самом деле сокращаем немного, используя точку с запятой:

select ?type ?label { 
    ?type a owl:Class ; 
     rdfs:label ?label . 
} 
limit 10 

SPARQL results

Этот запрос, хотя и будет возвращать несколько результатов для каждого ?type; на самом деле, один за ?label, так что мы получаем результаты, включая:

http://dbpedia.org/ontology/Animal "Tier"@de 
http://dbpedia.org/ontology/Animal "animal"@en 

Обратите внимание, что метки не просто строки, но RDF литералы с языка тегов. В SPARQL мы можем получить языковой тег литерала RDF (если он есть), используя функцию lang. Можно сравнить тег языка для "en" с оператором =, но более надежным решением является использование langMatches, который будет обрабатывать сложнее случаи, как один, указанные в документации, где

filter langMatches(lang(?title), "FR") 

может быть использован для поиска выберите оба следующие значения для ?title, в то время как filter(lang(?title) = "fr") бы найти только первое:

"Cette Série des Années Soixante-dix"@fr 
"Cette Série des Années Septante"@fr-BE 

Использование langMatches, Ланг и фильтр, мы можем обновить запрос еще раз, чтобы

select ?type ?label { 
    ?type a owl:Class ; 
     rdfs:label ?label . 
    filter(langMatches(lang(?label),"EN")) 
} 
limit 10 

SPARQL Results

который извлекает типы DBpedia и их английские надписи.

+0

Спасибо за отличное объяснение –

5

Попробуйте это:

SELECT ?type (STR(?l) AS ?label) { 
    ?type a owl:Class; 
     rdfs:label ?l . 
    FILTER (LANG(?l) = "en") 
} 
+6

Для языка более надежным решением является 'filter (langMatches (lang (? Label)," en "))'. –