Ограничение SPIN с использованием CONSTRUCT: куда идут тройки CONSTRUCT?

Я использую TopBraid Composer Free Edition (5.1.3) для создания онтологий, включая ограничения SPIN. Затем я загружаю полученные RDF-файлы в RDF4J (2.0.1) и использую RDF4J Workbench для тестирования.

Я работаю над ограничениями SPIN. Вот пример проверки неотрицательных скоростей сигналов, которые я добавил к CRO2:SignalRate учебный класс:

CONSTRUCT {
  ?this soo:hasConstraintViolation _:b0 .
  _:b0 a spin:ConstraintViolation .
  _:b0 rdfs:label "Non-Positive SignalRate" .
  _:b0 spin:violationRoot ?this .
  _:b0 spin:violationPath Nuvio:hasDataValue .
  _:b0 spin:violationLevel spin:Warning .
}
WHERE {
    ?this Nuvio:hasDataValue ?signalRate .
    FILTER (?signalRate <= 0.0) .
}

Итак, я тестирую это ограничение в RDF4J, используя следующий запрос на обновление SPARQL:

PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#>
PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>
PREFIX CRO2: <http://cogradio.org/ont/CRO2.owl#>

INSERT DATA {
  inst:aSignalRate_test a CRO2:SignalRate ;
    Nuvio:hasDataValue "-10"^^xsd:long .
}

Этот момент теста нарушает ограничение, указанное выше. Если я опущу spin:violationLevel тройной и позволяют это по умолчанию в spin:Error, затем я получаю сообщение об ошибке из запроса, и экземпляр теста не утверждается, как ожидалось. При выполнении, как показано, нарушение ограничения является spin:Warning, Итак inst:aSignalRate_test индивид создается со значением данных -10,0. Мой вопрос, где утверждения в ограничении CONSTRUCT оговорка идти? Я полагаю, что они утверждаются с момента изменения в spin:violationLevel влияет на поведение. Обратите внимание, что я пытался связать пустой узел с моим собственным soo:hasConstraintViolation собственность, но это не работает. Утверждаются ли тройки CONSTRUCT в каком-то другом контексте / графе? Я просто использую default/graph для всего.

Я ищу ожидаемые тройки, как с помощью RDF4J Workbench's Explore, так и с помощью запросов SPARQL. Например, следующий запрос ничего не возвращает после того, как я утверждаю свою ошибку CRO2:SignalRate:

PREFIX spin: <http://spinrdf.org/spin#>

SELECT DISTINCT *
WHERE {
    ?s spin:violationRoot ?o .
}

Это поведение согласуется между утверждением в TopBraid Composer FE и RDF4J Workbench.

Моя цель - найти и использовать диагностические сообщения, заявленные в случае нарушения ограничений SPIN, предпочтительно с помощью запросов SPARQL, чтобы найти такую ​​диагностику. Кажется разумным. Я что-то упустил.

Благодарю.

2 ответа

Решение

Краткий ответ: вы не можете.

Ограничения SPIN предназначены для выявления нарушений и сообщения о них. В RDF4J таким механизмом отчетности является журнал.

Соответствующая часть спецификации SPIN ( http://spinrdf.org/spin.html):

[...] если ограничение ASK оценивается как true для одного экземпляра, то экземпляр нарушает условие. Опционально, запросы CONSTRUCT могут создавать экземпляры класса Spin:ConstraintViolation, которые предоставляют сведения о конкретном нарушении.

Обратите внимание, что от рассудителя не требуется ничего делать с данными, которые создает ограничение на основе CONSTRUCT, - это просто для дополнительной "дополнительной информации".

Возможно, стоит посмотреть, сможем ли мы добавить к рассуждению усовершенствование, чтобы сообщать о таких тройках в той или иной форме, но в текущей системе только правила SPIN (с помощью DELETE/INSERT и т. Д.) Изменяют базу данных.

Итак, следуя комментариям @JeenBroekstra и моему ответному комментарию выше, я переключился на использование конструкторов, чтобы информация об ошибках оставалась в виде видимых артефактов. Я создал несколько собственных подпрограмм конструктора spin: для того, чтобы упорядочить вещи. Я также указал порядок выполнения этих конструкторов, чтобы эти проверки опережали другие правила, которые могут быть отключены (например, из-за отрицательной скорости сигнала).

Преимущества этого подхода:

  • Артефакты с подробной информацией об ошибке (например, spin: protectRoot) остаются видимыми в тройном хранилище. Это очень важно в моем приложении, которое связано с машиной к машине.
  • Все проверки соответствия сделаны, поэтому человек с множественными проблемами перечисляет все проблемы как отдельные hasConstraintViolation свойства, а не только первое нарушение, чтобы заблокировать создание экземпляров.

Недостатки этого подхода:

  • Странствующий человек все еще находится в инстанции.
  • Это не стандартное поведение, поэтому инструменты, предназначенные для поиска артефактов ограничений в журналах, вероятно, не найдут их.

Вот снимок экрана примера правила, реализованного в виде подпрограммы spin: constructor:

Другие вопросы по тегам