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 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 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. The same composition is also published as the convenience context https://ujg.specs.openuji.org/ed/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.
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/ed/ns/experience. It is the authoritative structural definition for ExperienceStep, Touchpoint, Phase, PainPoint, and the Experience-specific properties declared by this module.
@prefix ujg: <https://ujg.specs.openuji.org/ed/ns/core#> .
@prefix ujggraph: <https://ujg.specs.openuji.org/ed/ns/graph#> .
@prefix ujgexperience: <https://ujg.specs.openuji.org/ed/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/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: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:graphRefs a owl:ObjectProperty ;
rdfs:domain ujgexperience:PainPoint ;
rdfs:range ujg:Node .
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 ujggraph: <https://ujg.specs.openuji.org/ed/ns/graph#> .
@prefix ujgexperience: <https://ujg.specs.openuji.org/ed/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/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: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:graphRefs a owl:ObjectProperty ;
rdfs:domain ujgexperience:PainPoint ;
rdfs:range ujg:Node .
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 and the shared Graph terms reused by Experience examples.
{
"@context": {
"@version": 1.1,
"ujgexperience": "https://ujg.specs.openuji.org/ed/ns/experience#",
"ujggraph": "https://ujg.specs.openuji.org/ed/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",
"graphRefs": {
"@id": "ujgexperience:graphRefs",
"@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#",
"ujggraph": "https://ujg.specs.openuji.org/ed/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",
"graphRefs": {
"@id": "ujgexperience:graphRefs",
"@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 ujggraph: <https://ujg.specs.openuji.org/ed/ns/graph#> .
@prefix ujgexperience: <https://ujg.specs.openuji.org/ed/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/ed/ns/experience.shape#> .
ujgexperienceshape:StateLikeShape a sh:NodeShape ;
sh:nodeKind sh:IRI ;
sh:or (
[ sh:class ujggraph:State ]
[ sh:class ujggraph:CompositeState ]
) .
ujgexperienceshape:GraphRefTargetShape a sh:NodeShape ;
sh:nodeKind sh:IRI ;
sh:or (
[ sh:class ujggraph:State ]
[ sh:class ujggraph:CompositeState ]
[ sh:class ujggraph:Transition ]
[ sh:class ujggraph:OutgoingTransition ]
) .
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:graphRefs ;
sh:node ujgexperienceshape:GraphRefTargetShape ;
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/ed/ns/core#> .
@prefix ujggraph: <https://ujg.specs.openuji.org/ed/ns/graph#> .
@prefix ujgexperience: <https://ujg.specs.openuji.org/ed/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/ed/ns/experience.shape#> .
ujgexperienceshape:StateLikeShape a sh:NodeShape ;
sh:nodeKind sh:IRI ;
sh:or (
[ sh:class ujggraph:State ]
[ sh:class ujggraph:CompositeState ]
) .
ujgexperienceshape:GraphRefTargetShape a sh:NodeShape ;
sh:nodeKind sh:IRI ;
sh:or (
[ sh:class ujggraph:State ]
[ sh:class ujggraph:CompositeState ]
[ sh:class ujggraph:Transition ]
[ sh:class ujggraph:OutgoingTransition ]
) .
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:graphRefs ;
sh:node ujgexperienceshape:GraphRefTargetShape ;
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.
Resolution: Every ID in
stateRefs,graphRefs,phaseRef,touchpointRefsMUST resolve to a Node 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/context.jsonld",
"@id": "https://example.com/ujg/experience/checkout.jsonld",
"@type": "UJGDocument",
"specVersion": "1.0",
"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": "PainPoint",
"@id": "urn:ujg:pain:address-validation",
"label": "Address validation friction",
"severity": 0.7,
"graphRefs": ["urn:ujg:state:shipping-form" ]
},
{
"@type": "JourneyExecution",
"@id": "urn:ujg:execution:12345",
"eventRefs": ["urn:ujg:event:12345:100"]
},
{
"@type": "RuntimeEvent",
"@id": "urn:ujg:event:12345:100",
"executionId": "urn:ujg:execution:12345",
"stateRef": "urn:ujg:state:shipping-form"
}
]
} {
"@context": "https://ujg.specs.openuji.org/ed/ns/context.jsonld",
"@id": "https://example.com/ujg/experience/checkout.jsonld",
"@type": "UJGDocument",
"specVersion": "1.0",
"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": "PainPoint",
"@id": "urn:ujg:pain:address-validation",
"label": "Address validation friction",
"severity": 0.7,
"graphRefs": ["urn:ujg:state:shipping-form" ]
},
{
"@type": "JourneyExecution",
"@id": "urn:ujg:execution:12345",
"eventRefs": ["urn:ujg:event:12345:100"]
},
{
"@type": "RuntimeEvent",
"@id": "urn:ujg:event:12345:100",
"executionId": "urn:ujg:execution:12345",
"stateRef": "urn:ujg:state:shipping-form"
}
]
}