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

SPIN constraint using CONSTRUCT: where do the CONSTRUCT's triples go?

我正在使用 TopBraid Composer 免费版 (5.1.3) 创建包括 SPIN 约束的本体。然后我将生成的 RDF 文件加载到 RDF4J (2.0.1) 中并使用 RDF4J Workbench 进行测试。

我正在研究 SPIN 约束。这是一个检查我添加到 CRO2:SignalRate class:

的非负信号率的示例
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 workbench 中测试此约束:

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 三元组是否在其他 context/graph 中声明?我只是对所有内容使用 default/graph。

我正在使用 RDF4J Workbench 的探索和使用 SPARQL 查询寻找预期的三元组。例如,以下查询 returns nothing after I assert my errant CRO2:SignalRate:

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

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

此行为在 TopBraid Composer FE 和 RDF4J 断言之间是一致的 Workbench。

我的目标是查找并使用在违反 SPIN 约束的情况下断言的诊断消息,最好使用 SPARQL 查询来查找此类诊断。似乎有道理。我错过了一些东西。

谢谢。

简短的回答:你不能。

SPIN 约束旨在检测违规行为并进行报告。在 RDF4J 中,该报告机制就是日志。

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

[...] if an ASK constraint evaluates to true for one instance, then the instance violates the condition. Optionally, CONSTRUCT queries can create instances of a spin:ConstraintViolation class that provide details on a specific violation.

请注意,不要求推理器对基于 CONSTRUCT 的约束生成的数据执行任何操作 - 它仅用于可选 "additional information"。

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

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

这种方法的优点:

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

这种方法的缺点:

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

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