Skip to content

Support @base for resolvable and non-resolvable #11

Description

@Sveino

Summary

When converting between TriG / JSON-LD and CIMXML, the handling of base IRIs and UUID-based instance identifiers is currently inconsistent and causes ambiguity in identifier construction and serialization.
This ticket defines a clear and deterministic rule set for:

  • Use of @base in TriG and JSON-LD

  • Use of modelURL as dataset-level authority

  • Serialization of UUID-based instance identifiers

  • Differences between CIMXML and RDF syntaxes

The goal is to support object-oriented internal models (UUID without scheme) while producing portable, standards-compliant RDF serializations.

Current behaviour

During conversion from TriG → CIMXML, we observe dataset metadata such as:
<json-ld:base>http://www.Statnett.no/IGM/Nordic44_CGM#</json-ld:base>
with namespace:
xmlns:json-ld="https://www.w3.org/ns/json-ld#"

This appears inside a dcat:Dataset

At the same time:

  • TriG and JSON-LD support @base

  • CIMXML (not RDF/XML in general) currently does not support @base

  • UUID-based identifiers are sometimes emitted as relative values

This issue is related to #9.

Technical clarifications (important)

CIMXML vs RDF/XML

  • RDF/XML does support base IRIs via xml:base

  • CIMXML (current implementation) does not support base IRIs

  • Therefore, CIMXML must not rely on base resolution

rdf:ID vs rdf:about

  • rdf:ID cannot start with a number (XML NCName restriction)

  • rdf:about can start with a number, but then represents a relative IRI

  • Relative IRIs require a base to become absolute

Design intent

We want:

  1. Internal object identity to be simple and OO-friendly

→ UUID string without scheme (e.g. 26cc8d71-…)

  1. External RDF identity to be explicit and deterministic

→ either HTTP-based or urn:uuid:-based

  1. Identical local UUID tokens regardless of output format

  2. No reliance on fragile URN base resolution rules

Decisions

1. Add modelURL

KGraph SHALL expose a dataset-level attribute:

modelURL : absolute HTTP(S) IRI

Example:
https://model4powersystem.eu/NO/

2. Rules for @base in TriG and JSON-LD

HTTP base

  • modelURL SHALL be used as @base in TriG and JSON-LD by default

  • modelURL SHALL end with /

@base <https://model4powersystem.eu/NO/> .
Rationale:

  • Ensures predictable relative IRI expansion

  • Avoids file-vs-directory ambiguity

URN base

  • @base SHALL NOT be used to mint urn:uuid identifiers

  • UUID URNs SHALL be serialized as absolute IRIs

Rationale:

  • @base <urn:uuid:> and @base <urn:uuid:/> produce non-canonical or ambiguous results

  • RFC3986 relative resolution with URNs is not portable across parsers

3. Rules for UUID-based identifiers

Internal representation:

mRID = "26cc8d71-12f1-4de9-9e68-125d95073a75"

Serialization:

Target Output
HTTP model https://model4powersystem.eu/NO/26cc8d71-...
UUID model urn:uuid:26cc8d71-...

The choice is made at serialization time, not by changing the internal object model.

4. Rules for CIMXML output

  • CIMXML SHALL NOT contain:

-- @base

  • json-ld:base

  • CIMXML SHALL always use absolute IRIs in rdf:about

  • Relative identifiers SHALL NOT be emitted in CIMXML

Rationale:

  • CIMXML currently has no base resolution mechanism

  • Absolute IRIs avoid ambiguity and XML name constraints

Examples

TriG (HTTP-based model)

@base <https://model4powersystem.eu/NO/> .
@prefix cim: <https://cim.ucaiug.io/ns#> .

<26cc8d71-12f1-4de9-9e68-125d95073a75>
  a cim:PowerPlant ;
  cim:name "Melkøya" .

Expands to:
https://model4powersystem.eu/NO/26cc8d71-...

TriG (UUID-based model)

@prefix cim: <https://cim.ucaiug.io/ns#> .

<urn:uuid:26cc8d71-12f1-4de9-9e68-125d95073a75>
  a cim:PowerPlant ;
  cim:name "Melkøya" .

incorrect: TriG (UUID-based)

@prefix cim: <https://cim.ucaiug.io/ns#> .
@base <urn:uuid:> .

<26cc8d71-12f1-4de9-9e68-125d95073a75>
  a cim:PowerPlant ;
  cim:name "Melkøya" .

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions