2016-02-24 2 views
5

У меня возник вопрос о запросе SPARQL, который я пытаюсь построить из учебника. Я хочу создать тройки, которые возвращают список участников группы и группы, в которых они используют конечную точку DBPedia.простой запрос sparql от dbpedia

my query

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/resource/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?name ?bandname where { 
?person foaf:name ?name . 
?band dbo:bandMember ?person . 
?band dbo:genre dbpedia:Punk_rock . 
?band dbp:name ?bandname . 
} 

Я также с помощью [SPARQL валидатор запрос] [2], чтобы попытаться выяснить мою проблему, и, кажется, я использую неправильный префикс «ДАД: Название bandname «Я просто хочу, чтобы троек вернулись в JSON, если это возможно.

Как только я могу запустить это, я хотел бы добавить еще один префикс из GeoNames, чтобы увидеть места, связанные с группами, если это возможно (но эта часть в будущем). Любые идеи были бы очень признательны!

ответ

2

Проблема с неопределенным префиксом dbpedia. Кроме того, я думаю, вы должны заменить dbp:name с foaf:name:

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/resource/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?name ?bandname where { 
    ?person foaf:name ?name . 
    ?band dbo:bandMember ?person . 
    ?band dbo:genre dbp:Punk_rock . 
    ?band foaf:name ?bandname . 
} 

Увы, с SELECT вы не получите троек, но только имена (или другой материал) в табличной форме результатов. Очень похоже на SQL. Если вам нужны тройки, вам нужно CONSTRUCT

4

Есть некоторые проблемы с вашим запросом.

  • Свойство «имя» для группы имеет следующий URI: http://dbpedia.org/property/name. Это property, а не ресурс, но вы определили его как таковой в префиксах. Вы Шоуда определить его следующим образом: PREFIX dbp: <http://dbpedia.org/property/>
  • Я только что быстро проверить, на каком a band page has as properties, и увидел, что, кроме DBO: bandMember один вы используете, есть еще одно свойство, currentMembers, который, кажется, чтобы получить больше информации , Это кажется логичным, хотя, поскольку dbo: bandMember только извлекает объекты (членов URI), тогда как dbp: currentMembers также извлекает литералы. Это зависит от вашего варианта использования здесь ...
  • Вы используете префикс dbpedia: в своем запросе, который, кажется, не был определен заранее.

Вот запрос я использовал, чтобы получить список групп, связанных с их членов:

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbr: <http://dbpedia.org/resource/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?members ?bandName where { 
?band dbo:genre dbr:Punk_rock . 
?band dbp:currentMembers ?members. 
?band foaf:name ?bandName 
FILTER(langMatches(lang(?bandName), "en")) 
} 

Фильтр часть позволяет нам избежать дубликатов в случае литералы также определены в других языках.

Но если вы все еще хотите использовать DBO: bandMember свойство, этот запрос также делает работу:

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbr: <http://dbpedia.org/resource/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?personName ?bandName where { 
?band dbo:bandMember ?person . 
?person foaf:name ?personName . 
?band dbo:genre dbr:Punk_rock . 
?band foaf:name ?bandName 
FILTER(langMatches(lang(?bandName), "en")) 
FILTER(langMatches(lang(?personName), "en")) 
} 

Надежда, что помогает!

Смежные вопросы