プロパティを定義するためのベストプラクティス?

Nov 23 2020

OWL / RDFSに関する私の問題は、複数の範囲とドメインを定義することにより、推論システムがインスタンス(ドメインまたは範囲として定義される)を、そのプロパティのドメインまたは範囲に対して定義されたすべてのクラスのタイプとして分類することです。

その問題を克服するための可能な解決策は何ですか?

  • 1つの方法は、SHACLを使用することです。しかし現在、視覚化ツールは機能しなくなりました。

短い例:

:ClassA a owl:Class .
:ClassB a owl:Class .
:ClassC a owl:Class .

:hasClassC a owl:ObjectProperty ;
    rdfs:domain :ClassA, :ClassB;
    rdfs:range :ClassC .

:instanceA a :ClassA ;
    :hasClassC instanceC .
:instanceC a :ClassC .

問題:推論の出力:

:instanceA a :ClassB .

SHACLの回避策:

:ClassA a owl:Class, sh:NodeShape ;
  sh:property  :ClassA-hasClassC .

:ClassA-hasClassC  rdf:type  sh:PropertyShape ;
  sh:path   :hasClassC ;
  sh:class  :ClassC .

:ClassB a owl:Class, sh:NodeShape ;
  sh:property  :ClassB-hasClassC .

:ClassB-hasClassC  rdf:type  sh:PropertyShape ;
  sh:path   :hasClassC ;
  sh:class  :ClassC .

回答

3 HenrietteHarmse Nov 24 2020 at 15:22

SHACLでこれを解決する方法は、2つの異なる形状を使用することです。1つClassAはドメインである場合、もう1つはドメインである場合ClassBです。

OWLで同様のことを実現するには、2つのオブジェクトプロパティが必要です。1つClassAはドメインである場合、もう1つはドメインである場合ClassBです。

:classAHasClassC a owl:ObjectProperty ;
  rdfs:domain :ClassA;
  rdfs:range :ClassC .

:classBHasClassC a owl:ObjectProperty ;
  rdfs:domain :ClassB;
  rdfs:range :ClassC .

:instanceA a :ClassA ;
  :classAHasClassC instanceC .

この一層明確にするために、あなたは、プロパティその親プロパティや状態を追加することもできますclassAHasClassCし、classBHasClassC互いに素であります:

:hasClassC a owl:ObjectProperty

:classAHasClassC a owl:ObjectProperty ;
  rdfs:subPropertyOf :hasClassC;
  rdfs:domain :ClassA;
  rdfs:range :ClassC .

:classBHasClassC a owl:ObjectProperty ;
  rdfs:subPropertyOf :hasClassC;
  owl:propertyDisjointWith :classAHasClassC
  rdfs:domain :ClassB;
  rdfs:range :ClassC .

最後に、作られている一般的な間違いは、あなたが持っている場合という考え方であるClassA, ClassBのドメインとしてhasClassC、ドメインがの労働組合であることを意味していること、ClassAおよびClassB。代わりに、どのようなClassA, ClassB手段がドメインであることである交差点ClassAClassB。ユニオンを使用するように指定するには、次を使用する必要があります。

rdfs:domain [ rdf:type owl:Class ;
  owl:unionOf (:ClassA
               :ClassB
              )
            ] ;