Выполнение правила 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:

Другие вопросы по тегам