定义属性的最佳实践?
Best Practice for defining Properties?
我对 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 .
您在 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
)
] ;
我对 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 .
您在 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
)
] ;