простой запрос sparql от dbpedia

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

запрос

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 query validator][2], чтобы попытаться выяснить мою проблему, и, похоже, я использую неправильный префикс для "dbp:name ?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


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

  • свойство "name" для диапазона имеет следующий URI:http://dbpedia.org/property/name. Это свойства, а не ресурс, но вы определили его как таковой в префиксах. Вы должны определить это следующим образом : PREFIX dbp: <http://dbpedia.org/property/>
  • Я только что быстро проверил, в чем страница группы имеет свойства, и увидел, что, кроме dbo:bandMember one вы используя, есть еще одно свойство, currentMembers, которое, похоже, получает дополнительную информацию. Это кажется логичным, хотя, поскольку dbo:bandMember извлекает только сущности (члены URIs), тогда как 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"))
}

надеюсь, что это поможет !