【问题标题】:SPIN constraint using CONSTRUCT: where do the CONSTRUCT's triples go?使用 CONSTRUCT 的 SPIN 约束:CONSTRUCT 的三元组在哪里?
【发布时间】:2016-11-30 15:34:00
【问题描述】:

我正在使用 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 的 Explore 和使用 SPARQL 查询来寻找预期的三元组。例如,在我断言错误的CRO2:SignalRate 后,以下查询不返回任何内容:

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

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

这种行为在 TopBraid Composer FE 和 RDF4J Workbench 中的断言是一致的。

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    简短的回答:你不能。

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

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

    [...] 如果一个 ASK 约束的计算结果为真 实例,则实例违反条件。可选地, CONSTRUCT 查询可以创建自旋的实例:ConstraintViolation 提供有关特定违规行为的详细信息的类。

    请注意,推理器不需要对基于 CONSTRUCT 的约束产生的数据执行任何操作 - 它仅用于可选的“附加信息”。

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

    【讨论】:

    • 好的,我可以切换到将我的约束实现为构造函数。我过去曾这样做过。当关联类被断言时,构造函数被调用,当构造函数被触发时,它们的断言确实使它进入可见的三元存储——对后续查询可见。缺点是严重错误不会像 spin:Fatal 或 spin:Error with constraint 那样阻止类的断言。我必须仔细考虑如何保护后续规则免受不良数据(例如负 CRO2:SignalRate)的影响。 DELETE 可能是解决方案的核心。
    • @GregCox 我在想之前就提到了这一点,但不要羞于用 RDF4J 记录功能请求。 SPIN 推理器正式仍处于测试阶段,我们在做出设计选择时肯定会忽略用例。
    【解决方案2】:

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

    这种方法的优点:

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

    这种方法的缺点:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2013-07-25
      • 2016-02-02
      • 1970-01-01
      • 2014-02-23
      相关资源
      最近更新 更多