Как проверить экземпляры класса, основываясь на их использовании с shacl? - PullRequest
0 голосов
/ 02 апреля 2019

В моем случае есть вопросы SingleChoice (SC) и MultipleChoice (MC).У SC есть набор ответов (в виде пустых узлов), которые должны содержать одно свойство "points" и одно "text".У 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 ], ... ;

Мне удалось написать правила shacl, которые проверяют все экземпляры класса ex: Answer.Но я не могу понять, к чему относятся эти экземпляры (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 .
  ] .

Например, если я добавлю еще один PropertyShape для ex: pointsNegative, форма не будет выполнена длявсе ответы на вопрос SC (поскольку у них нет ex: pointsNegative).Я мог бы опустить ограничение minCount, но тогда ответы на вопросы MC могут не иметь свойства ex: pointsNegative.Как мне управлять выполнением разных правил для экземпляров класса ex: Answer, в зависимости от того, есть ли ссылки (принадлежат SC или MC)?Это возможно даже с Shacl?

1 Ответ

0 голосов
/ 02 апреля 2019

Решение 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)
    ...
  ] .
...