まず、SPARQL クエリに関するいくつかの注意事項を整理します。1 つ目はプロパティ パスにおける と の違いに関するもので、2 つ目は と の使用*
に関するものです。次に、データからさまざまなタイプのサブクラス/スーパークラスの関係を照会する方法を見ていきます。ここでの秘訣は、私たちが探している関係のいくつかは、通常は OWL 推論を使用する関係ですが、SPARQL を使用してその OWL 推論を少し実行しようとしていることです。+
filter
values
元のクエリに関するいくつかの注意事項
プロパティ パス、+
および*
リンクした他の質問では、プロパティ パスが演算子を使用していることに注意してください*
。これは、長さが 0 以上のパスを意味します。フォームのデータに明示的なトリプルがない場合、長さがゼロ以上のパスは非常に重要になる可能性があります。
:MyClass owl:equivalentClass :MyClass
クエリに一致するものはありません
?myClass owl:equivalentClass+ :MyClass
しかし、あなたは結果(:MyClass
)を得るでしょう
?myClass owl:equivalentClass* :MyClass
実際にowl:equivalentClass
は、 は対称プロパティですが (つまり、 から推測a owl:equivalentClass b
できます)、トリプルはデータ内で一方向にしか存在しない可能性があるため、実際には が必要になります。 b owl:equivalentClass a
?myClass (owl:equivalentClass|^owl:equivalentClass)* :MyClass
values
の代わりに使用filter
余談ですが、このクエリでは、パターンで IRI を直接使用したことに注意してください。filter
元のコードのようにする必要はありません:
filter(?s=<http://snomed.info/id/323283001>)
変数をスーパークラスにバインドしたい場合は、次のように を使用する方が簡単ですvalues
。
values ?superclass { <http://snomed.info/id/323283001> }
?subclass (rdfs:subClassOf|owl:equivalentClass)* ?superclass
SPARQLクエリによるOWL推論
一般に、クラス間の関係 (例えば、サブクラスとスーパークラスの関係) は、OWL 推論を使用して判断するものです。ただし、いくつかは十分に単純であり、SPARQL クエリを使用して同じ結論を引き出すことができる OWL 公理の RDF エンコーディングに存在します。rdfs:subClassOf
たとえば、とに基づく階層でサブクラスの関係を見つけたい場合はowl:equivalentClass
、次のようなパターンを使用できます。
?subclass (rdfs:subClassOf|owl:equivalentClass|^owl:equivalentClass)* ?superclass
さて、以下に示すように、Protégé の SPARQL タブでいくつかの問題に遭遇する可能性があるため|
、バイナリ ケースの使用法を維持することをお勧めします。この場合、実際には次のように記述します。
?subclass (rdfs:subClassOf|(owl:equivalentClass|^owl:equivalentClass))* ?superclass
さて、実際に見ているデータは、より複雑なクラス式を使用しています。次の形式の OWL 公理がある場合
A subClassOf (B and C)
あなたが実際に言っているのは、クラスAがあり、交差クラスである (通常は匿名の) クラスがあり、それがBとCの交差であるということです。あなたは公理を持っていません
A subClassOf B
A subClassOf C
論理的には従いますが、利用できます。あなたが持っているケースには、実際には、次のような実存的な制限も含まれています
subClassOf (B and C and ( p some D))
ここでの A のスーパークラスは、B、C、および (p some D) であることに注意することが重要です。特に、A はp または D のサブクラスではありません。これは、具体的な例で確認する方が簡単かもしれません。
TiredManWearingHat subClassOf (Man and TiredPerson and (wearing some Hat))
帽子をかぶった疲れた男は明らかに男であり、明らかに疲れた人であり、明らかに帽子をかぶっているものですが、彼は間違いなく帽子をかぶっていません(意味さえありません)。帽子。これは、私たちが扱うことができるまさにその構造を持つ最小限のオントロジーです:

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns="https://stackoverflow.com/q/21092246/1281433/data.owl#">
<owl:Ontology rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl"/>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#C"/>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#B"/>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#A">
<rdfs:subClassOf>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#B"/>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#C"/>
<owl:Restriction>
<owl:onProperty>
<owl:ObjectProperty rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#p"/>
</owl:onProperty>
<owl:someValuesFrom>
<owl:Class rdf:about="https://stackoverflow.com/q/21092246/1281433/data.owl#D"/>
</owl:someValuesFrom>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</rdfs:subClassOf>
</owl:Class>
</rdf:RDF>
交差クラスに関するクエリを作成する方法を説明した OWL 交差クラスによって暗示されたスーパークラスの取得への回答を既に書いているので、ここですべてを再度説明することはしませんが、これに対して機能するクエリを含めます。場合。ここで示している結果は、Jena のコマンド ライン SPARQL クエリ ツールを使用して取得したものです。
prefix : <https://stackoverflow.com/q/21092246/1281433/data.owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?superclass where {
:A (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?superclass .
}
--------------
| superclass |
==============
| :A |
| _:b0 |
| :B |
| :C |
| _:b1 |
--------------
ここで、空白のノードは匿名交差クラスと匿名制限クラスです。それらを結果に含めたくない場合は、非常に簡単にフィルターで除外できます。
prefix : <https://stackoverflow.com/q/21092246/1281433/data.owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?superclass where {
:A (rdfs:subClassOf|(owl:intersectionOf/rdf:rest*/rdf:first))* ?superclass .
filter(!isBlank(?superclass))
}
--------------
| superclass |
==============
| :A |
| :B |
| :C |
--------------
^owl:equivalentClass|owl:equivalentClass
同等のクラスにも従いたい場合は、そのプロパティ パスに 追加することもできます。
プロテジェでこれを行う
前述のとおり、上記の結果は Jena のコマンド ライン ツールを使用したものです。Protégé でこれをやりたいとおっしゃいましたが、問題が発生しそうなので少し難しくなります。私が示した最後のクエリは、Protégé で A と B のみを生成します。何らかの理由で C が含まれていません。

ただし、空白ノードの処理は少し改善されています (つまり、 を削除してfilter
有用な出力を得ることができます)。

残念ながら、Jena が Protégé で提供するものと同じ出力を取得する方法はわかりませんが、それについて彼らのメーリング リストに電子メールで送信しています。