Простой запрос 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"))
}

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

Другие вопросы по тегам