如何为关联Base Perspective的目标创建SHACL条件验证形状?
实现思路与方案
核心思路是利用SHACL的逻辑约束(sh:and/sh:or/sh:not)结合节点引用(sh:node),将目标是否关联Base Perspective作为前置条件,对连接验证规则做分支处理。
先明确判断逻辑
首先需要复用已定义的bso:BasePerspective规则,判断Strategic_Objective是否关联了Base Perspective:
# 辅助约束:判断目标是否关联至少一个Base Perspective bso:LinkedToBasePerspective sh:path bso:contributesToPerspective ; sh:node bso:BasePerspective ; sh:minCount 1 .
这个约束的含义是:目标的contributesToPerspective属性至少指向一个满足bso:BasePerspective规则的视角(即该视角存在反向的isBaseFor关联)。
场景1:关联Base Perspective时,跳过连接验证
如果需求是「关联Base Perspective的目标无需满足连接要求,未关联的必须满足」,可以用sh:or组合两个分支:
bso:ConditionalConnectedObjectives a sh:NodeShape ; sh:targetClass bso:Strategic_Objective ; sh:or ( # 分支1:关联了Base Perspective,无需验证连接 [ sh:node bso:LinkedToBasePerspective ] # 分支2:未关联Base Perspective,必须满足原连接规则 [ sh:or ( [sh:path bso:hasCauseEffectRelationship; sh:minCount 1] [sh:path [sh:inversePath bso:hasCauseEffectRelationship]; sh:minCount 1] ) ; sh:message "未关联Base Perspective的目标必须与其他战略目标建立连接" ; ] ) .
场景2:关联Base Perspective时,显示不同的验证提示
如果需求是「无论是否关联Base Perspective都需要验证,但提示信息/严重程度不同」,可以拆分为两个独立约束,用sh:condition控制生效条件:
针对未关联Base Perspective的目标(保留原规则提示)
bso:ConnectedObjectivesNonBase a sh:NodeShape ; sh:targetClass bso:Strategic_Objective ; sh:condition [ sh:not [ sh:node bso:LinkedToBasePerspective ] ] ; sh:message "需要与其他战略目标建立连接" ; sh:or ( [sh:path bso:hasCauseEffectRelationship; sh:minCount 1] [sh:path [sh:inversePath bso:hasCauseEffectRelationship]; sh:minCount 1] ) .
针对关联Base Perspective的目标(自定义提示/严重程度)
bso:ConnectedObjectivesBase a sh:NodeShape ; sh:targetClass bso:Strategic_Objective ; sh:condition [ sh:node bso:LinkedToBasePerspective ] ; sh:message "关联Base Perspective的目标建议与其他战略目标建立连接" ; sh:severity sh:Warning ; # 可改为sh:Info降低提示等级 sh:or ( [sh:path bso:hasCauseEffectRelationship; sh:minCount 1] [sh:path [sh:inversePath bso:hasCauseEffectRelationship]; sh:minCount 1] ) .
关键注意事项
- 规则复用:通过
sh:node bso:BasePerspective直接复用已定义的Base Perspective验证逻辑,避免重复编写,保证规则一致性。 - 停用原规则:使用新的条件规则时,记得将原有的
bso:ConnectedObjectives设置为sh:deactivated true,避免重复验证。 - SHACL版本:
sh:condition是SHACL 1.1的特性,确保你的验证引擎支持该版本。
内容的提问来源于stack exchange,提问作者António Antunes
相关产品推荐
相关产品推荐

