Skip to content

Chained conditional logic

What this is

Compose ordered conditional rules where downstream outputs depend on upstream inferred results.

When to use it

Use chained conditional logic when business reasoning requires multi-step context:

  • stage 1 creates an inferred state
  • stage 2 consumes stage 1 output and creates a consequent output
  • lineage must be preserved for explainability (dqs:causedBy)

Use this for advanced triage, escalation, and multi-step industrial decision logic.

Industrial examples

  • Rule 1 infers CompletedStatus from source status fields.
  • Rule 2 depends on Rule 1 and infers CompletedMissingEndTime if end time is absent.
  • Rule 3 consumes prior inference outputs to emit an escalation classification for operations.
  • Downstream records retain lineage via dqs:causedBy for explainability.

Example (SHACL-AF chained rules)

@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix dqs: <http://purl.org/cognite/dqs#> .
@prefix ex: <https://example.com/dm/> .

ex:WorkOrderChainedRules
    a sh:NodeShape ;
    sh:targetClass ex:WorkOrder ;
    sh:rule [
        a sh:SPARQLRule ;
        sh:order 1 ;
        dqs:ruleId "CompletedStatusTag" ;
        sh:construct """
            CONSTRUCT {
                ?r1 a dqs:RuleEngineResult ;
                    dqs:focusNode $this ;
                    dqs:ruleId "CompletedStatusTag" ;
                    dqs:resultType "Inference" ;
                    dqs:resultValue "CompletedStatus" .
            }
            WHERE {
                $this ex:status "Completed" .
                BIND(IRI(CONCAT("urn:result:completed-status:", ENCODE_FOR_URI(STR($this)))) AS ?r1)
            }
        """ ;
    ] ;
    sh:rule [
        a sh:SPARQLRule ;
        sh:order 2 ;
        dqs:ruleId "CompletedMissingEndTime" ;
        dqs:dependsOn "CompletedStatusTag" ;
        sh:construct """
            CONSTRUCT {
                ?r2 a dqs:RuleEngineResult ;
                    dqs:focusNode $this ;
                    dqs:ruleId "CompletedMissingEndTime" ;
                    dqs:resultType "Inference" ;
                    dqs:causedBy ?r1 .
            }
            WHERE {
                ?r1 a dqs:RuleEngineResult ;
                    dqs:focusNode $this ;
                    dqs:ruleId "CompletedStatusTag" .
                FILTER NOT EXISTS { $this ex:endTime ?endTime }
                BIND(IRI(CONCAT("urn:result:completed-missing-endtime:", ENCODE_FOR_URI(STR($this)))) AS ?r2)
            }
        """ ;
    ] .

Previous section

Next section