0

我正在尝试制作一个属性形状,可以区分“真实”定义和定义的占位符作为 skos:definition 的值。我的输入倾向于在定义字段中包含诸如“”、“N/A”、“NA”、“None”等内容,这很好,除了我的 shacl 形状应该认识到这个定义是无效的。


:PlaceholderForDefinition
      a sh:PropertyShape ;
      sh:path skos:definition ;
      sh:minLength 1 ;
      sh:not [sh:in ([sh:pattern "^(?!\s*n\s*/?\s*a\s*$).*"] [sh:pattern "None"])
      ] ;   
.

有没有办法使上述结构工作,还是我完全走错了路?我承认使用某种正则表达式黑名单并不是最佳选择,但它应该已经捕获了 90% 的情况,这目前已经足够好了,并且可以随着时间的推移而扩展。

提前感谢任何提示或想法!

4

1 回答 1

0

sh:in 使用列表的文字值:它不会进入您可以作为列表中的值输入的形状内部,也不会评估您的常规表达式,因此它会将正则表达式视为字符串。

https://www.w3.org/TR/shacl/#InConstraintComponent w3c 标准中所述,似乎 sh:in 使用列表项的文字值,如果您的列表项只是字符串位,这很好,但它不会进入列表中的任何属性形状来查找约束,而只是采用形状的文字名称。

sh:or 在这种情况下比 sh:in 效果更好,并且会正确评估正则表达式。

于 2021-09-15T07:10:34.307 回答