将 SHACL 与
sh:closed true
与继承结合使用时遇到问题。具体来说,当子类具有超类没有的属性时,就会出现问题。
这是一个本体示例:
onto:prop a owl:DatatypeProperty .
onto:SuperClass a owl:Class .
onto:SubClass
a owl:Class ;
rdfs:subClassOf onto:SuperClass,
[
a owl:Restriction ;
owl:onProperty onto:Prop ;
owl:cardinality 1
] .
示例数据:
此陈述应评估为正确:
ex:ExampleCorrect a onto:SubClass ;
onto:prop "Text" .
但是,这些应该是不正确的:
ex:ExampleWrong a onto:SubClass ;
onto:other 1 .
ex:ExampleWrongSuperClass a onto:SuperClass ;
onto:prop "Text" .
解决方案:
如果我想阻止使用其他属性,我将构造这些形状类型:
onto:SuperClass_Shape
a sh:NodeShape ;
sh:closed true ;
sh:targetClass onto:SuperClass .
onto:SubClass_Shape
a sh:NodeShape ;
sh:targetClass onto:SubClass ;
sh:closed true ;
sh:property [
a sh:PropertyShape ;
sh:maxCount 1 ;
sh:minCount 1 ;
sh:path onto:prop ;
sh:severity sh:Violation
] .
但是因为
onto:SuperClass_Shape
没有枚举属性 onto:prop
并且应用了 sh:closed true
,所以这会导致违规。
我知道也可以只针对一个节点,而不是像上面那样针对整个类。
onto:SubClass_Shape
a sh:NodeShape ;
sh:targetNode ex:ExampleCorrect .
但是我想同时评估数千个节点。对我来说,枚举所有数据 IRI 似乎不是一个好的解决方案。
我明白我的目的与SHACL和RDF继承的逻辑有些矛盾。
如何构造 SHACL 形状以允许子类拥有自己的属性而不违反超类的封闭形状限制?
我想防止所有类中出现额外的属性,但仍然允许子类灵活地定义自己的属性。
如有任何建议或见解,我们将不胜感激!
sh:close 的设计(不幸的是)没有考虑子类关系。但很多人都遇到过类似的问题,你也遇到过,并且有扩展 dash:closeByTypes 来解决它。
https://datashapes.org/constraints.html#ClosedByTypesConstraintComponent
要使用它,您需要一个支持 SHACL-SPARQL 的 SHACL 引擎。
即将推出的 SHACL 1.2 WG 可能会将类似的内容带入 SHACL 核心词汇表中,请参阅 https://github.com/w3c/shacl/issues/43