shacl - 如何根据 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 吗?
解决方案
解决方案 1 - 创建专用答案类型
一个简单的解决方案是使用不同的类作为答案,例如ex:SingleChoiceAnswer
和ex: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)
...
] .
推荐阅读
- office-js - 带有图形 api 的 Outlook Web 插件
- sql - 为什么 Oracle 返回 Not Valid Month 错误
- linux - 从 Linux shell 脚本调用 Oracle 存储过程
- javascript - AMP-Stories 和 Google Analytics 不跟踪事件触发器
- c# - 我可以让 Windows C# 控制台应用程序使用不同的终端,例如 PowerShell 或 MSYS?
- eclipse - 焦点恢复 JFace 对话框关闭
- asp.net-mvc - 将 OwinADAuthentication 从 .NET Framework 转换为 .NET Core
- javascript - 从java调用外部javascript函数
- php - PHP ZipArchive::close 返回 false
- amazon-web-services - 在运行 sbt 测试的 IAM 角色下获取 AWS 凭证