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