好的,我只是学习使用SPARQL查询来自dbpedia.org的数据,我正在使用dbpedia的http://dbpedia.org/snorql/来运行我的查询。我试图获取一个基于搜索的音乐艺术家列表三个字段中的相同字符串如下:
SELECT ?subject
?artistRdfsLabel
?artistFoafName
?artistDbpedia2Name
WHERE {
?subject rdf:type <http://dbpedia.org/ontology/MusicalArtist> .
OPTIONAL { ?subject rdfs:label ?artistRdfsLabel . }
OPTIONAL { ?subject foaf:name ?artistFoafName . }
OPTIONAL { ?subject dbpedia2:name ?artistDbpedia2Name . }
FILTER ( str(?artistRdfsLabel) = "Stevie Nicks" ||
str(?artistFoafName) = "Stevie Nicks" ||
str(?artistDbpedia2Name) = "Stevie Nicks" )
}
LIMIT 10
这是因为“Stevie Nicks”有三个字段(rdfs:label,foaf:name,dbpedia2:name)。但是当我试图通过另一个没有全部三个的音乐艺术家(例如“Depeche Mode”)进行查询时,我得不到任何结果。
我尝试了各种各样的东西,比如BIND(COALESCE(?field,...,...)AS?artistName)来过滤?artistName,我也试过UNION但似乎没什么用。有人可以指出我的SPARQL方式的错误吗? :)
谢谢! 杰森
答案 0 :(得分:7)
好的,我错过了使用rdf:http://dbpedia.org/ontology/MusicalArtist类型无法选择“Depeche Mode”。这似乎有效:
SELECT ?subject
?artistName
WHERE {
{
?subject rdf:type <http://dbpedia.org/ontology/MusicalArtist> .
?subject rdfs:label ?artistName .
FILTER ( str(?artistName) = "Depeche Mode" )
}
UNION
{
?subject rdf:type <http://dbpedia.org/ontology/Band> .
?subject rdfs:label ?artistName .
FILTER ( str(?artistName) = "Depeche Mode" )
}
}