我想用SHACL验证现有本体和知识库的现有rdfs:domain和rdfs:range语句。然而,用SHACL来做这件事似乎非常冗长。
现有定义
:prop1 a owl:ObjectProperty;
rdfs:domain ?A;
rdfs:range ?B.在SHACL
:AShape a sh:NodeShape;
sh:targetClass :A;
sh:property [sh:path :prop1];
sh:closed true.
:ADomainShape a sh:NodeShape;
sh:targetSubjectsOf :prop1;
sh:class :A.
:prop1RangeShape a sh:NodeShape;
sh:targetObjectsOf :prop1;
sh:ClassB.当您有几十个属性时,这会在原始域和range语句中声明的内容上添加大量的仪式。虽然可以使用脚本或多行编辑器来加快进程,但对我来说,这仍然是不必要的。有什么方法可以告诉像PySHACL这样的SHACL验证器只验证现有的域和范围语句而不需要所有额外的三元组呢?
发布于 2022-01-22 02:23:14
让我首先说,rdfs:domain和rdfs:range不是约束,也不是您所暗示的。他们只是在做出推论。尽管如此,许多人在过去仅仅因为没有其他建模语言而使用它们来“表示”约束。有关背景,请参见
https://www.topquadrant.com/owl-blog/
如果不希望将RDFS三元组复制为单独的SHACL约束,则可以编写一个泛型SHACL形状,该形状具有sh:targetSubjectsOf rdfs:domain (和range),然后使用SPARQL约束检查除了具有给定属性值的域类以外,没有其他类的实例。最终的结果将是所有rdfs:域语句都将被一次检查。
但可以说,RDFS应该被置之不理。如果您想要使用封闭世界的语义,那么您应该使用一种为此目的而设计的语言,即SHACL。
(顺便说一句,如果你想要更高的带宽来讨论这些事情,https://twitter.com/HolgerKnublauch/status/1461590465304662019)
https://stackoverflow.com/questions/70787874
复制相似问题