首页 > 解决方案 > 如何根据 shacl 的使用来验证类的实例?

问题描述

就我而言,有 SingleChoice (SC) 和 MultipleChoice (MC) 问题。SC 有一组答案(作为空白节点),必须完全包含一个“点”和一个“文本”属性。MC 有一组答案,其中必须包含一个“points”、一个“text”和一个“pointsNegative”属性。以乌龟为例:

prefix ex ...

ex:SC a ex:SingleChoice .
  ex:hasAnswers [
    a ex:Answer .
    ex:text "Answer 1" .
    ex:points 5 ;
  ],[ ...sameAsAbove ], ... ;

ex:MC a ex:MultipleChoice .
  ex:hasAnswers [
    a ex:Answer .
    ex:text "Answer 1" .
    ex:points 5 .
    ex:pointsNegative 1 ;
  ],[ ...sameAsAbove ], ... ;

我设法编写了验证所有 ex:Answer 类实例的 shacl 规则。但我无法通过使用这些规则验证它们来区分这些实例属于哪个(SC 或 MC):

ex:AnswerShape
  a sh:NodeShape ;
  sh:targetClass ex:Answer ;
  sh:property [
    a sh:PropertyShape ;
    sh:path ex:Text ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:dataType xsd:string .
  ] .

例如,如果我为 ex:pointsNegative 添加另一个 PropertyShape,则形状对于 SC 问题的所有答案都将失败(因为这些没有 ex:pointsNegative)。我可以省略 minCount 限制,但是 MC 问题的答案可能没有 ex:pointsNegative 属性。我如何根据那里的链接(属于 SC 或 MC)来为 Class ex:Answer 的实例执行不同的规则?这甚至可能与 Shacl 吗?

标签: shacl

解决方案


解决方案 1 - 创建专用答案类型

一个简单的解决方案是使用不同的类作为答案,例如ex:SingleChoiceAnswerex:MultipleChoiceAnswer。这样,您可以为每种答案类型创建专用形状。

# answers
prefix ex ...

ex:SC a ex:SingleChoice .
  ex:hasAnswers [
    a ex:SingleChoiceAnswer .
    ex:text "Answer 1" .
    ex:points 5 ;
  ],[ ...sameAsAbove ], ... ;

ex:MC a ex:MultipleChoice .
  ex:hasAnswers [
    a ex:MultipleChoiceAnswer .
    ex:text "Answer 1" .
    ex:points 5 .
    ex:pointsNegative 1 ;
  ],[ ...sameAsAbove ], ... ;

# shapes
ex:AnswerShape
  a sh:NodeShape ;
  sh:targetClass ex:SingleChoiceAnswer ;
  sh:property [
    a sh:PropertyShape ;
    ...
  ] .

ex:AnswerShape
  a sh:NodeShape ;
  sh:targetClass ex:MultipleChoiceAnswer ;
  sh:property [
    a sh:PropertyShape ;
    ...
  ] .

解决方案 2 - SHACL 属性路径

在不改变原始模式的情况下工作的另一个解决方案是使用属性路径。这样,您可以针对选择类型并为它们声明专用的属性形状。

# shapes
ex:SingleChoiceShape
  a sh:NodeShape ;
  sh:targetClass ex:SingleChoice ;
  sh:property [
    a sh:PropertyShape ;
    sh:path (ex:hasAnswers ex:text)
    ...
  ] .

ex:MultipleChoice
  a sh:NodeShape ;
  sh:targetClass ex:MultipleChoice ;
  sh:property [
    a sh:PropertyShape ;
    sh:path (ex:hasAnswer ex:pointsNegative)
    ...
  ] .

推荐阅读