4

クラス ( cls)、オブジェクト プロパティ ( has_part)、個体 ( ind) があるとします。個体は (マンチェスター構文で) rdf:type 化されます(has_part only cls)。基本的に、個体は part として持つ無名クラスとして型付けされていると言われていますcls

stardog をトリプル ストアとして使用して、タイプ のすべての個人を取得するクエリをどのように作成すればよいでしょう(has_part only cls)か?

OWLIM をトリプル ストアとして使用すると、次のように記述できました。

select ?ind where {
    ?ind rdf:type ?restriction .
    ?restriction owl:onProperty has_part .
    ?restriction owl:allValuesFrom cls
}

これは、私が使用する推論レベルに関係なく、私が知る限り、Stardog では機能しません。このクエリはどのように表示されますか?

ありがとう!

編集1

私は単純化しすぎたと思います。個人がより複雑なタイプの場合、たとえば(clsa and (has_part only clsb))、以下のクエリは機能しますか?

select ?ind where {
    ?ind rdf:type ?restriction .
    ?restriction owl:onProperty has_part .
    ?restriction owl:allValuesFrom clsB
}

もしそうなら、おそらくスタードッグは私の表現の別の部分に問題を抱えています.

編集2

Joshua Taylor は、以下の優れた回答を提供しました。まだ検討中ですが、良さそうです。

上記のクエリが OWLIM では機能するのに、Stardog では機能しない理由を書き留めたいと思います。OWLIM は、挿入時にすべての推論を事前計算します。これは、上記の例を使用すると、(clsa and (has_part only clsb))が直接型でindあるとアサートされることを意味します。Stardog はこれを行いません。つまり、これは推論されるだけであり、(後述のように) Stardog は推論による匿名クラスのインスタンスの取得をサポートしていないため、これらは取得されません。clsa(has_part only clsb)ind(has_part only clsb)

Stardog の同等のクエリは次のようになります。

select ?ind where {
    ?ind rdf:type ?anon.
    ?anon owl:intersectionOf ?a .
    ?a rdf:first clsa .
    ?a rdf:rest ?b .
    ?b rdf:first ?restriction .
    ?b rdf:rest rdf:nil . 
    ?restriction owl:onProperty has_part .
    ?restriction owl:allValuesFrom clsB
}

ただし、Joshua が以下で指摘しているように、これは具体的にそのタイプであると指定されている個体のみをピックアップします。つまり、あると主張されclsa、その後であると主張された個体(has_part only clsb)はピックアップされません。おそらく。

私はまだ Joshua のクエリを機能させようとしていますが、うまくいきそうです。(私は少し SPARQL の初心者ですが、そこまで来ています。)

助けてくれてありがとう!

編集3

すべての中間変数を除いた上記のクエリ:

select ?ind where {
    ?ind rdf:type [
        owl:intersectionOf [
            rdf:first clsa ;
            rdf:rest [
                rdf:rest rdf:nil ; 
                rdf:first [
                    owl:onProperty has_part ;
                    owl:allValuesFrom clsB ;
                ] ;
            ] ;
        ] ;
    ] ;
}
4

2 に答える 2

1

複雑なクラス式である型を持つ個体を探していて、これを SPARQL で行っている場合、OWL クラス式が RDF でどのようにシリアライズされるかを知る必要があります。例として、個体、バレル42が複合型を持つ次のオントロジーを考えてみましょう:

Barrel42 : Barrel ⊓ (hasAppleのみGoodApple)

すべての樽に悪いリンゴがあるので、実際には一種の神話ですが、それは重要ではありません. オントロジーは次のとおりです。

@prefix :      <https://stackoverflow.com/q/21607859/1281433/example#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<https://stackoverflow.com/q/21607859/1281433/example>
        a       owl:Ontology .

:barrel42  a    owl:NamedIndividual ;
        a       [ a                   owl:Class ;
                  owl:intersectionOf  ( :Barrel [ a                  owl:Restriction ;
                                                  owl:allValuesFrom  :GoodApple ;
                                                  owl:onProperty     :hasApple
                                                ] )
                ] .

:GoodApple  a            owl:Class ;
        rdfs:subClassOf  :Apple .

:Apple  a       owl:Class .

:hasApple  a    owl:ObjectProperty .

:BadApple  a             owl:Class ;
        rdfs:subClassOf  :Apple .

:Barrel  a      owl:Class .

さて、ここにいくつかのオプションがあります。実際にその交差タイプを持つものを要求することもできますが、それはおそらく最良のルートではありません。何かがBarrelとして宣言され、hasAppleのみGoodAppleとして宣言されている場合でも、おそらくそれを選択する必要があるからです。OWL 交差クラスによって暗示されたスーパークラスの取得への回答に基づいて、次のようなクエリを作成できます。

prefix :      <https://stackoverflow.com/q/21607859/1281433/example#>
prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:   <http://www.w3.org/2002/07/owl#>

select ?individual where { 
  ?individual                                    
     a/(owl:intersectionOf/rdf:rest*/rdf:first)*
       :Barrel,
        [ owl:allValuesFrom :GoodApple ;
          owl:onProperty :hasApple ;
          a owl:Restriction ] .
}
--------------
| individual |
==============
| :barrel42  |
--------------

プロパティのパス

a/(owl:intersectionOf/rdf:rest*/rdf:first)*

ここで本当に重要な部分です。の型を探してい?individualます。また、交差クラスを介して、交差クラスのスーパークラスを見つけようとしています。他にも含めたい「推論パス」があります。たとえば、rdfs:subClassOfリンクを組み込む場合があります。

a/((owl:intersectionOf/rdf:rest*/rdf:first)|rdfs:subClassOf)*

他のクラス式を見ると、パスを拡張する他の方法を思い付くことができます。これですべてのOWL 推論を取得できるわけではありませんが、最初に期待した以上の結果を得ることができます。

参考文献

コメントで述べたように、最近、関連する質問がいくつかあります。少なくともそれらにざっと目を通して、何ができるかを理解することが役立つ場合があります。ここに私がすぐに見つけることができたいくつかがあります:

于 2014-02-06T20:36:55.260 に答える