6

クラスの最も具体的なプロパティを取得しようとしていますが、行き詰まります。結果セットにサブプロパティを持つプロパティを除いて、特定のクラスに適用されるすべてのプロパティ(スーパークラスから継承されたプロパティを含む)を引き出したいと思います。

たとえば、プロパティの1つがatLocationであるクラスPopulationと、 Refugeesと呼ばれるPopulationのサブクラスがあるとします。難民には、atLocationのサブプロパティであるプロパティcurrentLocationがあります。

したがって、必要なのは、Populationを入力した場合はatLocationのみを、 Refugeesを入力した場合はcurrentLocationのみを取得する一般的なクエリです。私が持っているのはこれです:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix ex: <http://example.org/vocabulary#>

SELECT DISTINCT ?prop WHERE {
  ex:Refugee rdfs:subClassOf* ?domain  .
  ?prop rdfs:domain ?domain .
  ?subprop rdfs:domain ?domain .
  FILTER NOT EXISTS { ?subprop rdfs:subPropertyOf ?prop . }  
} ORDER BY ?prop

ただし、これによりatLocation currentLocationの両方が得られます。

これは1つのクエリで可能ですか?これを解決する方法についてのアイデアはありがたいです!

4

1 に答える 1

4

これは、自分で試してみたときに思っていたよりもトリッキーでした。ただし、実行する必要があるのは、NOTEXISTS句をいくらか拡張することです。

SELECT ?prop WHERE {
  ?prop rdfs:domain ?domain .
  ?class rdfs:subClassOf* ?domain .
  FILTER NOT EXISTS {
        ?sub rdfs:subPropertyOf ?prop.
        ?sub rdfs:domain ?d.
        ?class rdfs:subClassOf* ?d .
  }
  FILTER (?class = ex:Refugee)
}

ドメインがex:Refugeeまたはex:Refugeeのスーパークラス(最初の2つのBGP)であるすべてのプロパティを選択しています。ただし、ex:Refugee(のスーパークラス)であるドメインも持つsubPropertyが存在するプロパティを除外する必要があります。サブプロパティ(?d)のドメインに別の変数を使用していることに注意してください。結局のところ、選択しているプロパティとまったく同じドメインを持っている必要はありません。

上記は、単純な(非含意またはRDF(S)含意)トリプルストアで機能します。ただし、各サブプロパティに最も具体的なドメインクラスのみが定義されている場合、つまり、トリプル'ex:currentLocation rdfs:domain ex:Refugeeがあります。 'ただし明示的には'ex:currentLocation rdfs:domain ex:Population'。

于 2012-08-29T23:33:10.447 に答える