我有一个应用程序,其中我使用自旋构造函数作为实现事件/条件/动作(ECA)策略的手段。非洲经委会是一种典型的政策结构。在本例中,事件始终是个体上的类断言,这导致该类的自旋构造器在新个体上运行。条件是我的SPARQL WHERE子句中表示的模式,该操作是由SPARQL CONSTRUCT子句中的断言提供的。我的理解是,自旋构造函数只能在类的新个体上运行,而不是在类的所有个体上运行。
我现在正在寻找SHACL作为SPIN的接班人。我正在开发TopBraid作曲家大师版,我可以使用Jena实现。
假设我将ECA策略表示为SHACL形状,并通过sh:targetClass SHACL谓词以类为目标。假设我的目标类是family:Person。每次我断言一个新的family:Person个人时,我都希望只在这个新个体上运行自己的ECA策略(表示为SHACL形状)。我知道侦听器可以用来感知新的类成员。我还知道,一旦检测到更改,就可以使用诸如RuleUtil.executeRules()这样的方法在所有目标节点上执行所有规则(在我的示例中,family:Person类的个体)。但是,是否有一种方法可以将SHACL形状应用于 only --目标类的新个体?--在我的应用程序中,个人将随着时间的推移而累积,并且可能会变得相当多。我担心的是,重复运行形状对相同的、老的、未改变的个体的计算负荷将变得非常重要。
发布于 2019-03-01 14:35:39
解决问题的一个可能方法是使用“第三方”关系来标记规则处理过的个人,并在规则引用的sh:条件中使用这样的标记。
你会得到这样的东西:
: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仅由规则推断。
发布于 2018-08-14 23:18:10
“新个体”的概念听起来是特定于应用程序的,取决于执行逻辑。没有人强迫任何人使用sh: the类,也不需要一直运行所有规则。您可以在API级别上控制这一点。您可以使用其他属性(如ex:constructedClass )代替sh: takes类,并实现一个基于Java的函数,该函数将新实例作为输入,并遵循该属性查找所有适用的形状。如果您认为这里有一个通用模式,我们可以将它们添加到一个事实上的扩展命名空间中,如dash:
https://stackoverflow.com/questions/51833104
复制相似问题