Linked.Archi ArchiMate 3.2 Derivation Rules
SHACL Rules (sh:SPARQLRule) implementing ArchiMate derivation rules DR1-DR8 (valid) and PDR1-PDR12 (potential) from the ArchiMate 3.2 specification Appendix B. Derived relationships are annotated with confidence level and provenance via RDF 1.2 reification.
Linked.Archi
confidence
Confidence level of a derived relationship: valid, potential, or suggestion.
derived via
Name of the derivation rule that produced this relationship.
derived from
Source relationship(s) that led to this derivation.
structural strength
dependency strength
DR1: Specialization Transitivity
CONSTRUCT { $this am:specializes ?c . <<$this am:specializes ?c>> :confidence "valid" ; :derivedVia "DR1: specialization transitivity" . } WHERE { $this am:specializes ?b . ?b am:specializes ?c . FILTER($this != ?c) FILTER NOT EXISTS { $this am:specializes ?c } }
DR2: Structural Relationship Chain
CONSTRUCT { $this am:realizes ?c . <<$this am:realizes ?c>> :confidence "valid" ; :derivedVia "DR2: structural chain (result: realization)" . } WHERE { $this ?rel1 ?b . ?b ?rel2 ?c . ?rel1 :structuralStrength ?s1 . ?rel2 :structuralStrength ?s2 . BIND(IF(?s1 <= ?s2, ?s1, ?s2) AS ?minS) FILTER(?minS = 1) FILTER($this != ?c) FILTER NOT EXISTS { $this am:realizes ?c } }
DR2: Structural Chain → Assignment
CONSTRUCT { $this am:assignedTo ?c . <<$this am:assignedTo ?c>> :confidence "valid" ; :derivedVia "DR2: structural chain (result: assignment)" . } WHERE { $this ?rel1 ?b . ?b ?rel2 ?c . ?rel1 :structuralStrength ?s1 . ?rel2 :structuralStrength ?s2 . BIND(IF(?s1 <= ?s2, ?s1, ?s2) AS ?minS) FILTER(?minS = 2) FILTER($this != ?c) FILTER NOT EXISTS { $this am:assignedTo ?c } }
DR2: Structural Chain → Aggregation
CONSTRUCT { $this am:aggregates ?c . <<$this am:aggregates ?c>> :confidence "valid" ; :derivedVia "DR2: structural chain (result: aggregation)" . } WHERE { $this ?rel1 ?b . ?b ?rel2 ?c . ?rel1 :structuralStrength ?s1 . ?rel2 :structuralStrength ?s2 . BIND(IF(?s1 <= ?s2, ?s1, ?s2) AS ?minS) FILTER(?minS = 3) FILTER($this != ?c) FILTER NOT EXISTS { $this am:aggregates ?c } }
DR2: Structural Chain → Composition
CONSTRUCT { $this am:composedOf ?c . <<$this am:composedOf ?c>> :confidence "valid" ; :derivedVia "DR2: structural chain (result: composition)" . } WHERE { $this ?rel1 ?b . ?b ?rel2 ?c . ?rel1 :structuralStrength ?s1 . ?rel2 :structuralStrength ?s2 . BIND(IF(?s1 <= ?s2, ?s1, ?s2) AS ?minS) FILTER(?minS = 4) FILTER($this != ?c) FILTER NOT EXISTS { $this am:composedOf ?c } }
DR3: Structural + Dependency → Dependency
CONSTRUCT { $this ?depRel ?c . <<$this ?depRel ?c>> :confidence "valid" ; :derivedVia "DR3: structural + dependency" . } WHERE { $this ?structRel ?b . ?b ?depRel ?c . ?structRel :structuralStrength ?ss . ?depRel :dependencyStrength ?ds . FILTER($this != ?c) FILTER NOT EXISTS { $this ?depRel ?c } }
DR4: Opposing Structural + Dependency → Dependency
CONSTRUCT { ?c ?depRel $this . <<?c ?depRel $this>> :confidence "valid" ; :derivedVia "DR4: opposing structural + dependency" . } WHERE { $this ?structRel ?b . ?c ?depRel ?b . ?structRel :structuralStrength ?ss . ?depRel :dependencyStrength ?ds . FILTER($this != ?c) FILTER NOT EXISTS { ?c ?depRel $this } }
DR5: Structural + Dynamic → Triggering
CONSTRUCT { $this am:triggers ?c . <<$this am:triggers ?c>> :confidence "valid" ; :derivedVia "DR5: structural + triggering" . } WHERE { $this ?structRel ?b . ?b am:triggers ?c . ?structRel :structuralStrength ?ss . FILTER($this != ?c) FILTER NOT EXISTS { $this am:triggers ?c } }
DR5: Structural + Dynamic → Flow
CONSTRUCT { $this am:flowsTo ?c . <<$this am:flowsTo ?c>> :confidence "valid" ; :derivedVia "DR5: structural + flow" . } WHERE { $this ?structRel ?b . ?b am:flowsTo ?c . ?structRel :structuralStrength ?ss . FILTER($this != ?c) FILTER NOT EXISTS { $this am:flowsTo ?c } }
DR6: Structural + Flow (opposite) → Flow
CONSTRUCT { ?c am:flowsTo $this . <<?c am:flowsTo $this>> :confidence "valid" ; :derivedVia "DR6: structural + flow (opposite)" . } WHERE { $this ?structRel ?b . ?c am:flowsTo ?b . ?structRel :structuralStrength ?ss . FILTER($this != ?c) FILTER NOT EXISTS { ?c am:flowsTo $this } }
DR7: Triggering + Structural → Triggering
CONSTRUCT { ?a am:triggers $this . <<?a am:triggers $this>> :confidence "valid" ; :derivedVia "DR7: triggering + structural" . } WHERE { ?a am:triggers ?b . ?b ?structRel $this . ?structRel :structuralStrength ?ss . FILTER(?a != $this) FILTER NOT EXISTS { ?a am:triggers $this } }
DR8: Triggering Transitivity
CONSTRUCT { $this am:triggers ?c . <<$this am:triggers ?c>> :confidence "valid" ; :derivedVia "DR8: triggering transitivity" . } WHERE { $this am:triggers ?b . ?b am:triggers ?c . FILTER($this != ?c) FILTER NOT EXISTS { $this am:triggers ?c } }
PDR1: Specialization Inheritance (Forward)
CONSTRUCT { $this ?rel ?c . <<$this ?rel ?c>> :confidence "potential" ; :derivedVia "PDR1: specialization inheritance (forward)" . } WHERE { $this am:specializes ?b . ?b ?rel ?c . { ?rel :structuralStrength ?s } UNION { ?rel :dependencyStrength ?s } UNION { FILTER(?rel IN (am:triggers, am:flowsTo)) } FILTER($this != ?c) FILTER NOT EXISTS { $this ?rel ?c } }
PDR2: Specialization Inheritance (Reverse)
CONSTRUCT { ?c ?rel $this . <<?c ?rel $this>> :confidence "potential" ; :derivedVia "PDR2: specialization inheritance (reverse)" . } WHERE { $this am:specializes ?b . ?c ?rel ?b . { ?rel :structuralStrength ?s } UNION { ?rel :dependencyStrength ?s } UNION { FILTER(?rel IN (am:triggers, am:flowsTo)) } FILTER(?c != $this) FILTER NOT EXISTS { ?c ?rel $this } }
PDR3: Specialization Source Inheritance
CONSTRUCT { ?b ?rel ?c . <<?b ?rel ?c>> :confidence "potential" ; :derivedVia "PDR3: specialization source inheritance" . } WHERE { $this am:specializes ?b . $this ?rel ?c . { ?rel :structuralStrength ?s } UNION { ?rel :dependencyStrength ?s } UNION { FILTER(?rel IN (am:triggers, am:flowsTo)) } FILTER(?b != ?c) FILTER NOT EXISTS { ?b ?rel ?c } }
PDR4: Specialization Target Inheritance
CONSTRUCT { ?c ?rel ?b . <<?c ?rel ?b>> :confidence "potential" ; :derivedVia "PDR4: specialization target inheritance" . } WHERE { $this am:specializes ?b . ?c ?rel $this . { ?rel :structuralStrength ?s } UNION { ?rel :dependencyStrength ?s } UNION { FILTER(?rel IN (am:triggers, am:flowsTo)) } FILTER(?c != ?b) FILTER NOT EXISTS { ?c ?rel ?b } }
PDR5: Structural + Dependency (at source)
CONSTRUCT { ?c ?depRel ?b . <<?c ?depRel ?b>> :confidence "potential" ; :derivedVia "PDR5: structural + dependency (at source)" . } WHERE { $this ?structRel ?b . ?c ?depRel $this . ?structRel :structuralStrength ?ss . ?depRel :dependencyStrength ?ds . FILTER(?c != ?b) FILTER NOT EXISTS { ?c ?depRel ?b } }
PDR6: Structural + Dependency (from source)
CONSTRUCT { ?b ?depRel ?c . <<?b ?depRel ?c>> :confidence "potential" ; :derivedVia "PDR6: structural + dependency (from source)" . } WHERE { $this ?structRel ?b . $this ?depRel ?c . ?structRel :structuralStrength ?ss . ?depRel :dependencyStrength ?ds . FILTER(?b != ?c) FILTER NOT EXISTS { ?b ?depRel ?c } }
PDR7: Dependency Chain → Weakest
CONSTRUCT { $this am:associatedWith ?c . <<$this am:associatedWith ?c>> :confidence "potential" ; :derivedVia "PDR7: dependency chain (result: association — weakest)" . } WHERE { $this ?rel1 ?b . ?b ?rel2 ?c . ?rel1 :dependencyStrength ?d1 . ?rel2 :dependencyStrength ?d2 . BIND(IF(?d1 <= ?d2, ?d1, ?d2) AS ?minD) FILTER(?minD = 1) FILTER($this != ?c) FILTER NOT EXISTS { $this am:associatedWith ?c } }
PDR7: Dependency Chain → Influence
CONSTRUCT { $this am:influences ?c . <<$this am:influences ?c>> :confidence "potential" ; :derivedVia "PDR7: dependency chain (result: influence)" . } WHERE { $this ?rel1 ?b . ?b ?rel2 ?c . ?rel1 :dependencyStrength ?d1 . ?rel2 :dependencyStrength ?d2 . BIND(IF(?d1 <= ?d2, ?d1, ?d2) AS ?minD) FILTER(?minD = 2) FILTER($this != ?c) FILTER NOT EXISTS { $this am:influences ?c } }
PDR7: Dependency Chain → Access
CONSTRUCT { $this am:accesses ?c . <<$this am:accesses ?c>> :confidence "potential" ; :derivedVia "PDR7: dependency chain (result: access)" . } WHERE { $this ?rel1 ?b . ?b ?rel2 ?c . ?rel1 :dependencyStrength ?d1 . ?rel2 :dependencyStrength ?d2 . BIND(IF(?d1 <= ?d2, ?d1, ?d2) AS ?minD) FILTER(?minD = 3) FILTER($this != ?c) FILTER NOT EXISTS { $this am:accesses ?c } }
PDR7: Dependency Chain → Serving
CONSTRUCT { $this am:serves ?c . <<$this am:serves ?c>> :confidence "potential" ; :derivedVia "PDR7: dependency chain (result: serving)" . } WHERE { $this ?rel1 ?b . ?b ?rel2 ?c . ?rel1 :dependencyStrength ?d1 . ?rel2 :dependencyStrength ?d2 . BIND(IF(?d1 <= ?d2, ?d1, ?d2) AS ?minD) FILTER(?minD = 4) FILTER($this != ?c) FILTER NOT EXISTS { $this am:serves ?c } }
PDR8: Flow + Structural → Flow
CONSTRUCT { $this am:flowsTo ?c . <<$this am:flowsTo ?c>> :confidence "potential" ; :derivedVia "PDR8: flow + structural" . } WHERE { $this am:flowsTo ?b . ?b ?structRel ?c . ?structRel :structuralStrength ?ss . FILTER($this != ?c) FILTER NOT EXISTS { $this am:flowsTo ?c } }
PDR9: Structural + Triggering (reverse)
CONSTRUCT { ?b am:triggers ?c . <<?b am:triggers ?c>> :confidence "potential" ; :derivedVia "PDR9: structural + triggering (reverse)" . } WHERE { $this ?structRel ?b . $this am:triggers ?c . ?structRel :structuralStrength ?ss . FILTER(?b != ?c) FILTER NOT EXISTS { ?b am:triggers ?c } }
PDR9: Structural + Flow (reverse)
CONSTRUCT { ?b am:flowsTo ?c . <<?b am:flowsTo ?c>> :confidence "potential" ; :derivedVia "PDR9: structural + flow (reverse)" . } WHERE { $this ?structRel ?b . $this am:flowsTo ?c . ?structRel :structuralStrength ?ss . FILTER(?b != ?c) FILTER NOT EXISTS { ?b am:flowsTo ?c } }
PDR10: Flow Transitivity
CONSTRUCT { $this am:flowsTo ?c . <<$this am:flowsTo ?c>> :confidence "potential" ; :derivedVia "PDR10: flow transitivity" . } WHERE { $this am:flowsTo ?b . ?b am:flowsTo ?c . FILTER($this != ?c) FILTER NOT EXISTS { $this am:flowsTo ?c } }
PDR11: Triggering + Structural (reverse)
CONSTRUCT { $this am:triggers ?c . <<$this am:triggers ?c>> :confidence "potential" ; :derivedVia "PDR11: triggering + structural (reverse)" . } WHERE { $this am:triggers ?b . ?c ?structRel ?b . ?structRel :structuralStrength ?ss . FILTER($this != ?c) FILTER NOT EXISTS { $this am:triggers ?c } }
PDR12: Grouping Element Derivation
CONSTRUCT { ?member ?targetRel ?c . <<?member ?targetRel ?c>> :confidence "potential" ; :derivedVia "PDR12: grouping element derivation" . } WHERE { { $this am:aggregates ?member . } UNION { $this am:composedOf ?member . } { $this am:realizes ?c . BIND(am:realizes AS ?targetRel) } UNION { $this am:assignedTo ?c . BIND(am:assignedTo AS ?targetRel) } FILTER(?member != ?c) FILTER NOT EXISTS { ?member ?targetRel ?c } }