使用CONSTRUCT的SPIN约束:CONSTRUCT的三元组在哪里?

时间:2016-11-30 15:34:00

标签: sparql owl rdf4j topbraid-composer spin-rdf

我使用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查询来查找此类诊断。似乎合理。我错过了什么。

感谢。

2 个答案:

答案 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的子属性,以便保持秩序。我还指定了这些构造函数的执行顺序,以便这些检查在可能被触发的其他规则之前运行(例如,通过负信号速率)。

这种方法的优点:

  • 错误详细信息工件(例如spin:violationRoot)在三元组存储中仍然可见。这在涉及机器到机器的应用程序中非常重要。
  • 所有合规性检查都已完成,因此具有多个问题的个人将所有问题列为单独的hasConstraintViolation属性,而不仅仅是阻止实例化的第一次违规。

这种方法的缺点:

  • 错误的个人仍然被实例化。
  • 这不是标准行为,因此适合在日志中查找约束工件的工具可能无法找到它们。

以下是作为spin的子属性实现的示例规则的屏幕截图:构造函数:

enter image description here