простой запрос 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"))
}
надеюсь, что это поможет !