クラス ( 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 ;
] ;
] ;
] ;
] ;
}