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
CompletedStatusfrom source status fields. - Rule 2 depends on Rule 1 and infers
CompletedMissingEndTimeif end time is absent. - Rule 3 consumes prior inference outputs to emit an escalation classification for operations.
- Downstream records retain lineage via
dqs:causedByfor 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)
}
""" ;
] .