UJG / Editor's 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 .

Last Update
2026-07-09
Editors
  • Seva Dolgopolov
Group
User Journal Graph Community Group
Repository
View Source
License
W3C-Software-and-Document

1. Overview

This optional module defines a vocabulary for experience semantics traditionally found in User Journey Maps, such as steps, phases, and pain points. It adds UXR-oriented annotations over [UJG Surface] without changing graph topology, runtime ordering, mapping behavior, or the core journey mechanics.

2. Normative Artifacts

This module is published through the following artifacts:

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

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

  • experience.shape.ttl: SHACL validation rules, published at https://ujg.specs.openuji.org/ed/ns/experience.shape

Examples in this page use an explicit context array composed from the published module contexts. Documents that use Experience terms must include https://ujg.specs.openuji.org/ed/ns/experience.context.jsonld explicitly; the aggregate ED context does not include this optional module.

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 Surface or State.

  • 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 surfaces without changing traversal behavior. The normative structural definition is provided by the ontology below; graph meaning is derived through the referenced Surface and its graphNodeRef.

surfaceRefs records the surfaces that participate in an ExperienceStep. A step's touchpoints are derived from the referenced surfaces' touchpointRef values when those references are present. The referenced Surface nodes point back to their Graph subjects through Surface graphNodeRef. experienceRefs records the journey steps a PainPoint annotates. None of these references 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 surfaces; multiple steps MAY reference the same surface (e.g., when a surface serves multiple intents).

5. Ontology

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

turtle
@prefix ujg: <https://ujg.specs.openuji.org/ed/ns/core#> .
@prefix ujgexperience: <https://ujg.specs.openuji.org/ed/ns/experience#> .
@prefix ujgsurface: <https://ujg.specs.openuji.org/ed/ns/surface#> .
@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/ed/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:Phase a owl:Class ;
  rdfs:subClassOf ujg:Node .

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

### Properties

ujgexperience:surfaceRefs a owl:ObjectProperty ;
  rdfs:domain ujgexperience:ExperienceStep ;
  rdfs:range ujgsurface:Surface .

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

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

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/ed/ns/core#> .
@prefix ujgexperience: <https://ujg.specs.openuji.org/ed/ns/experience#> .
@prefix ujgsurface: <https://ujg.specs.openuji.org/ed/ns/surface#> .
@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/ed/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:Phase a owl:Class ;
  rdfs:subClassOf ujg:Node .

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

### Properties

ujgexperience:surfaceRefs a owl:ObjectProperty ;
  rdfs:domain ujgexperience:ExperienceStep ;
  rdfs:range ujgsurface:Surface .

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

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

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/ed/ns/experience.context.jsonld. It provides the compact JSON-LD term mappings for the Experience vocabulary.

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

    "ujgexperience": "https://ujg.specs.openuji.org/ed/ns/experience#",
    "ujgsurface": "https://ujg.specs.openuji.org/ed/ns/surface#",
    "xsd": "http://www.w3.org/2001/XMLSchema#",

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

    "surfaceRefs": {
      "@id": "ujgexperience:surfaceRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "phaseRef": {
      "@id": "ujgexperience:phaseRef",
      "@type": "@id"
    },
    "order": {
      "@id": "ujgexperience:order",
      "@type": "xsd:integer"
    },
    "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/ed/ns/experience#",
    "ujgsurface": "https://ujg.specs.openuji.org/ed/ns/surface#",
    "xsd": "http://www.w3.org/2001/XMLSchema#",

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

    "surfaceRefs": {
      "@id": "ujgexperience:surfaceRefs",
      "@type": "@id",
      "@container": "@set"
    },
    "phaseRef": {
      "@id": "ujgexperience:phaseRef",
      "@type": "@id"
    },
    "order": {
      "@id": "ujgexperience:order",
      "@type": "xsd:integer"
    },
    "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/ed/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/ed/ns/core#> .
@prefix ujgexperience: <https://ujg.specs.openuji.org/ed/ns/experience#> .
@prefix ujgsurface: <https://ujg.specs.openuji.org/ed/ns/surface#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix ujgexperienceshape: <https://ujg.specs.openuji.org/ed/ns/experience.shape#> .


ujgexperienceshape:ExperienceStepShape a sh:NodeShape ;
  sh:targetClass ujgexperience:ExperienceStep ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujgexperience:surfaceRefs ;
    sh:class ujgsurface:Surface ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
  ] ;

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

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

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

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

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


ujgexperienceshape:ExperienceStepShape a sh:NodeShape ;
  sh:targetClass ujgexperience:ExperienceStep ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujgexperience:surfaceRefs ;
    sh:class ujgsurface:Surface ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
  ] ;

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

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

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

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

  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 ;
  ] .

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

  1. Resolution: Every ID in surfaceRefs MUST resolve to a Surface; every ID in experienceRefs MUST resolve to an ExperienceStep; and phaseRef MUST resolve to a Phase. 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/ed/ns/core.context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/graph.context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/surface.context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/runtime.context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/experience.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",
      "origin": "https://shop.example"
    },

    {
      "@type": "Surface",
      "@id": "urn:ujg:surface:shipping-form",
      "graphNodeRef": "urn:ujg:state:shipping-form",
      "touchpointRef": "urn:ujg:touchpoint:web"
    },

    {
      "@type": "Surface",
      "@id": "urn:ujg:surface:payment",
      "graphNodeRef": "urn:ujg:state:payment",
      "touchpointRef": "urn:ujg:touchpoint:web"
    },

    {
      "@type": "ExperienceStep",
      "@id": "urn:ujg:step:enter-shipping",
      "label": "Enter shipping details",
      "surfaceRefs": ["urn:ujg:surface:shipping-form"],
      "phaseRef": "urn:ujg:phase:checkout"
    },

    {
      "@type": "ExperienceStep",
      "@id": "urn:ujg:step:enter-payment",
      "label": "Enter payment details",
      "surfaceRefs": ["urn:ujg:surface:payment"],
      "phaseRef": "urn:ujg:phase:checkout"
    },

    {
      "@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": "SurfaceInstance",
      "@id": "urn:ujg:surface-instance:shipping-form",
      "surfaceRef": "urn:ujg:surface:shipping-form"
    },

    {
      "@type": "RuntimeEvent",
      "@id": "urn:ujg:event:12345:100",
      "executionId": "urn:ujg:execution:12345",
      "surfaceInstanceRef": "urn:ujg:surface-instance:shipping-form"
    }
  ]
}
{
  "@context": [
    "https://ujg.specs.openuji.org/ed/ns/core.context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/graph.context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/surface.context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/runtime.context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/experience.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",
      "origin": "https://shop.example"
    },

    {
      "@type": "Surface",
      "@id": "urn:ujg:surface:shipping-form",
      "graphNodeRef": "urn:ujg:state:shipping-form",
      "touchpointRef": "urn:ujg:touchpoint:web"
    },

    {
      "@type": "Surface",
      "@id": "urn:ujg:surface:payment",
      "graphNodeRef": "urn:ujg:state:payment",
      "touchpointRef": "urn:ujg:touchpoint:web"
    },

    {
      "@type": "ExperienceStep",
      "@id": "urn:ujg:step:enter-shipping",
      "label": "Enter shipping details",
      "surfaceRefs": ["urn:ujg:surface:shipping-form"],
      "phaseRef": "urn:ujg:phase:checkout"
    },

    {
      "@type": "ExperienceStep",
      "@id": "urn:ujg:step:enter-payment",
      "label": "Enter payment details",
      "surfaceRefs": ["urn:ujg:surface:payment"],
      "phaseRef": "urn:ujg:phase:checkout"
    },

    {
      "@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": "SurfaceInstance",
      "@id": "urn:ujg:surface-instance:shipping-form",
      "surfaceRef": "urn:ujg:surface:shipping-form"
    },

    {
      "@type": "RuntimeEvent",
      "@id": "urn:ujg:event:12345:100",
      "executionId": "urn:ujg:execution:12345",
      "surfaceInstanceRef": "urn:ujg:surface-instance:shipping-form"
    }
  ]
}

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