![](/img/trans.png)
[英]SHACL with Jena, how to get the Model after SPARQL CONSTRUCT from the shape?
[英]SHACL Rule Execution on New Instances?
我有一個應用程序,其中我使用SPIN構造函數作為實現事件/條件/動作(ECA)策略的手段。 ECA是政策的一種經典構造。 在這種情況下,事件始終是在某個個體上聲明一個類,這導致該類的SPIN構造函數在該新個體上運行。 條件是在我的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形狀僅應用於目標類別的新個人? 在我的應用程序中,個體會隨着時間的推移而積累,並且可能會變得非常多。 我擔心,針對相同的,老的,不變的個人反復運行形狀的計算量會變得很大。
解決問題的一種可能方法是使用“第三方”關系標記已被規則處理的個人,並在規則引用的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
僅根據您的規則推斷。
“新個人”的概念聽起來是特定於應用程序的,並且取決於執行邏輯。 沒有人會強迫任何人使用sh:targetClass,也不需要一直運行所有規則。 您可以在API級別上進行控制。 除了sh:targetClass之外,您還可以使用其他選擇的屬性,例如ex:constructedClass,並實現一個基於Java的函數,該函數將新實例作為輸入並跟隨該屬性查找所有適用的形狀。 如果您認為這里有一個通用模式,可以將它們添加到事實上的擴展名稱空間中,例如破折號:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.