UJG / First Editors’ Draft /
GitHub
Table of Contents
  • 1Overview
  • 2Normative Artifacts
  • 3Terminology
  • 4The Core Graph
    • 4.1Visual Model
  • 5Composition (CompositeState)
    • 5.1Visual Model
  • 6Reusability (OutgoingTransitionGroup)
    • 6.1Visual Model
    • 6.2Processing Model (Injection)
  • 7Ontology
  • 8JSON-LD Context
  • 9Validation
  • 10Appendix: Combined JSON Example
W3C Community Group Draft Report

Graph

draft

Status of this Document

This report was published by the User Journal Graph Community Group . It is not a W3C Standard nor is it on the W3C Standards Track. Please note that under the W3C Community Contributor License Agreement (CLA) there is a limited opt-out and other conditions apply. Learn more about W3C Community and Business Groups .

Status
CG-DRAFT
Version
2026.06
Published
2026-06-10
Last Update
2026-06-10
Editors
  • Seva Dolgopolov
Group
User Journal Graph Community Group
Repository
View Source
License
W3C-Software-and-Document

1. Overview

This module defines the vocabulary for intended user flow. It extends [UJG Core] to support structured, interactive graphs with composition via sub-journey references, organization tags, and reusable outgoing navigation patterns.

2. Normative Artifacts

This module is published through the following artifacts:

  • graph.ttl: ontology, published at https://ujg.specs.openuji.org/tr/2026.06/ns/graph

  • graph.context.jsonld: JSON-LD term mappings, published at https://ujg.specs.openuji.org/tr/2026.06/ns/graph.context.jsonld

  • graph.shape.ttl: SHACL validation rules, published at https://ujg.specs.openuji.org/tr/2026.06/ns/graph.shape

Examples in this page use an explicit context array composed from the published module contexts. The same composition is also published as the convenience context https://ujg.specs.openuji.org/tr/2026.06/ns/context.jsonld.

3. Terminology

  • Journey: A named container for a user flow.

  • State: A discrete node in the experience (e.g., a screen, modal).

  • Transition: A directed edge between two states.

  • CompositeState: A state that encapsulates another Journey (sub-journey).

  • OutgoingTransition: A one way edge pointing to a next possible State

  • OutgoingTransitionGroup: A reusable set of outgoing transitions that a Consumer can treat as present on multiple states (e.g., global nav).


4. The Core Graph

A Journey MUST consist of States connected by Transitions.

4.1. Visual Model

graph LR
    A[State: Product] -->|Transition: Add| B[State: Cart]

5. Composition (CompositeState)

Composition allows a node to reference an entire sub-journey, enabling "zoomable" graph interactions.

5.1. Visual Model

graph LR
    H[Home] --> C
    subgraph C [Composite State: Checkout]
      direction LR
      s1[Shipping] --> s2[Payment]
    end
    C --> E[Exit]

The structural definition of CompositeState and subjourneyId is normative in the ontology and validation artifacts. This section defines only how consumers interpret that structure as nested or zoomable journey composition.

A CompositeState MUST reference its nested graph through subjourneyId and MUST NOT list child states directly with stateRefs.


6. Reusability (OutgoingTransitionGroup)

An OutgoingTransitionGroup defines reusable outgoing transitions (e.g., headers/footers) to avoid duplicating common navigation across many states.

The structural definition of OutgoingTransitionGroup and OutgoingTransition is normative in the ontology and validation artifacts. This section defines only the consumer processing model for applying those reusable outgoing edges.

6.1. Visual Model

graph TD
    %% Global Destinations defined in the Group
    subgraph Global [Global Navigation]
      direction LR
      H[Target: Home]
      P[Target: Profile]
    end

    %% The Standard User Journey
    subgraph Flow [Checkout User Journey]
      direction LR
      S1[State: Shipping] -->|Explicit| S2[State: Payment]
    end

    %% The Injection Logic (Applies to ALL states in Flow)
    S1 -.->|Outgoing| H
    S1 -.->|Outgoing| P
    S2 -.->|Outgoing| H
    S2 -.->|Outgoing| P

    %% Styling for clarity
    linkStyle 1,2,3,4 stroke-dasharray: 5 5, stroke:green, color:green;

6.2. Processing Model (Injection)

When a Consumer loads a Journey referencing outgoingTransitionGroupRefs:

  1. Resolution:

  • The Consumer MUST resolve each referenced OutgoingTransitionGroup

  • The Consumer MUST resolve each outgoingTransitionRefs entry to an OutgoingTransition.

  1. Iteration: The Consumer MUST iterate over every State and CompositeState ID in stateRefs.

  2. Injection: The Consumer MUST treat each iterated state as having an outgoing edge to every resolved OutgoingTransition to.

  3. Deduplication: A Consumer SHOULD treat injected and explicit edges with the same effective from and to as one effective edge.


7. Ontology

The normative Graph ontology is defined below and is published at https://ujg.specs.openuji.org/tr/2026.06/ns/graph. It is the authoritative structural definition for Graph classes and properties, including Journey, State, CompositeState, Transition, OutgoingTransition, and OutgoingTransitionGroup.

turtle
@prefix ujg: <https://ujg.specs.openuji.org/tr/2026.06/ns/core#> .
@prefix ujggraph: <https://ujg.specs.openuji.org/tr/2026.06/ns/graph#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dct: <http://purl.org/dc/terms/> .


<https://ujg.specs.openuji.org/tr/2026.06/ns/graph#> a owl:Ontology ;
  rdfs:label "UJG Graph Editor's Draft Vocabulary"@en ;
  dct:description "UJG Graph ontology declaration" .

### Classes

ujggraph:Journey a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujggraph:State a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujggraph:CompositeState a owl:Class ;
  rdfs:subClassOf ujggraph:State .

ujggraph:Transition a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujggraph:OutgoingTransition a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujggraph:OutgoingTransitionGroup a owl:Class ;
  rdfs:subClassOf ujg:Node .

### Properties

ujggraph:label a owl:DatatypeProperty ;
  rdfs:domain ujg:Node ;
  rdfs:range xsd:string .

ujggraph:tags a owl:DatatypeProperty ;
  rdfs:domain ujg:Node ;
  rdfs:range xsd:string .

ujggraph:startState a owl:ObjectProperty ;
  rdfs:domain ujggraph:Journey ;
  rdfs:range ujggraph:State .

ujggraph:stateRefs a owl:ObjectProperty ;
  rdfs:range ujggraph:State .

ujggraph:transitionRefs a owl:ObjectProperty ;
  rdfs:domain ujggraph:Journey ;
  rdfs:range ujggraph:Transition .

ujggraph:outgoingTransitionGroupRefs a owl:ObjectProperty ;
  rdfs:domain ujggraph:Journey ;
  rdfs:range ujggraph:OutgoingTransitionGroup .

ujggraph:from a owl:ObjectProperty ;
  rdfs:domain ujggraph:Transition ;
  rdfs:range ujggraph:State .

ujggraph:to a owl:ObjectProperty ;
  rdfs:range ujggraph:State .

ujggraph:subjourneyId a owl:ObjectProperty ;
  rdfs:domain ujggraph:CompositeState ;
  rdfs:range ujggraph:Journey .

ujggraph:outgoingTransitionRefs a owl:ObjectProperty ;
  rdfs:domain ujggraph:OutgoingTransitionGroup ;
  rdfs:range ujggraph:OutgoingTransition .
@prefix ujg: <https://ujg.specs.openuji.org/tr/2026.06/ns/core#> .
@prefix ujggraph: <https://ujg.specs.openuji.org/tr/2026.06/ns/graph#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix dct: <http://purl.org/dc/terms/> .


<https://ujg.specs.openuji.org/tr/2026.06/ns/graph#> a owl:Ontology ;
  rdfs:label "UJG Graph Editor's Draft Vocabulary"@en ;
  dct:description "UJG Graph ontology declaration" .

### Classes

ujggraph:Journey a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujggraph:State a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujggraph:CompositeState a owl:Class ;
  rdfs:subClassOf ujggraph:State .

ujggraph:Transition a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujggraph:OutgoingTransition a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujggraph:OutgoingTransitionGroup a owl:Class ;
  rdfs:subClassOf ujg:Node .

### Properties

ujggraph:label a owl:DatatypeProperty ;
  rdfs:domain ujg:Node ;
  rdfs:range xsd:string .

ujggraph:tags a owl:DatatypeProperty ;
  rdfs:domain ujg:Node ;
  rdfs:range xsd:string .

ujggraph:startState a owl:ObjectProperty ;
  rdfs:domain ujggraph:Journey ;
  rdfs:range ujggraph:State .

ujggraph:stateRefs a owl:ObjectProperty ;
  rdfs:range ujggraph:State .

ujggraph:transitionRefs a owl:ObjectProperty ;
  rdfs:domain ujggraph:Journey ;
  rdfs:range ujggraph:Transition .

ujggraph:outgoingTransitionGroupRefs a owl:ObjectProperty ;
  rdfs:domain ujggraph:Journey ;
  rdfs:range ujggraph:OutgoingTransitionGroup .

ujggraph:from a owl:ObjectProperty ;
  rdfs:domain ujggraph:Transition ;
  rdfs:range ujggraph:State .

ujggraph:to a owl:ObjectProperty ;
  rdfs:range ujggraph:State .

ujggraph:subjourneyId a owl:ObjectProperty ;
  rdfs:domain ujggraph:CompositeState ;
  rdfs:range ujggraph:Journey .

ujggraph:outgoingTransitionRefs a owl:ObjectProperty ;
  rdfs:domain ujggraph:OutgoingTransitionGroup ;
  rdfs:range ujggraph:OutgoingTransition .

8. JSON-LD Context

The normative Graph JSON-LD context is defined below and is published at https://ujg.specs.openuji.org/tr/2026.06/ns/graph.context.jsonld. It provides the compact JSON-LD term mappings for the Graph vocabulary used by the examples on this page.

json-ld
{
  "@context": {
    "@version": 1.1,

    "ujggraph": "https://ujg.specs.openuji.org/tr/2026.06/ns/graph#",

    "Journey": "ujggraph:Journey",
    "State": "ujggraph:State",
    "CompositeState": "ujggraph:CompositeState",
    "Transition": "ujggraph:Transition",
    "OutgoingTransition": "ujggraph:OutgoingTransition",
    "OutgoingTransitionGroup": "ujggraph:OutgoingTransitionGroup",

    "label": "ujggraph:label",
    "tags": {
      "@id": "ujggraph:tags",
      "@container": "@set"
    },
    "startState": {
      "@id": "ujggraph:startState",
      "@type": "@id"
    },
    "stateRefs": {
      "@id": "ujggraph:stateRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "transitionRefs": {
      "@id": "ujggraph:transitionRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "outgoingTransitionGroupRefs": {
      "@id": "ujggraph:outgoingTransitionGroupRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "from": {
      "@id": "ujggraph:from",
      "@type": "@id"
    },
    "to": {
      "@id": "ujggraph:to",
      "@type": "@id"
    },
    "subjourneyId": {
      "@id": "ujggraph:subjourneyId",
      "@type": "@id"
    },
    "outgoingTransitionRefs": {
      "@id": "ujggraph:outgoingTransitionRefs",
      "@type": "@id",
      "@container": "@set"
    }
  }
}
{
  "@context": {
    "@version": 1.1,

    "ujggraph": "https://ujg.specs.openuji.org/tr/2026.06/ns/graph#",

    "Journey": "ujggraph:Journey",
    "State": "ujggraph:State",
    "CompositeState": "ujggraph:CompositeState",
    "Transition": "ujggraph:Transition",
    "OutgoingTransition": "ujggraph:OutgoingTransition",
    "OutgoingTransitionGroup": "ujggraph:OutgoingTransitionGroup",

    "label": "ujggraph:label",
    "tags": {
      "@id": "ujggraph:tags",
      "@container": "@set"
    },
    "startState": {
      "@id": "ujggraph:startState",
      "@type": "@id"
    },
    "stateRefs": {
      "@id": "ujggraph:stateRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "transitionRefs": {
      "@id": "ujggraph:transitionRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "outgoingTransitionGroupRefs": {
      "@id": "ujggraph:outgoingTransitionGroupRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "from": {
      "@id": "ujggraph:from",
      "@type": "@id"
    },
    "to": {
      "@id": "ujggraph:to",
      "@type": "@id"
    },
    "subjourneyId": {
      "@id": "ujggraph:subjourneyId",
      "@type": "@id"
    },
    "outgoingTransitionRefs": {
      "@id": "ujggraph:outgoingTransitionRefs",
      "@type": "@id",
      "@container": "@set"
    }
  }
}

9. Validation

The normative Graph SHACL shape is defined below and is published at https://ujg.specs.openuji.org/tr/2026.06/ns/graph.shape. It is the authoritative validation artifact for Graph structural constraints.

turtle
@prefix ujggraph: <https://ujg.specs.openuji.org/tr/2026.06/ns/graph#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix ujggraphshape: <https://ujg.specs.openuji.org/tr/2026.06/ns/graph.shape#> .


ujggraphshape:StateLikeShape a sh:NodeShape ;
  sh:nodeKind sh:IRI ;
  sh:or (
    [ sh:class ujggraph:State ]
    [ sh:class ujggraph:CompositeState ]
  ) .

ujggraphshape:JourneyShape a sh:NodeShape ;
  sh:targetClass ujggraph:Journey ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:startState ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:stateRefs ;
    sh:minCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:transitionRefs ;
    sh:minCount 1 ;
    sh:class ujggraph:Transition ;
    sh:nodeKind sh:IRI ;
  ] ;

  sh:property [
    sh:path ujggraph:outgoingTransitionGroupRefs ;
    sh:class ujggraph:OutgoingTransitionGroup ;
    sh:nodeKind sh:IRI ;
  ] ;

  sh:sparql [
    a sh:SPARQLConstraint ;
    sh:message "A transition in transitionRefs has a from state that is not listed in this journey's stateRefs." ;
    sh:select """
      SELECT $this ?transition ?from
      WHERE {
        $this ujggraph:transitionRefs ?transition .
        ?transition ujggraph:from ?from .

        FILTER (NOT EXISTS {
          $this ujggraph:stateRefs ?from .
        })
      }
    """ ;
  ] ;

  sh:sparql [
    a sh:SPARQLConstraint ;
    sh:message "A transition in transitionRefs has a to state that is not listed in this journey's stateRefs." ;
    sh:select """
      SELECT $this ?transition ?to
      WHERE {
        $this ujggraph:transitionRefs ?transition .
        ?transition ujggraph:to ?to .

        FILTER (NOT EXISTS {
          $this ujggraph:stateRefs ?to .
        })
      }
    """ ;
  ] .

ujggraphshape:StateShape a sh:NodeShape ;
  sh:targetClass ujggraph:State ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:label ;
    sh:datatype xsd:string ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujggraph:tags ;
    sh:datatype xsd:string ;
  ] .

ujggraphshape:CompositeStateShape a sh:NodeShape ;
  sh:targetClass ujggraph:CompositeState ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:label ;
    sh:datatype xsd:string ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujggraph:tags ;
    sh:datatype xsd:string ;
  ] ;

  sh:property [
    sh:path ujggraph:stateRefs ;
    sh:maxCount 0 ;
    sh:message "A CompositeState must not use stateRefs; use subjourneyId to reference a Journey." ;
  ] ;

  sh:property [
    sh:path ujggraph:subjourneyId ;
    sh:class ujggraph:Journey ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] .

ujggraphshape:TransitionShape a sh:NodeShape ;
  sh:targetClass ujggraph:Transition ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:from ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:to ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:label ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

ujggraphshape:OutgoingTransitionShape a sh:NodeShape ;
  sh:targetClass ujggraph:OutgoingTransition ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:to ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:label ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

ujggraphshape:OutgoingTransitionGroupShape a sh:NodeShape ;
  sh:targetClass ujggraph:OutgoingTransitionGroup ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:outgoingTransitionRefs ;
    sh:class ujggraph:OutgoingTransition ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
  ] . 
@prefix ujggraph: <https://ujg.specs.openuji.org/tr/2026.06/ns/graph#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix ujggraphshape: <https://ujg.specs.openuji.org/tr/2026.06/ns/graph.shape#> .


ujggraphshape:StateLikeShape a sh:NodeShape ;
  sh:nodeKind sh:IRI ;
  sh:or (
    [ sh:class ujggraph:State ]
    [ sh:class ujggraph:CompositeState ]
  ) .

ujggraphshape:JourneyShape a sh:NodeShape ;
  sh:targetClass ujggraph:Journey ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:startState ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:stateRefs ;
    sh:minCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:transitionRefs ;
    sh:minCount 1 ;
    sh:class ujggraph:Transition ;
    sh:nodeKind sh:IRI ;
  ] ;

  sh:property [
    sh:path ujggraph:outgoingTransitionGroupRefs ;
    sh:class ujggraph:OutgoingTransitionGroup ;
    sh:nodeKind sh:IRI ;
  ] ;

  sh:sparql [
    a sh:SPARQLConstraint ;
    sh:message "A transition in transitionRefs has a from state that is not listed in this journey's stateRefs." ;
    sh:select """
      SELECT $this ?transition ?from
      WHERE {
        $this ujggraph:transitionRefs ?transition .
        ?transition ujggraph:from ?from .

        FILTER (NOT EXISTS {
          $this ujggraph:stateRefs ?from .
        })
      }
    """ ;
  ] ;

  sh:sparql [
    a sh:SPARQLConstraint ;
    sh:message "A transition in transitionRefs has a to state that is not listed in this journey's stateRefs." ;
    sh:select """
      SELECT $this ?transition ?to
      WHERE {
        $this ujggraph:transitionRefs ?transition .
        ?transition ujggraph:to ?to .

        FILTER (NOT EXISTS {
          $this ujggraph:stateRefs ?to .
        })
      }
    """ ;
  ] .

ujggraphshape:StateShape a sh:NodeShape ;
  sh:targetClass ujggraph:State ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:label ;
    sh:datatype xsd:string ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujggraph:tags ;
    sh:datatype xsd:string ;
  ] .

ujggraphshape:CompositeStateShape a sh:NodeShape ;
  sh:targetClass ujggraph:CompositeState ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:label ;
    sh:datatype xsd:string ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujggraph:tags ;
    sh:datatype xsd:string ;
  ] ;

  sh:property [
    sh:path ujggraph:stateRefs ;
    sh:maxCount 0 ;
    sh:message "A CompositeState must not use stateRefs; use subjourneyId to reference a Journey." ;
  ] ;

  sh:property [
    sh:path ujggraph:subjourneyId ;
    sh:class ujggraph:Journey ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] .

ujggraphshape:TransitionShape a sh:NodeShape ;
  sh:targetClass ujggraph:Transition ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:from ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:to ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:label ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

ujggraphshape:OutgoingTransitionShape a sh:NodeShape ;
  sh:targetClass ujggraph:OutgoingTransition ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:to ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
    sh:node ujggraphshape:StateLikeShape ;
  ] ;

  sh:property [
    sh:path ujggraph:label ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

ujggraphshape:OutgoingTransitionGroupShape a sh:NodeShape ;
  sh:targetClass ujggraph:OutgoingTransitionGroup ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujggraph:outgoingTransitionRefs ;
    sh:class ujggraph:OutgoingTransition ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
  ] . 

The rules below define additional graph integrity and resolution behavior beyond the structural constraints captured by the SHACL shape.

To ensure graph integrity, the following constraints MUST be met:

  1. Reference Integrity: All startState, stateRefs, transitionRefs, outgoingTransitionGroupRefs, and outgoingTransitionRefs IDs MUST resolve to valid Nodes within the current scope or imported modules.

  2. Transition Endpoint Resolution: The from and to IDs of a Transition MUST resolve to valid Nodes, and are required to be members of the enclosing Journey's stateRefs. A transition MUST NOT reference states belonging to other journeys.

  3. Composition Safety: subjourneyId MUST resolve to a valid Journey.

  4. Group Resolution: Every ID in outgoingTransitionGroupRefs MUST resolve to an OutgoingTransitionGroup.

  5. Outgoing Resolution: Every ID in outgoingTransitionRefs MUST resolve to an OutgoingTransition.


10. Appendix: Combined JSON Example

json
{
  "@context": "https://ujg.specs.openuji.org/tr/2026.06/ns/context.jsonld",
  "@id": "https://example.com/ujg/graph/main-site.jsonld",
  "@type": "UJGDocument",
  "nodes": [
    {
      "@type": "Journey",
      "@id": "urn:ujg:journey:main-site",
      "startState": "urn:ujg:state:home",
      "stateRefs": ["urn:ujg:state:home", "urn:ujg:state:checkout-flow"],
      "transitionRefs": ["urn:ujg:transition:home-to-checkout"],
      "outgoingTransitionGroupRefs": ["urn:ujg:otg:global-header"]
    },

    {
      "@type": "Transition",
      "@id": "urn:ujg:transition:home-to-checkout",
      "from": "urn:ujg:state:home",
      "to": "urn:ujg:state:checkout-flow",
      "label": "Buy Now"
    },

    {
      "@type": "State",
      "@id": "urn:ujg:state:home",
      "label": "Home Page",
      "tags": ["phase:landing"]
    },

    {
      "@type": "CompositeState",
      "@id": "urn:ujg:state:checkout-flow",
      "label": "Checkout Process",
      "subjourneyId": "urn:ujg:journey:checkout"
    },

    { "@type": "State", "@id": "urn:ujg:state:profile", "label": "Profile" },

    {
      "@type": "OutgoingTransition",
      "@id": "urn:ujg:ot:go-home",
      "to": "urn:ujg:state:home",
      "label": "Home"
    },

    {
      "@type": "OutgoingTransition",
      "@id": "urn:ujg:ot:go-profile",
      "to": "urn:ujg:state:profile",
      "label": "Profile"
    },

    {
      "@type": "OutgoingTransitionGroup",
      "@id": "urn:ujg:otg:global-header",
      "outgoingTransitionRefs": ["urn:ujg:ot:go-home", "urn:ujg:ot:go-profile"]
    }
  ]
}
{
  "@context": "https://ujg.specs.openuji.org/tr/2026.06/ns/context.jsonld",
  "@id": "https://example.com/ujg/graph/main-site.jsonld",
  "@type": "UJGDocument",
  "nodes": [
    {
      "@type": "Journey",
      "@id": "urn:ujg:journey:main-site",
      "startState": "urn:ujg:state:home",
      "stateRefs": ["urn:ujg:state:home", "urn:ujg:state:checkout-flow"],
      "transitionRefs": ["urn:ujg:transition:home-to-checkout"],
      "outgoingTransitionGroupRefs": ["urn:ujg:otg:global-header"]
    },

    {
      "@type": "Transition",
      "@id": "urn:ujg:transition:home-to-checkout",
      "from": "urn:ujg:state:home",
      "to": "urn:ujg:state:checkout-flow",
      "label": "Buy Now"
    },

    {
      "@type": "State",
      "@id": "urn:ujg:state:home",
      "label": "Home Page",
      "tags": ["phase:landing"]
    },

    {
      "@type": "CompositeState",
      "@id": "urn:ujg:state:checkout-flow",
      "label": "Checkout Process",
      "subjourneyId": "urn:ujg:journey:checkout"
    },

    { "@type": "State", "@id": "urn:ujg:state:profile", "label": "Profile" },

    {
      "@type": "OutgoingTransition",
      "@id": "urn:ujg:ot:go-home",
      "to": "urn:ujg:state:home",
      "label": "Home"
    },

    {
      "@type": "OutgoingTransition",
      "@id": "urn:ujg:ot:go-profile",
      "to": "urn:ujg:state:profile",
      "label": "Profile"
    },

    {
      "@type": "OutgoingTransitionGroup",
      "@id": "urn:ujg:otg:global-header",
      "outgoingTransitionRefs": ["urn:ujg:ot:go-home", "urn:ujg:ot:go-profile"]
    }
  ]
}

Copyright © 2026 the Contributors to the ujg/graph/2026.06, published by the User Journal Graph Community Group under the W3C Community Contributor License Agreement (CLA) . A human-readable summary is available.

generated by Speculator