You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:45:03