Выполнение правила SHACL для новых экземпляров?
У меня есть приложение, в котором я использовал конструкторы SPIN как средство для реализации политик событий / условий / действий (ECA). ЭКА является одним из классических конструктов для политики. Событие в данном случае всегда было утверждением о классе индивида, что заставляло конструкторы SPIN этого класса работать с этим новым индивидом. Условие было шаблоном, выраженным в моем SPARQL WHERE
пункт, и Действие было предоставлено утверждениями в SPARQL CONSTRUCT
пункт. Насколько я понимаю, конструктор SPIN будет работать только с новым человеком в классе, а не со всеми людьми в классе.
Сейчас я смотрю на переход на SHACL в качестве преемника SPIN. Я занимаюсь разработкой в TopBraid Composer Maestro Edition, и я мог бы реализовать его с помощью Jena SHACL API.
Предположим, что я выражаю политику ECA в форме SHACL и нацеливаю класс на sh:targetClass
Предикат SHACL. Допустим, мой целевой класс family:Person
, Каждый раз, когда я утверждаю новый family:Person
Я хотел бы применить свою политику ECA (выраженную в форме SHACL) только для этого нового человека. Я знаю, что слушатель может быть использован, чтобы почувствовать новое членство в классе. Я также знаю, что такие методы, как RuleUtil.executeRules()
может использоваться после определения изменения для выполнения всех правил на всех целевых узлах (отдельных family:Person
класс, в моем примере). Но есть ли способ применить формы SHACL только к новым лицам целевого класса? В моем заявлении люди будут накапливаться со временем и могут стать довольно многочисленными. Я обеспокоен тем, что вычислительная нагрузка на беговые фигуры, повторяющиеся по отношению к одним и тем же, старым, неизменным личностям, станет значительной.
1 ответ
Возможный способ решения вашей проблемы - использовать стороннее отношение, чтобы пометить лиц, обработанных правилом, и использовать такую маркировку в состоянии 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: builtClass, и реализовать функцию на основе Java, которая принимает новые экземпляры в качестве входных данных и следует за свойством, чтобы найти все применимые фигуры. Если вы думаете, что здесь есть общий шаблон, мы могли бы добавить его в пространство имен расширения де-факто, такое как dash: