如何用SHACL验证可选属性的特定值约束?
解决DCAT-AP dcat:themeTaxonomy的SHACL验证问题
需求回顾
dcat:Catalog的dcat:themeTaxonomy是可选属性:
- 若不使用该属性,完全合规
- 若使用该属性,必须至少包含一个值为
<http://publications.europa.eu/resource/authority/data-theme>,其余值无限制
错误原因分析
你之前的写法错误在于直接在sh:or的数组里放置sh:maxCount、sh:minCount这类约束组件,而sh:or的每个成员必须是完整的SHACL Shape节点,不能是单独的约束组件,这才导致了找不到验证器的报错。
可行SHACL规则实现
以下是正确的SHACL形状定义,通过sh:or组合两种合法场景:
@prefix dcat: <http://www.w3.org/ns/dcat#> . @prefix sh: <http://www.w3.org/ns/shacl#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . dcat:CatalogShape a sh:NodeShape ; sh:targetClass dcat:Catalog ; sh:or ( # 场景1:完全不使用dcat:themeTaxonomy属性 [ sh:path dcat:themeTaxonomy ; sh:maxCount 0 ; ] # 场景2:使用该属性,且至少有一个值是指定的EU数据主题词表 [ sh:path dcat:themeTaxonomy ; sh:minCount 1 ; sh:qualifiedValueShape [ sh:hasValue <http://publications.europa.eu/resource/authority/data-theme> ; ] ; sh:qualifiedMinCount 1 ; ] ) ; .
规则说明
sh:or的两个成员都是独立的sh:PropertyShape节点,分别对应两种合法情况- 第一个Shape确保属性出现次数为0(即不使用该属性)
- 第二个Shape要求属性至少出现1次,且其中至少有1个值符合指定的
sh:hasValue条件,其余值不受限制
内容的提问来源于stack exchange,提问作者Ludger
相关产品推荐
相关产品推荐

