无法使此SPARQL查询起作用

pro*_*mer 6 rdf semantic-web sparql dbpedia

好的,我只是学习使用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
Run Code Online (Sandbox Code Playgroud)

这是因为"Stevie Nicks"有三个字段(rdfs:label,foaf:name,dbpedia2:name).但是当我试图通过另一个没有全部三个的音乐艺术家(例如"Depeche Mode")进行查询时,我得不到任何结果.

我尝试了各种各样的东西,比如BIND(COALESCE(?field,...,...)AS?artistName)来过滤?artistName,我也试过UNION但似乎没什么用.有人可以指出我的SPARQL方式的错误吗?:)

谢谢!贾森

pro*_*mer 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" )
  }
}
Run Code Online (Sandbox Code Playgroud)