我很难理解应该如何使用sh:shapesGraph。到目前为止,我已经使用了一个SHACL验证器,它可以遍历owl:import并将内容带到数据图中,这样我就可以从rdfs:subClassOf等中受益。
但是,根据SHACL规范,数据图中的sh:shapesGraph声明";是一个IRI,表示应该包含在用于验证数据图的形状图中的图">规范明确了sh:shapesGraph三元组是在数据图中声明的:"数据图可以包括三元组,用于向具有谓词sh:shapesGraph的SHACL处理器建议一个或多个图">
因此,例如在使用https://www.itb.ec.europa.eu/shacl/shacl/upload为了验证,我的理解是,除了包含的数据图之外,我不需要提供任何东西
[] sh:shapesGraph <http://foo.bar/#> .
这应该会自动用http://foo.bar/#形状。
根据例如AllegroGraph文档判断,这正是应该发生的事情:"如果未指定形状图iri/s,SHACL处理器将首先通过在dataGraph中查找具有谓词sh:shapesGraph的三元组来创建shapesGraph。如果没有这样的三元组,那么shapesGraph将被假定为与dataGraph相同">
然而,我尝试过的开放验证器(欧盟ITB验证器或Zazuko游乐场(都没有以任何方式对sh:shapesGraph做出反应(无论我是否为空白节点声明它(,而owl:import从同一个URL完美地工作。
这种行为标准化了吗?对于这样的基本功能,我认为所有验证器的行为都是类似的。
有人能阐明并用平凡的语言解释我在这里错过了什么吗?
sh:shapesGraph的想法是使数据发布者能够提供应该将哪些形状应用于数据的提示。我们邀请了工具,但不要求它们遵循此提示。一些API支持此属性,但其他操作显式文件上传的工具可能不会查找此属性
所以我相信你的解释是正确的,但考虑到sh:shapesGraph属性没有严格的形式语义,这对引擎来说是强制性的,它的覆盖范围是不完整的。注意";应该";以及";可以";在规范中
FWIW我们在实践中所做的是,当数据图的预期形状清晰时,我们将形状放入一个本体中,然后owl:从数据图导入该本体。这样做的效果是,更多的API和工具将遵循owl:imports,因此您可以将形状放入数据图中。然后,如果你留下形状图";"空";大多数系统应该假设shapesgraph=数据图,并使用所提供的形状。