6

さて、私は SPARQL を使用して dbpedia.org からデータをクエリする方法を学んでおり、dbpedia のhttp://dbpedia.org/snorql/を使用してクエリを実行しています。に基づいて MusicalArtists のリストを取得しようとしています。次のように、3 つのフィールドで同じ文字列を検索します。

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」には 3 つのフィールド (rdfs:label、foaf:name、dbpedia2:name) がすべて含まれているためです。しかし、3 つすべてを持たない別の MusicalArtist (「Depeche Mode」など) でクエリを実行しようとすると、結果が得られません。

BIND(COALESCE(?field,...,...) AS ?artistName) のようなさまざまなことを試して ?artistName でフィルタリングし、UNION も試しましたが、何も機能しないようです。誰かが私の SPARQL のやり方の誤りを指摘できますか? :)

ありがとう!ジェイソン

4

1 に答える 1

7

さて、 http://dbpedia.org/ontology/MusicalArtistのrdf:typeを使用して「DepecheMode」を選択できないことを見逃していました。これはうまくいくようです:

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 に答える