我有一个关于我正在尝试从教程构建的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的前缀,以查看与乐队相关联的地方,如果可能的话(但这部分是将来的)。任何见解都将非常感谢!
答案 0 :(得分:6)
您的查询存在一些问题。
PREFIX dbp: <http://dbpedia.org/property/>
以下是我用来检索与其成员关联的乐队列表的查询:
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"))
}
希望有所帮助!
答案 1 :(得分:5)
问题在于未定义的前缀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