Как проверить экземпляры класса на основе их использования с 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 ], ... ;

Мне удалось написать правила 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. Как мне удается выполнять разные правила для экземпляров Class ex: Answer в зависимости от того, какие ссылки (принадлежат SC или MC)? Возможно ли это вообще с Shacl?


person Roy    schedule 02.04.2019    source источник


Ответы (1)


Решение 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)
    ...
  ] .
person Marvin Frommhold    schedule 02.04.2019
comment
Большое спасибо за этот совет! Это практичный способ сделать это. Вы также знаете решение без введения конкретных классов ответов? Проверка не должна требовать изменения фактических данных ... - person Roy; 03.04.2019
comment
Вы можете использовать путь к свойству SHACL, если не хотите изменять свою схему. См. Мой обновленный ответ. - person Marvin Frommhold; 04.04.2019