गुणों को परिभाषित करने के लिए सर्वोत्तम अभ्यास?

Nov 23 2020

OWL / RDFS के साथ मेरी समस्या यह है कि कई श्रेणियों और डोमेन को परिभाषित करके, तर्ककर्ता ऐसे उदाहरणों को वर्गीकृत करेगा (जो डोमेन या श्रेणी के रूप में परिभाषित हैं) डोमेन या उस संपत्ति की सीमा के लिए सभी परिभाषित वर्गों के प्रकार के रूप में।

उस समस्या को दूर करने के लिए संभावित समाधान क्या हैं?

  • एक तरीका होगा, 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 अलग-अलग आकृतियाँ हैं: एक के लिए जब ClassAडोमेन है और एक के लिए ClassBडोमेन है।

OWL में कुछ समान हासिल करने के लिए आपको 2 ऑब्जेक्ट प्रॉपर्टी की आवश्यकता होगी: एक ClassAहै डोमेन कब है और एक कब 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इसका मतलब है कि डोमेन है चौराहे के ClassAऔर ClassB। यह निर्दिष्ट करने के लिए कि संघ का उपयोग किया जाना चाहिए, किसी को निम्नलिखित का उपयोग करना होगा:

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