Experience
draftStatus 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 .
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 athttps://ujg.specs.openuji.org/ed/ns/experienceexperience.context.jsonld: JSON-LD term mappings, published athttps://ujg.specs.openuji.org/ed/ns/experience.context.jsonldexperience.shape.ttl: SHACL validation rules, published athttps://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.
@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.
{
"@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.
@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.
Resolution: Every ID in
surfaceRefsMUST resolve to a Surface; every ID inexperienceRefsMUST resolve to an ExperienceStep; andphaseRefMUST resolve to a Phase. All referenced IDs MUST be within the current scope or imported modules.Non-Structural: Experience objects MUST NOT introduce additional traversal semantics beyond [UJG Graph].
8. Appendix: Combined JSON Example
{
"@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"
}
]
}