定义属性的最佳实践?

Best Practice for defining Properties?

我对 OWL/RDFS 的问题是,通过定义多个范围和域,推理器会将实例(定义为域或范围)分类为所有定义的类型 类 域或属性.

的范围

克服该问题的可能解决方案是什么?

简短示例:

: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 .

您在 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 .

为了使这一点更清楚,您可能需要添加一个父项 属性 并声明属性 classAHasClassCclassBHasClassC 是不相交的:

: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
              )
            ] ;