使用 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 的子属性实施的示例规则的屏幕截图:
我正在使用 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 的子属性实施的示例规则的屏幕截图: