UJG / First Editors’ Draft /
GitHub
Table of Contents
  • 1Overview
  • 2Normative Artifacts
  • 3Terminology
  • 4Annotation Model
  • 5Ontology
  • 6JSON-LD Context
  • 7Validation
  • 8Appendix: Combined JSON Example
W3C Community Group Draft Report

Experience

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 a vocabulary for experience semantics traditionally found in User Journey Maps (e.g., steps, touchpoints, phases, pain points). It annotates [UJG Graph] without changing graph topology.

2. Normative Artifacts

This module is published through the following artifacts:

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

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

  • experience.shape.ttl: SHACL validation rules, published at https://ujg.specs.openuji.org/tr/2026.06/ns/experience.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.

Non-goals:

  • This module does not define new traversal rules.

  • This module does not affect Graph validity.


3. Terminology

  • ExperienceStep: A semantic grouping representing a “step” in a journey map. Not necessarily 1:1 with State.

  • Touchpoint: A channel/surface where the experience occurs (e.g., web, mobile app, email, in-store).

  • Phase: A high-level stage used for grouping (e.g., awareness, checkout).

  • PainPoint: A named issue or friction hypothesis attached to part of the intended experience.


4. Annotation Model

Experience annotations add semantic grouping and interpretation to a graph without changing traversal behavior. The normative structural definition is provided by the ontology below; the context and shape that follow also show the shared Graph terms reused by this module, including label, tags, and stateRefs.

experienceRefs records the journey steps a PainPoint annotates. Its values reference one or more ExperienceStep nodes, which in turn reference the underlying Graph states through stateRefs; it does not define new graph topology.

Notes:

  • A Step MUST NOT imply traversal order. Order is defined only by [UJG Graph] transitions.

  • A Step MAY include multiple states; multiple steps MAY reference the same state (e.g., when a state serves multiple intents).

5. Ontology

The normative Experience ontology is defined below and is published at https://ujg.specs.openuji.org/tr/2026.06/ns/experience. It is the authoritative structural definition for ExperienceStep, Touchpoint, Phase, PainPoint, and the Experience-specific properties declared by this module.

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 ujgexperience: <https://ujg.specs.openuji.org/tr/2026.06/ns/experience#> .
@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/experience#> a owl:Ontology ;
  rdfs:label "UJG Experience Editor's Draft Vocabulary"@en ;
  dct:description "UJG Experience ontology declaration" .

### Classes

ujgexperience:ExperienceStep a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujgexperience:Touchpoint a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujgexperience:Phase a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujgexperience:PainPoint a owl:Class ;
  rdfs:subClassOf ujg:Node .

### Properties

ujgexperience:phaseRef a owl:ObjectProperty ;
  rdfs:domain ujgexperience:ExperienceStep ;
  rdfs:range ujgexperience:Phase .

ujgexperience:touchpointRefs a owl:ObjectProperty ;
  rdfs:domain ujgexperience:ExperienceStep ;
  rdfs:range ujgexperience:Touchpoint .

ujgexperience:order a owl:DatatypeProperty ;
  rdfs:domain ujgexperience:Phase ;
  rdfs:range xsd:integer .

ujgexperience:channel a owl:DatatypeProperty ;
  rdfs:domain ujgexperience:Touchpoint ;
  rdfs:range xsd:string .

ujgexperience:experienceRefs a owl:ObjectProperty ;
  rdfs:domain ujgexperience:PainPoint ;
  rdfs:range ujgexperience:ExperienceStep .

ujgexperience:severity a owl:DatatypeProperty ;
  rdfs:domain ujgexperience:PainPoint ;
  rdfs:range xsd:decimal .

ujgexperience:description a owl:DatatypeProperty ;
  rdfs:domain ujgexperience:PainPoint ;
  rdfs:range xsd:string .
@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 ujgexperience: <https://ujg.specs.openuji.org/tr/2026.06/ns/experience#> .
@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/experience#> a owl:Ontology ;
  rdfs:label "UJG Experience Editor's Draft Vocabulary"@en ;
  dct:description "UJG Experience ontology declaration" .

### Classes

ujgexperience:ExperienceStep a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujgexperience:Touchpoint a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujgexperience:Phase a owl:Class ;
  rdfs:subClassOf ujg:Node .

ujgexperience:PainPoint a owl:Class ;
  rdfs:subClassOf ujg:Node .

### Properties

ujgexperience:phaseRef a owl:ObjectProperty ;
  rdfs:domain ujgexperience:ExperienceStep ;
  rdfs:range ujgexperience:Phase .

ujgexperience:touchpointRefs a owl:ObjectProperty ;
  rdfs:domain ujgexperience:ExperienceStep ;
  rdfs:range ujgexperience:Touchpoint .

ujgexperience:order a owl:DatatypeProperty ;
  rdfs:domain ujgexperience:Phase ;
  rdfs:range xsd:integer .

ujgexperience:channel a owl:DatatypeProperty ;
  rdfs:domain ujgexperience:Touchpoint ;
  rdfs:range xsd:string .

ujgexperience:experienceRefs a owl:ObjectProperty ;
  rdfs:domain ujgexperience:PainPoint ;
  rdfs:range ujgexperience:ExperienceStep .

ujgexperience:severity a owl:DatatypeProperty ;
  rdfs:domain ujgexperience:PainPoint ;
  rdfs:range xsd:decimal .

ujgexperience:description a owl:DatatypeProperty ;
  rdfs:domain ujgexperience:PainPoint ;
  rdfs:range xsd:string .

6. JSON-LD Context

The normative Experience JSON-LD context is defined below and is published at https://ujg.specs.openuji.org/tr/2026.06/ns/experience.context.jsonld. It provides the compact JSON-LD term mappings for the Experience vocabulary and the shared Graph terms reused by Experience examples.

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

    "ujgexperience": "https://ujg.specs.openuji.org/tr/2026.06/ns/experience#",
    "ujggraph": "https://ujg.specs.openuji.org/tr/2026.06/ns/graph#",
    "xsd": "http://www.w3.org/2001/XMLSchema#",

    "ExperienceStep": "ujgexperience:ExperienceStep",
    "Touchpoint": "ujgexperience:Touchpoint",
    "Phase": "ujgexperience:Phase",
    "PainPoint": "ujgexperience:PainPoint",

    "label": "ujggraph:label",
    "tags": {
      "@id": "ujggraph:tags",
      "@container": "@set"
    },
    "stateRefs": {
      "@id": "ujggraph:stateRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "phaseRef": {
      "@id": "ujgexperience:phaseRef",
      "@type": "@id"
    },
    "touchpointRefs": {
      "@id": "ujgexperience:touchpointRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "order": {
      "@id": "ujgexperience:order",
      "@type": "xsd:integer"
    },
    "channel": "ujgexperience:channel",
    "experienceRefs": {
      "@id": "ujgexperience:experienceRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "severity": {
      "@id": "ujgexperience:severity",
      "@type": "xsd:decimal"
    },
    "description": "ujgexperience:description"
  }
}
{
  "@context": {
    "@version": 1.1,

    "ujgexperience": "https://ujg.specs.openuji.org/tr/2026.06/ns/experience#",
    "ujggraph": "https://ujg.specs.openuji.org/tr/2026.06/ns/graph#",
    "xsd": "http://www.w3.org/2001/XMLSchema#",

    "ExperienceStep": "ujgexperience:ExperienceStep",
    "Touchpoint": "ujgexperience:Touchpoint",
    "Phase": "ujgexperience:Phase",
    "PainPoint": "ujgexperience:PainPoint",

    "label": "ujggraph:label",
    "tags": {
      "@id": "ujggraph:tags",
      "@container": "@set"
    },
    "stateRefs": {
      "@id": "ujggraph:stateRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "phaseRef": {
      "@id": "ujgexperience:phaseRef",
      "@type": "@id"
    },
    "touchpointRefs": {
      "@id": "ujgexperience:touchpointRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "order": {
      "@id": "ujgexperience:order",
      "@type": "xsd:integer"
    },
    "channel": "ujgexperience:channel",
    "experienceRefs": {
      "@id": "ujgexperience:experienceRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "severity": {
      "@id": "ujgexperience:severity",
      "@type": "xsd:decimal"
    },
    "description": "ujgexperience:description"
  }
}

7. Validation

The normative Experience SHACL shape is defined below and is published at https://ujg.specs.openuji.org/tr/2026.06/ns/experience.shape. It is the authoritative validation artifact for Experience structural constraints and shared-term usage.

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 ujgexperience: <https://ujg.specs.openuji.org/tr/2026.06/ns/experience#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix ujgexperienceshape: <https://ujg.specs.openuji.org/tr/2026.06/ns/experience.shape#> .


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

ujgexperienceshape:ExperienceStepShape a sh:NodeShape ;
  sh:targetClass ujgexperience:ExperienceStep ;
  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:stateRefs ;
    sh:node ujgexperienceshape:StateLikeShape ;
    sh:minCount 1 ;
  ] ;

  sh:property [
    sh:path ujgexperience:phaseRef ;
    sh:class ujgexperience:Phase ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujgexperience:touchpointRefs ;
    sh:class ujgexperience:Touchpoint ;
    sh:nodeKind sh:IRI ;
  ] ;

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

ujgexperienceshape:PhaseShape a sh:NodeShape ;
  sh:targetClass ujgexperience:Phase ;
  sh:nodeKind sh:IRI ;

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

  sh:property [
    sh:path ujgexperience:order ;
    sh:datatype xsd:integer ;
    sh:maxCount 1 ;
  ] .

ujgexperienceshape:TouchpointShape a sh:NodeShape ;
  sh:targetClass ujgexperience:Touchpoint ;
  sh:nodeKind sh:IRI ;

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

  sh:property [
    sh:path ujgexperience:channel ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

ujgexperienceshape:PainPointShape a sh:NodeShape ;
  sh:targetClass ujgexperience:PainPoint ;
  sh:nodeKind sh:IRI ;

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

  sh:property [
    sh:path ujgexperience:experienceRefs ;
    sh:class ujgexperience:ExperienceStep ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
  ] ;

  sh:property [
    sh:path ujgexperience:severity ;
    sh:datatype xsd:decimal ;
    sh:minInclusive 0 ;
    sh:maxInclusive 1 ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujgexperience:description ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujggraph:tags ;
    sh:datatype xsd:string ;
  ] .
@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 ujgexperience: <https://ujg.specs.openuji.org/tr/2026.06/ns/experience#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix ujgexperienceshape: <https://ujg.specs.openuji.org/tr/2026.06/ns/experience.shape#> .


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

ujgexperienceshape:ExperienceStepShape a sh:NodeShape ;
  sh:targetClass ujgexperience:ExperienceStep ;
  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:stateRefs ;
    sh:node ujgexperienceshape:StateLikeShape ;
    sh:minCount 1 ;
  ] ;

  sh:property [
    sh:path ujgexperience:phaseRef ;
    sh:class ujgexperience:Phase ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujgexperience:touchpointRefs ;
    sh:class ujgexperience:Touchpoint ;
    sh:nodeKind sh:IRI ;
  ] ;

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

ujgexperienceshape:PhaseShape a sh:NodeShape ;
  sh:targetClass ujgexperience:Phase ;
  sh:nodeKind sh:IRI ;

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

  sh:property [
    sh:path ujgexperience:order ;
    sh:datatype xsd:integer ;
    sh:maxCount 1 ;
  ] .

ujgexperienceshape:TouchpointShape a sh:NodeShape ;
  sh:targetClass ujgexperience:Touchpoint ;
  sh:nodeKind sh:IRI ;

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

  sh:property [
    sh:path ujgexperience:channel ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

ujgexperienceshape:PainPointShape a sh:NodeShape ;
  sh:targetClass ujgexperience:PainPoint ;
  sh:nodeKind sh:IRI ;

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

  sh:property [
    sh:path ujgexperience:experienceRefs ;
    sh:class ujgexperience:ExperienceStep ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
  ] ;

  sh:property [
    sh:path ujgexperience:severity ;
    sh:datatype xsd:decimal ;
    sh:minInclusive 0 ;
    sh:maxInclusive 1 ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujgexperience:description ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;

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

The rules below define the remaining resolution and non-structural constraints for Experience annotations.

  1. Resolution: Every ID in stateRefs MUST resolve to a State or CompositeState; every ID in experienceRefs MUST resolve to an ExperienceStep; phaseRef MUST resolve to a Phase; and every ID in touchpointRefs MUST resolve to a Touchpoint. All referenced IDs MUST be within the current scope or imported modules.

  2. Non-Structural: Experience objects MUST NOT introduce additional traversal semantics beyond [UJG Graph].


8. Appendix: Combined JSON Example

json
{
  "@context": "https://ujg.specs.openuji.org/tr/2026.06/ns/context.jsonld",
  "@id": "https://example.com/ujg/experience/checkout.jsonld",
  "@type": "UJGDocument",
  "nodes": [
    { "@type": "State", "@id": "urn:ujg:state:shipping-form", "label": "Shipping" },

    { "@type": "State", "@id": "urn:ujg:state:payment", "label": "Payment" },

    { "@type": "Phase", "@id": "urn:ujg:phase:checkout", "label": "Checkout", "order": 2 },

    { "@type": "Touchpoint", "@id": "urn:ujg:touchpoint:web", "label": "Web", "channel": "web" },

    {
      "@type": "ExperienceStep",
      "@id": "urn:ujg:step:enter-shipping",
      "label": "Enter shipping details",
      "stateRefs": ["urn:ujg:state:shipping-form"],
      "phaseRef": "urn:ujg:phase:checkout",
      "touchpointRefs": ["urn:ujg:touchpoint:web"]
    },

    {
      "@type": "ExperienceStep",
      "@id": "urn:ujg:step:enter-payment",
      "label": "Enter payment details",
      "stateRefs": ["urn:ujg:state:payment"],
      "phaseRef": "urn:ujg:phase:checkout",
      "touchpointRefs": ["urn:ujg:touchpoint:web"]
    },

    {
      "@type": "PainPoint",
      "@id": "urn:ujg:pain:address-validation",
      "label": "Address validation friction",
      "severity": 0.7,
      "experienceRefs": [
        "urn:ujg:step:enter-shipping",
        "urn:ujg:step:enter-payment"
      ]
    },

    {
      "@type": "JourneyExecution",
      "@id": "urn:ujg:execution:12345"
    },

    {
      "@type": "JourneyInstance",
      "@id": "urn:ujg:journey-instance:checkout:12345",
      "journeyRef": "urn:ujg:journey:checkout"
    },

    {
      "@type": "RuntimeEvent",
      "@id": "urn:ujg:event:12345:100",
      "executionId": "urn:ujg:execution:12345",
      "stateRef": "urn:ujg:state:shipping-form",
      "journeyInstanceRef": "urn:ujg:journey-instance:checkout:12345"
    }
  ]
}
{
  "@context": "https://ujg.specs.openuji.org/tr/2026.06/ns/context.jsonld",
  "@id": "https://example.com/ujg/experience/checkout.jsonld",
  "@type": "UJGDocument",
  "nodes": [
    { "@type": "State", "@id": "urn:ujg:state:shipping-form", "label": "Shipping" },

    { "@type": "State", "@id": "urn:ujg:state:payment", "label": "Payment" },

    { "@type": "Phase", "@id": "urn:ujg:phase:checkout", "label": "Checkout", "order": 2 },

    { "@type": "Touchpoint", "@id": "urn:ujg:touchpoint:web", "label": "Web", "channel": "web" },

    {
      "@type": "ExperienceStep",
      "@id": "urn:ujg:step:enter-shipping",
      "label": "Enter shipping details",
      "stateRefs": ["urn:ujg:state:shipping-form"],
      "phaseRef": "urn:ujg:phase:checkout",
      "touchpointRefs": ["urn:ujg:touchpoint:web"]
    },

    {
      "@type": "ExperienceStep",
      "@id": "urn:ujg:step:enter-payment",
      "label": "Enter payment details",
      "stateRefs": ["urn:ujg:state:payment"],
      "phaseRef": "urn:ujg:phase:checkout",
      "touchpointRefs": ["urn:ujg:touchpoint:web"]
    },

    {
      "@type": "PainPoint",
      "@id": "urn:ujg:pain:address-validation",
      "label": "Address validation friction",
      "severity": 0.7,
      "experienceRefs": [
        "urn:ujg:step:enter-shipping",
        "urn:ujg:step:enter-payment"
      ]
    },

    {
      "@type": "JourneyExecution",
      "@id": "urn:ujg:execution:12345"
    },

    {
      "@type": "JourneyInstance",
      "@id": "urn:ujg:journey-instance:checkout:12345",
      "journeyRef": "urn:ujg:journey:checkout"
    },

    {
      "@type": "RuntimeEvent",
      "@id": "urn:ujg:event:12345:100",
      "executionId": "urn:ujg:execution:12345",
      "stateRef": "urn:ujg:state:shipping-form",
      "journeyInstanceRef": "urn:ujg:journey-instance:checkout:12345"
    }
  ]
}

Copyright © 2026 the Contributors to the ujg/experience/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