4

DBpediaset で SPARQL クエリを実行していますが、(詳細な SPARQL の知識がないため) クエリの制限でいくつかの問題があります。

最初にすべての音楽アーティストを「取得」します。

?person rdf:type <http://dbpedia.org/ontology/MusicalArtist> .

しかし、これをより広いカテゴリに限定したいと思いますCategory:American_musicians(トラバースを介してskos:broader?):どのように?

*= 質問は具体的ですが、sparql クエリを実行したいときに、このクエストに何度も遭遇しました。

4

4 に答える 4

5

これは、SPARQL 1.1 のプロパティ パスを使用して簡単に行うことができます。

SELECT DISTINCT ( ?person )
WHERE
{
  ?person rdf:type dbpedia-owl:MusicalArtist .
  ?person skos:subject  skos:broader* category:American_musicians  .
}

ここでは、プロパティを介して到達できるすべての祖先が表示されskos:broaderます。

于 2013-01-30T02:31:50.480 に答える
1

これを行うには本当に良い方法はありませんが、詳細な方法は次のとおりです。

SELECT DISTINCT ( ?person )
WHERE
{
  ?person rdf:type dbpedia-owl:MusicalArtist .
  {
    ?person skos:subject [ skos:broader category:American_musicians ] .
  } UNION {
    ?person skos:subject [ skos:broader [ skos:broader category:American_musicians ] ] .
  } UNION {
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] .
  } UNION {
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] .
  } UNION {
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] .
  } UNION {
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] ] .
  } UNION {
    ?person skos:subject [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader [ skos:broader category:American_musicians ] ] ] ] ] ] ] .
  }
}

必要なレベル数を把握するには、SELECT DISTINCT を SELECT COUNT DISTINCT に変更し、カウントが上がらなくなったらレベルの追加を停止します。

于 2010-07-21T15:49:13.810 に答える
0

これはneo4jで実行するのは本当に簡単です。SPARQLでタスクを実行する別の方法は、サブカテゴリのコードを介して反復することにより、「Category:American_musicians」の下のすべてのサブグラフを抽出することです。

例えば。Javaの擬似コードは次のようになります。

String startCategory = "<http://dbpedia.org/resource/Category:American_musicians>";
iterateTraversalFunction(startCategory);

その場合、トラバーサル関数は次のようになります。

public void iterateTraversalFunction(String startCategory){
     ArrayList<String> artistsURI = // SPARQL query ?person skos:subject startCategory . ?person rdf:type MusicalArtist 

    ArrayList<String> subCategoriesURI = // SPARQL query ?subCat skos startCategory
    // Repeat recursively
   for(String subCatURI: subCategoriesURI){
       iterateTraversalFunction(subCatURI);
   }
}

これがお役に立てば幸いです-ダン

于 2012-12-02T20:40:35.277 に答える