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