Я использую 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 в каком-то другом контексте/графе? Я просто использую график по умолчанию для всего.
Я ищу ожидаемые тройки как с помощью RDF4J Workbench Explore, так и с использованием запросов SPARQL. Например, следующий запрос ничего не возвращает после подтверждения моего ошибочного CRO2:SignalRate
:
PREFIX spin: <http://spinrdf.org/spin#>
SELECT DISTINCT *
WHERE {
?s spin:violationRoot ?o .
}
Это поведение соответствует утверждению в TopBraid Composer FE и RDF4J Workbench.
Моя цель — найти и использовать диагностические сообщения, выдаваемые в случае нарушения ограничений SPIN, желательно с помощью запросов SPARQL для поиска таких диагностических сообщений. Кажется разумным. Я что-то упускаю.
Спасибо.