UJG / Editor's Draft /
GitHub
Table of Contents
  • 1Overview
  • 2Terminology
  • 3EntryBinding
  • 4Attachment Model
  • 5Normative Artifacts
    • 5.1Ontology
    • 5.2JSON-LD Context
    • 5.3Validation
  • 6Examples
    • 6.1Combined JSON Example
    • 6.2Private Invocation Hints
W3C Community Group Draft Report

Entry Binding

incubating

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-23
Editors
  • Seva Dolgopolov
Group
User Journal Graph Community Group
Repository
View Source
License
W3C-Software-and-Document

1. Overview

This optional module defines a minimal vocabulary for binding opaque materialization-context values to JourneyEntry contracts. It lets a producer publish stable entry selection values without putting browser, native, command-line, kiosk, QR, or other platform notation in [UJG Graph].

This module is optional. It annotates JourneyEntry contracts with external invocation values, but it does not change graph topology, traversal rules, entry ownership, or import resolution.

2. Terminology

  • EntryBinding: An addressable binding from an opaque value to a JourneyEntry.

3. EntryBinding

An EntryBinding is an addressable resource that identifies one opaque value for selecting one JourneyEntry. The value is interpreted by the current materialization context outside UJG.

classDiagram
  class EntryBinding {
    id
    entryRef
    value
  }
  class JourneyEntry
  EntryBinding --> JourneyEntry : entryRef

Example JSON node:

json
{
  "@type": "EntryBinding",
  "@id": "urn:ujg:entry-binding:checkout",
  "entryRef": "urn:ujg:entry:checkout-default",
  "value": "checkout"
}
{
  "@type": "EntryBinding",
  "@id": "urn:ujg:entry-binding:checkout",
  "entryRef": "urn:ujg:entry:checkout-default",
  "value": "checkout"
}

4. Attachment Model

The module introduces real JSON-LD terms and RDF edges for entry binding:

  • entryRef links an EntryBinding to a JourneyEntry.

  • value carries an opaque string interpreted outside UJG by the current materialization context.

EntryBinding does not declare a touchpoint, materialization discriminator, fallback target, structured invocation fields, or execution rule.

5. Normative Artifacts

This module is published through the following artifacts:

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

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

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

Examples in this page compose the shared baseline context https://ujg.specs.openuji.org/ed/ns/context.jsonld with the Entry Binding context.

Non-goals:

  • This module does not define platform-specific invocation syntax or matching.

  • This module does not introduce traversal semantics beyond [UJG Graph].

  • This module does not bind entries to [UJG Surface] touchpoints.

  • This module does not replace opaque vendor-private hints carried in [UJG Core] extensions.

5.1. Ontology

The normative Entry Binding ontology is defined below and is published at https://ujg.specs.openuji.org/ed/ns/entry-binding. It is the authoritative structural definition for EntryBinding and the properties declared by this module.

turtle
@prefix ujg: <https://ujg.specs.openuji.org/ed/ns/core#> .
@prefix ujgentrybinding: <https://ujg.specs.openuji.org/ed/ns/entry-binding#> .
@prefix ujggraph: <https://ujg.specs.openuji.org/ed/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/ed/ns/entry-binding#> a owl:Ontology ;
  rdfs:label "UJG Entry Binding Editor's Draft Vocabulary"@en ;
  dct:description "UJG Entry Binding ontology declaration" .

### Classes

ujgentrybinding:EntryBinding a owl:Class ;
  rdfs:subClassOf ujg:Node ;
  rdfs:label "Entry Binding" ;
  rdfs:comment "An opaque materialization-context value that selects a JourneyEntry." .

### Properties

ujgentrybinding:entryRef a owl:ObjectProperty ;
  rdfs:domain ujgentrybinding:EntryBinding ;
  rdfs:range ujggraph:JourneyEntry ;
  rdfs:label "entry ref" ;
  rdfs:comment "References the JourneyEntry selected by this EntryBinding." .

ujgentrybinding:value a owl:DatatypeProperty ;
  rdfs:domain ujgentrybinding:EntryBinding ;
  rdfs:range xsd:string ;
  rdfs:label "value" ;
  rdfs:comment "Opaque materialization-context value for selecting the referenced JourneyEntry." .
@prefix ujg: <https://ujg.specs.openuji.org/ed/ns/core#> .
@prefix ujgentrybinding: <https://ujg.specs.openuji.org/ed/ns/entry-binding#> .
@prefix ujggraph: <https://ujg.specs.openuji.org/ed/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/ed/ns/entry-binding#> a owl:Ontology ;
  rdfs:label "UJG Entry Binding Editor's Draft Vocabulary"@en ;
  dct:description "UJG Entry Binding ontology declaration" .

### Classes

ujgentrybinding:EntryBinding a owl:Class ;
  rdfs:subClassOf ujg:Node ;
  rdfs:label "Entry Binding" ;
  rdfs:comment "An opaque materialization-context value that selects a JourneyEntry." .

### Properties

ujgentrybinding:entryRef a owl:ObjectProperty ;
  rdfs:domain ujgentrybinding:EntryBinding ;
  rdfs:range ujggraph:JourneyEntry ;
  rdfs:label "entry ref" ;
  rdfs:comment "References the JourneyEntry selected by this EntryBinding." .

ujgentrybinding:value a owl:DatatypeProperty ;
  rdfs:domain ujgentrybinding:EntryBinding ;
  rdfs:range xsd:string ;
  rdfs:label "value" ;
  rdfs:comment "Opaque materialization-context value for selecting the referenced JourneyEntry." .

5.2. JSON-LD Context

The normative Entry Binding JSON-LD context is defined below and is published at https://ujg.specs.openuji.org/ed/ns/entry-binding.context.jsonld. It provides the compact JSON-LD term mappings and coercions for Entry Binding-specific properties and classes.

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

    "ujgentrybinding": "https://ujg.specs.openuji.org/ed/ns/entry-binding#",
    "entrybinding": "https://ujg.specs.openuji.org/ed/ns/entry-binding#",

    "EntryBinding": "ujgentrybinding:EntryBinding",

    "entryRef": {
      "@id": "ujgentrybinding:entryRef",
      "@type": "@id"
    },
    "value": "ujgentrybinding:value"
  }
}
{
  "@context": {
    "@version": 1.1,

    "ujgentrybinding": "https://ujg.specs.openuji.org/ed/ns/entry-binding#",
    "entrybinding": "https://ujg.specs.openuji.org/ed/ns/entry-binding#",

    "EntryBinding": "ujgentrybinding:EntryBinding",

    "entryRef": {
      "@id": "ujgentrybinding:entryRef",
      "@type": "@id"
    },
    "value": "ujgentrybinding:value"
  }
}

5.3. Validation

The normative Entry Binding SHACL shape is defined below and is published at https://ujg.specs.openuji.org/ed/ns/entry-binding.shape. It is the authoritative validation artifact for Entry Binding structural constraints.

turtle
@prefix ujgentrybinding: <https://ujg.specs.openuji.org/ed/ns/entry-binding#> .
@prefix ujgentrybindingshape: <https://ujg.specs.openuji.org/ed/ns/entry-binding.shape#> .
@prefix ujggraph: <https://ujg.specs.openuji.org/ed/ns/graph#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ujgentrybindingshape:EntryBindingShape a sh:NodeShape ;
  sh:targetClass ujgentrybinding:EntryBinding ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujgentrybinding:entryRef ;
    sh:class ujggraph:JourneyEntry ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujgentrybinding:value ;
    sh:datatype xsd:string ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] .
@prefix ujgentrybinding: <https://ujg.specs.openuji.org/ed/ns/entry-binding#> .
@prefix ujgentrybindingshape: <https://ujg.specs.openuji.org/ed/ns/entry-binding.shape#> .
@prefix ujggraph: <https://ujg.specs.openuji.org/ed/ns/graph#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

ujgentrybindingshape:EntryBindingShape a sh:NodeShape ;
  sh:targetClass ujgentrybinding:EntryBinding ;
  sh:nodeKind sh:IRI ;

  sh:property [
    sh:path ujgentrybinding:entryRef ;
    sh:class ujggraph:JourneyEntry ;
    sh:nodeKind sh:IRI ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] ;

  sh:property [
    sh:path ujgentrybinding:value ;
    sh:datatype xsd:string ;
    sh:minCount 1 ;
    sh:maxCount 1 ;
  ] .

The rules below define the remaining module semantics beyond the structural constraints captured by the SHACL shape.

  1. Entry selection only: Entry Binding properties MUST NOT change Graph validity, graph traversal behavior, import resolution, or core node identity.

  2. Opaque value: Consumers MUST NOT infer materialization syntax, protocol, addressing semantics, execution behavior, fallback behavior, or structured invocation data from value.

  3. Graceful degradation: A consumer that does not implement this module MAY ignore Entry Binding semantics, but it SHOULD preserve recognized JSON-LD data during read-transform-write when possible.

  4. Private runtime hints: Platform-specific invocation configuration that is not intended for shared queryability or validation SHOULD remain in Core extensions.


6. Examples

6.1. Combined JSON Example

json
{
  "@context": [
    "https://ujg.specs.openuji.org/ed/ns/context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/entry-binding.context.jsonld"
  ],
  "@id": "https://example.com/ujg/entry-binding/checkout.jsonld",
  "@type": "UJGDocument",
  "nodes": [
    {
      "@type": "Journey",
      "@id": "urn:ujg:journey:checkout",
      "label": "Checkout",
      "defaultEntryRef": "urn:ujg:entry:checkout-default",
      "entryRefs": [
        "urn:ujg:entry:checkout-default"
      ],
      "stateRefs": [
        "urn:ujg:state:checkout-start"
      ]
    },
    {
      "@type": "JourneyEntry",
      "@id": "urn:ujg:entry:checkout-default",
      "label": "Checkout default",
      "stateRef": "urn:ujg:state:checkout-start"
    },
    {
      "@type": "State",
      "@id": "urn:ujg:state:checkout-start",
      "label": "Checkout start"
    },
    {
      "@type": "EntryBinding",
      "@id": "urn:ujg:entry-binding:checkout",
      "entryRef": "urn:ujg:entry:checkout-default",
      "value": "checkout"
    }
  ]
}
{
  "@context": [
    "https://ujg.specs.openuji.org/ed/ns/context.jsonld",
    "https://ujg.specs.openuji.org/ed/ns/entry-binding.context.jsonld"
  ],
  "@id": "https://example.com/ujg/entry-binding/checkout.jsonld",
  "@type": "UJGDocument",
  "nodes": [
    {
      "@type": "Journey",
      "@id": "urn:ujg:journey:checkout",
      "label": "Checkout",
      "defaultEntryRef": "urn:ujg:entry:checkout-default",
      "entryRefs": [
        "urn:ujg:entry:checkout-default"
      ],
      "stateRefs": [
        "urn:ujg:state:checkout-start"
      ]
    },
    {
      "@type": "JourneyEntry",
      "@id": "urn:ujg:entry:checkout-default",
      "label": "Checkout default",
      "stateRef": "urn:ujg:state:checkout-start"
    },
    {
      "@type": "State",
      "@id": "urn:ujg:state:checkout-start",
      "label": "Checkout start"
    },
    {
      "@type": "EntryBinding",
      "@id": "urn:ujg:entry-binding:checkout",
      "entryRef": "urn:ujg:entry:checkout-default",
      "value": "checkout"
    }
  ]
}

6.2. Private Invocation Hints

json
{
  "@id": "urn:ujg:entry-binding:checkout",
  "@type": "EntryBinding",
  "entryRef": "urn:ujg:entry:checkout-default",
  "value": "checkout",
  "extensions": {
    "com.acme.launcher": {
      "prefetch": "intent",
      "cachePolicy": "stale-while-revalidate"
    }
  }
}
{
  "@id": "urn:ujg:entry-binding:checkout",
  "@type": "EntryBinding",
  "entryRef": "urn:ujg:entry:checkout-default",
  "value": "checkout",
  "extensions": {
    "com.acme.launcher": {
      "prefetch": "intent",
      "cachePolicy": "stale-while-revalidate"
    }
  }
}

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