3

Nicotine (製品) のすべてのサブクラスを照会したい。
結果は(鼻フォームニコチン、ニからの口腔咽頭..(4項目)..写真を参照) rdfs:subClassOf+ および owl:equivalentClass+ でクエリを実行しようとしましたが、機能しませんでしたこの例から 、ここと同じコードを試してください.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>           
PREFIX owl: <http://www.w3.org/2002/07/owl#>        
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>         
SELECT * WHERE 
{       
  ?s owl:equivalentClass+ ?o . # and try   ?s rdfs:subClassOf ?o    
  filter(?s=<http://snomed.info/id/323283001>)       
}

プロテジからのこの画像 ありがとう。

最初のクエリは、サブクラスではなく、同等のクラスではない IRI が非常に大きなファイルであるため、説明と実行が難しいため、代わりにこれからクエリする方法を変更します

<owl:Class rdf:about="http://snomed.info/id/323283001">
    <rdfs:label xml:lang="en">Nicotine (product)</rdfs:label>
    <rdfs:subClassOf>
        <owl:Class>
            <owl:intersectionOf rdf:parseType="Collection">
                <rdf:Description rdf:about="http://snomed.info/id/420383004"/>
                <rdf:Description rdf:about="http://snomed.info/id/425288007"/>
                <owl:Restriction>
                    <owl:onProperty rdf:resource="http://snomed.info/id/127489000"/>
                    <owl:someValuesFrom rdf:resource="http://snomed.info/id/68540007"/>
                </owl:Restriction>
            </owl:intersectionOf>
        </owl:Class>
    </rdfs:subClassOf>
</owl:Class>

すべての id (id/420383004、id/425288007、id/127489000、id/68540007) を照会したい

from owl:Class rdf:about="http://snomed.info/id/323283001" アイデアを教えてください。感謝

4

1 に答える 1

14

まず、SPARQL クエリに関するいくつかの注意事項を整理します。1 つ目はプロパティ パスにおける と の違いに関するもので、2 つ目は と の使用*に関するものです。次に、データからさまざまなタイプのサブクラス/スーパークラスの関係を照会する方法を見ていきます。ここでの秘訣は、私たちが探している関係のいくつかは、通常は OWL 推論を使用する関係ですが、SPARQL を使用してその OWL 推論を少し実行しようとしていることです。+filtervalues

元のクエリに関するいくつかの注意事項

プロパティ パス、+および*

リンクした他の質問では、プロパティ パスが演算子を使用していることに注意してください*。これは、長さが 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があり、交差クラスである (通常は匿名の) クラスがあり、それがBCの交差であるということです。あなたは公理を持っていません

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é で提供するものと同じ出力を取得する方法はわかりませんが、それについて彼らのメーリング リストに電子メールで送信しています。

于 2014-01-13T14:02:16.477 に答える