1

我正在使用 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三元组并允许它默认为 a spin:Error,那么我会从查询中收到一条错误消息,并且不会像预期的那样断言测试实例。如图所示执行时,违反约束是 a 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 查询来查找此类诊断。似乎有道理。我错过了一些东西。

谢谢。

4

2 回答 2

2

简短的回答:你不能。

SPIN 约束旨在检测违规并报告它们。在 RDF4J 中,这种报告机制就是日志。

SPIN 规范的相关部分(http://spinrdf.org/spin.html#spin-constraints):

[...] 如果一个实例的 ASK 约束评估为真,则该实例违反了条件。或者,CONSTRUCT 查询可以创建 spin:ConstraintViolation 类的实例,该类提供特定违规的详细信息。

请注意,推理器不需要对基于 CONSTRUCT 的约束产生的数据做任何事情——它只是用于可选的“附加信息”。

也许值得看看我们是否可以对推理器添加增强功能以​​以一种或另一种形式报告此类三元组,但在当前系统中,只有 SPIN规则(使用 DELETE/INSERT 等)修改数据库。

于 2016-12-01T06:19:52.787 回答
1

因此,在@JeenBroekstra 评论和我上面的回复评论之后,我已经切换到使用构造函数,以便错误信息保持为可见工件。我已经创建了一些我自己的 spin:constructor 子属性,以保持事物的有序性。我还指定了这些构造函数的执行顺序,以便这些检查在其他可能被触发的规则之前运行(例如,通过负信号率)。

这种方法的优点:

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

这种方法的缺点:

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

这是作为 spin:constructor 的子属性实现的示例规则的屏幕截图:

在此处输入图像描述

于 2016-12-02T13:00:13.110 回答