【问题标题】:SHACL Rule Execution on New Instances?对新实例执行 SHACL 规则?
【发布时间】:2018-08-14 02:58:48
【问题描述】:

我有一个应用程序,其中我使用 SPIN 构造函数作为实现事件/条件/操作 (ECA) 策略的一种手段。 ECA 是一种经典的策略构造。在这种情况下,事件始终是一个类对个体的断言,它导致该类的 SPIN 构造函数在该新个体上运行。 Condition 是我的 SPARQL WHERE 子句中表达的模式,而 Action 是由 SPARQL CONSTRUCT 子句中的断言提供的。我的理解是 SPIN 构造函数只会在类的新个体上运行,而不是在类的所有个体上运行。

我现在正在考虑切换到 SHACL 作为 SPIN 的继任者。我正在使用 TopBraid Composer Maestro Edition 进行开发,我可以使用 Jena SHACL API 来实现。

假设我将 ECA 策略表示为 SHACL 形状并通过 sh:targetClass SHACL 谓词定位一个类。假设我的目标类是family:Person。每次我断言一个新的 family:Person 个人时,我想对那个新个人运行我的 ECA 策略(表示为 SHACL 形状)。我知道可以使用侦听器来感知新的班级成员资格。我还知道,一旦感应到更改以在所有目标节点上执行所有规则(在我的示例中为 family:Person 类的个人),就可以使用诸如 RuleUtil.executeRules() 之类的方法。但是,有没有办法将 SHACL 形状应用到目标类的新个体?在我的应用程序中,个体会随着时间的推移而积累,并且可能会变得相当多。我担心重复运行形状对相同的、旧的、未改变的个体的计算负载会变得很重要。

【问题讨论】:

    标签: jena topbraid-composer shacl


    【解决方案1】:

    解决您的问题的一种可能方法是使用“第三方”关系来标记已被规则处理的个人,并在规则引用的 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 :Object,其中property仅由您的规则推断。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 更仔细地查看 RuleUtil.executeRules 方法,我看到了一个替代方法签名,它将 RDFNode focusNode 作为其第一个参数。似乎如果我可以让我的听众产生新的个体,那么我可以使用 executeRules(RDFNode focusNode, Model shapesModel, Model inferencesModel, ProgressMonitor monitor) 签名来仅针对我的新实例。这听起来可行吗?如果是这样,那么我可能会尝试按照这些思路编写我自己问题的答案并将其发布。
      • 是的,正确。如果 RuleUtil 方法不够灵活(它们最终只是实用程序),您可以绕过它们并直接进入 RuleEngine API。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      相关资源
      最近更新 更多