@prefix : <#> .
@prefix gsm: <http://purl.org/gsm/vocab#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix sparql-result: <http://www.w3.org/2005/sparql-results#> .
@prefix sp: <http://spinrdf.org/sp#> .
@prefix http: <http://www.w3.org/2011/http#>.
@prefix http_m: <http://www.w3.org/2011/http-methods#>.
@prefix ex: <http://example.org/#> .

# Nasty Hack: The Always True Sentry
ex:always ex:true ex:sentry .

# Workflow
:CamundaWorkflowStageModel
    a gsm:Stage ;
    gsm:hasMilestone :M0 ;
    gsm:hasChildStage 
        :S1 ,
        :S2 ,
        :S3 ,
        :S4 ,
        :S5 ,
        :S6 ,
        :S7 ,
        :S8 .


# Guards
:G1 
    a gsm:Guard ;
    gsm:hasCondition [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasUnachievedMilestone :M1 
        ])
    ] .

:G2 
    a gsm:Guard ;
    gsm:hasCondition [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M1 
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasUnachievedMilestone :M2
        ])
    ] .

:G3 
    a gsm:Guard ;
    gsm:hasCondition [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasUnachievedMilestone :M8
        ])
    ] .

:G4 
    a gsm:Guard ;
    gsm:hasCondition [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M1 
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasUnachievedMilestone :M3
        ])
    ] .

:G5 
    a gsm:Guard ;
    gsm:hasCondition [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M3
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasUnachievedMilestone :M5
        ])
    ] .

:G6 
    a gsm:Guard ;
    gsm:hasCondition [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M3
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasUnachievedMilestone :M6
        ] [
            sp:subject <http://example.org/devices#device2> ;
            sp:predicate rdf:type ;
            sp:object <http://www.w3.org/ns/ssn/System>
        ])
    ] .

:G7 
    a gsm:Guard ;
    gsm:hasCondition [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M6
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasUnachievedMilestone :M7
        ] [
            sp:subject <http://example.org/devices#device3> ;
            sp:predicate rdf:type ;
            sp:object <http://www.w3.org/ns/ssn/System>
        ])
    ] .

:G9 
    a gsm:Guard ;
    gsm:hasCondition [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M5
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasUnachievedMilestone :M4
        ] [
            sp:subject <http://example.org/devices#device1> ;
            sp:predicate rdf:type ;
            sp:object <http://www.w3.org/ns/ssn/System>
        ])
    ] .

# Stages
:S1
    a gsm:Stage ;
    gsm:hasGuard :G1 ;
    gsm:hasMilestone :M1 .

:S2
    a gsm:Stage ;
    gsm:hasGuard :G2 ;
    gsm:hasMilestone :M2 .

:S3
    a gsm:Stage ;
    gsm:hasGuard :G3 ;
    gsm:hasMilestone :M8 ;
    gsm:hasChildStage 
        :S4 ,
        :S5 ,
        :S6 .

:S4
    a gsm:Stage ;
    gsm:hasGuard :G4 ;
    gsm:hasMilestone :M3 .

:S5
    a gsm:Stage ;
    gsm:hasGuard :G9 ;
    gsm:hasMilestone :M4 .

:S6
    a gsm:Stage ;
    gsm:hasGuard :G5 ;
    gsm:hasMilestone :M5 ;
    gsm:hasChildStage 
        :S7 ,
        :S8 .

:S7
    a gsm:Stage ;
    gsm:hasGuard :G6 ;
    gsm:hasMilestone :M6 .

:S8
    a gsm:Stage ;
    gsm:hasGuard :G7 ;
    gsm:hasMilestone :M7 .

# Milestones
:M0
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M2 
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M8
        ]) 
    ] .

:M1
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            sp:subject ex:always ;
            sp:predicate ex:true ;
            sp:object ex:sentry
        ]) 
    ] .

:M2
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            sp:subject ex:always ;
            sp:predicate ex:true ;
            sp:object ex:sentry
        ]) 
    ] .

:M3
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            sp:subject ex:always ;
            sp:predicate ex:true ;
            sp:object ex:sentry
        ]) 
    ] .

:M4
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            sp:subject ex:always ;
            sp:predicate ex:true ;
            sp:object ex:sentry  
        ]) 
    ] .

:M5
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M6 
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M7
        ]) 
    ] .

:M6
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            sp:subject ex:always ;
            sp:predicate ex:true ;
            sp:object ex:sentry  
        ]) 
    ] .

:M7
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            sp:subject ex:always ;
            sp:predicate ex:true ;
            sp:object ex:sentry  
        ]) 
    ] .

:M8
    a gsm:Milestone ;
    gsm:hasValidatingSentry [
        a sp:Ask ;
        sp:where ([
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M3
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M4
        ] [
            gsm:inArtifactInstance gsm:thisArtifactInstance ;
            gsm:hasAchievedMilestone :M5
        ]) 
    ] .
