为何我的SHACL校验未按预期生效?序列路径写法问题求助
问题根源
你的SHACL规则结构不符合规范逻辑,两处错误导致校验失败:
ex:ColorProperty作为sh:property声明的属性形状,缺少必填的sh:path属性,校验器无法确定需要校验目标节点的哪个属性。- 你把序列路径写在了
sh:qualifiedValueShape内部,该位置的sh:path是用来定义内嵌形状的属性校验路径,而非外层属性形状的取值路径,完全不符合你的业务逻辑。
修复方案
提供两种符合需求的正确写法,任意一种都可以实现「验证ex:John至少绘制2个红色球」的规则:
方案1:序列路径直接统计(写法简洁)
@prefix ex: <http://datashapes.org/sh/tests/core/path/path-sequence-003.test#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix sh: <http://www.w3.org/ns/shacl#> . ex:paintNodeShape rdf:type sh:NodeShape ; sh:targetNode ex:John ; sh:property [ # 序列路径直接取所有ex:paint关联节点的ex:ballColor值 sh:path (ex:paint ex:ballColor) ; # 值为Red的结果至少有2个 sh:minCount 2 ; sh:hasValue "Red" ; ] .
方案2:嵌套属性形状校验(分层逻辑清晰)
@prefix ex: <http://datashapes.org/sh/tests/core/path/path-sequence-003.test#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix sh: <http://www.w3.org/ns/shacl#> . ex:paintNodeShape rdf:type sh:NodeShape ; sh:targetNode ex:John ; sh:property [ sh:path ex:paint ; # 校验ex:paint的取值中至少有2个符合下方定义的形状 sh:qualifiedMinCount 2 ; sh:qualifiedValueShape [ sh:property [ sh:path ex:ballColor ; sh:hasValue "Red" ; ] ; ] ; ] .
替换你原有shacl.ttl的内容后重新校验即可通过。
内容的提问来源于stack exchange,提问作者joylix
相关产品推荐
相关产品推荐

