我有一个应用程序,其中我使用 SPIN 构造函数作为实现事件/条件/操作 (ECA) 策略的手段。ECA 是一种经典的策略构造。在这种情况下,事件始终是一个类对个体的断言,它导致该类的 SPIN 构造函数在该新个体上运行。Condition 是在我的 SPARQLWHERE
子句中表达的模式,而 Action 是由 SPARQLCONSTRUCT
子句中的断言提供的。我的理解是 SPIN 构造函数只会在类的新个体上运行,而不是在类的所有个体上运行。
我现在正在考虑切换到 SHACL 作为 SPIN 的继任者。我正在 TopBraid Composer Maestro Edition 中开发,我可以使用 Jena SHACL API 来实现。
假设我将 ECA 策略表示为 SHACL 形状并通过sh:targetClass
SHACL 谓词定位一个类。假设我的目标类是family:Person
. 每次我断言一个新family:Person
个体时,我都想只对那个新个体运行我的 ECA 策略(表示为 SHACL 形状)。我知道可以使用侦听器来感知新的班级成员资格。我也知道,RuleUtil.executeRules()
一旦感知到更改,就可以使用诸如此类的方法来执行所有目标节点(family:Person
在我的示例中为类的个人)上的所有规则。但是,有没有办法将 SHACL 形状仅应用于目标类的新个体? 在我的应用程序中,个人会随着时间的推移而积累,并且可能会变得非常多。我担心重复运行形状对相同的、旧的、未改变的个体的计算负载会变得很重要。