6

好的,我只是在学习使用 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)。但是,当我尝试由另一位不具备全部三个的 MusicalArtist(例如“Depeche Mode”)进行查询时,我没有得到任何结果。

我尝试了各种方法,例如 BIND(COALESCE(?field,...,...) AS ?artistName) 来按 ?artistName 过滤,我也尝试了 UNION 但似乎没有任何效果。有人可以指出我的 SPARQL 方式的错误吗?:)

谢谢!杰森

4

1 回答 1

7

好的,我错过了无法使用http://dbpedia.org/ontology/MusicalArtist的 rdf:type 选择“Depeche 模式” 。这似乎有效:

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" )
  }
}
于 2012-06-03T16:37:16.437 回答