如何结合sh:in与sh:pattern识别skos:definition中的无效定义占位符
SHACL skos:definition 合法性校验规则调整方案
原规则的核心问题
你的设计方向没有问题,只是原写法存在几个语法和逻辑错误,无法正常生效:
- 错误使用
sh:in约束:sh:in的参数是固定常量值列表,不能嵌套sh:pattern这类约束组件,不符合SHACL语法规范 - 正则逻辑写反:原规则中的否定前瞻
(?!...)是匹配不是N/A类内容的字符串,套在sh:not里会反过来把合法内容判定为非法 - 覆盖场景不全:没有兼容大小写变种、
N.A.、前后带空格的占位值、全空格无效值 sh:minLength 1只能过滤纯空字符串,过滤不了全空格的无效内容
可直接运行的修正后规则
单正则精简版(适合当前需求)
:PlaceholderForDefinition a sh:PropertyShape ; sh:path skos:definition ; sh:minLength 1 ; # 匹配所有非占位类合法内容 sh:pattern "^\\s*(?!(n\\s*[./]?\\s*a|none)\\s*$).*" ; sh:flags "i" ; # 忽略大小写,兼容N/A、n/a、None、none等所有大小写变种 sh:message "skos:definition不能使用N/A、None等占位内容,需填写真实定义" .
正则逻辑说明:
- 自动过滤开头、结尾的多余空白字符
- 排除所有N/A变种(含中间带/、.、空格的格式)、None变种
- 保留所有真实有效定义内容
易扩展版(适合后续迭代)
如果后续要频繁新增占位规则,推荐用sh:not+sh:or拆分约束,可读性和可维护性更高:
:PlaceholderForDefinition a sh:PropertyShape ; sh:path skos:definition ; sh:minLength 1 ; sh:not [ sh:or ( # 匹配N/A类占位 [ sh:pattern "^\\s*n\\s*[./]?\\s*a\\s*$" ; sh:flags "i" ] # 匹配None类占位 [ sh:pattern "^\\s*none\\s*$" ; sh:flags "i" ] # 后续新增占位规则直接在此处追加即可,无需修改原有逻辑 ) ] ; sh:message "skos:definition不能使用占位内容" .
后续扩展建议
- 需要覆盖中文占位值(比如“暂无”“无”)时,直接在正则中加分支,或者在
sh:or列表中新增约束节点即可 - 如果占位值种类超过10种,可以改用
sh:sparql约束批量匹配提前维护的黑名单值列表,不用逐个写正则
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

