SHACL中如何约束sh:property取值为无特定类的URI
SHACL中约束属性取值为任意URI(不绑定特定类)的实现方法
直接使用SHACL内置的sh:nodeKind约束即可实现需求,无需编写自定义校验规则。
具体用法
在目标属性的形状声明中添加sh:nodeKind sh:IRI,该约束会强制属性的取值必须为IRI(即通用URI),不会限制URI对应的实体必须归属某个特定类,同时会自动拦截字面量、空白节点等非URI类型的取值。
修改后的完整SHACL示例
仅需要在原有meta:value的属性形状中补充对应约束即可:
@prefix sh: <http://www.w3.org/ns/shacl#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix meta: <metadata#> . @prefix meta_sh: <metadata/shacl#> . meta_sh:Entry a sh:NodeShape; sh:targetClass meta:Entry; sh:property [ sh:path meta:value; sh:nodeKind sh:IRI; # 核心约束:取值必须为URI/IRI,无类绑定要求 sh:minCount 1; # 要求至少存在1个取值 ]; sh:property [ sh:path meta:time; sh:datatype xsd:dateTime; sh:minCount 1; sh:maxCount 1; ]; .
校验规则说明
- 符合要求的取值:所有URI类型的值,无论对应实体是否声明
rdf:type、归属什么类,都可以通过校验,示例数据里的data:ProductListing_459、data:RentalListing_934均属于合法取值。 - 会被拦截的非法取值:字符串、数字、日期等各类字面量、空白节点。
如果后续需要同时允许空白节点作为取值,可以将约束值替换为sh:BlankNodeOrIRI,针对当前仅允许URI的需求,使用sh:IRI即可完全匹配。
内容的提问来源于stack exchange,提问作者Neil Graham
相关产品推荐
相关产品推荐

