1

我有一个应用程序,其中我使用 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 形状应用于目标类的新个体? 在我的应用程序中,个人会随着时间的推移而积累,并且可能会变得非常多。我担心重复运行形状对相同的、旧的、未改变的个体的计算负载会变得很重要。

4

2 回答 2

3

解决您的问题的一种可能方法是使用“第三方”关系来标记已被规则处理的个人,并在规则引用的 sh:condition 中使用此类标记。

你会得到类似的东西:

:MyCondition
    a sh:NodeShape ;
    rdfs:comment "The condition preventing re-application of the rule";
    sh:targetClass :MyClass ;
    sh:sparql [
        sh:select """
        PREFIX : <http://example.com/ns#>
        PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
        SELECT $this
        WHERE {
            # Here, the $this will be the focus node of the target class
            $this :hasMarking "true"^^xsd:boolean.
        }
        """;
    ].

:MyRule
    a sh:NodeShape ;
    rdfs:comment "The rule should be applied only once";
    sh:targetClass :MyClass ;
    sh:rule [
        a sh:SPARQLRule ;
        sh:condition :MyCondition ;
        sh:construct """
            PREFIX : <http://example.com/ns#>

            CONSTRUCT {
                $this :hasMarking "true"^^xsd:boolean.
            } WHERE {
                $this :property :object.
                # Here, the body of the rule
                # ...
            }
        """;
    ].

在这种情况下,标记基于一个简单的布尔属性,但它也可能基于规则体捕获的更有用的信息,并且代表规则结果,即$this :property :Objectproperty由您的规则推断的位置。

于 2019-03-01T14:35:39.870 回答
2

“新个体”的概念听起来是特定于应用程序的,并且取决于执行逻辑。没有人强迫任何人使用 sh:targetClass 也不需要一直运行所有规则。您可以在 API 级别进行控制。除了 sh:targetClass,您可以使用您选择的一些其他属性,例如 ex:constructedClass,并实现一个基于 Java 的函数,该函数将新实例作为输入并按照该属性查找所有适用的形状。如果您认为这里有一个通用模式,我们可以将它们添加到事实上的扩展命名空间,例如 dash:

于 2018-08-14T23:18:10.297 回答