我使用TopBraid Composer免费版(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) .
}
因此,我使用以下SPARQL更新查询在RDF4J工作台中测试此约束:
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的探索和使用SPARQL查询的预期三元组。例如,在断言我的错误CRO2:SignalRate
后,以下查询不返回任何内容:
PREFIX spin: <http://spinrdf.org/spin#>
SELECT DISTINCT *
WHERE {
?s spin:violationRoot ?o .
}
在TopBraid Composer FE和RDF4J Workbench中声明这种行为是一致的。
我的目标是查找并使用在SPIN约束违规情况下声明的诊断消息,最好是使用SPARQL查询来查找此类诊断。似乎合理。我错过了什么。
感谢。
答案 0 :(得分:2)
简短的回答:你不能。
SPIN约束旨在检测违规并报告它们。在RDF4J中,该报告机制是日志。
SPIN规范的相关部分(http://spinrdf.org/spin.html#spin-constraints):
[...]如果一个ASK约束的计算结果为真 例如,实例违反了条件。 (可选) CONSTRUCT查询可以创建spin的实例:ConstraintViolation 提供有关特定违规行为的详细信息的类。
请注意,推理者无需对基于CONSTRUCT的约束产生的数据执行任何操作 - 它仅用于可选的“附加信息”。
或许值得一看,如果我们可以为推理者添加一个增强功能,以一种或另一种形式报告此类三元组,但在当前系统中,只有SPIN 规则(使用DELETE / INSERT等)修改数据库。
答案 1 :(得分:1)
所以,按照上面的@JeenBroekstra评论和我的回复评论,我已经转而使用构造函数,以便错误信息仍然是可见的工件。我已经创建了几个我自己的spin:constructor的子属性,以便保持秩序。我还指定了这些构造函数的执行顺序,以便这些检查在可能被触发的其他规则之前运行(例如,通过负信号速率)。
这种方法的优点:
hasConstraintViolation
属性,而不仅仅是阻止实例化的第一次违规。这种方法的缺点:
以下是作为spin的子属性实现的示例规则的屏幕截图:构造函数: