H Mapping to object stores and property graphs§
H.1 Why these rules are fixed here§
A package maps onto an object store almost mechanically: model documents are collections, entities are objects, id is the primary key, and the closed predicate set is the link vocabulary. But four decisions fall outside what the schemas can express, and a consumer that decides them differently from the next consumer produces a different store from the same package — which forfeits, on the last step, the determinism every earlier clause pays for. Annex G fixed the rules for reading foreign vocabularies in; this annex fixes them for writing BUS out.
NOTE Nothing here obliges an exporter. These rules bind the consumer, and only a consumer that wants two independent imports of one package to agree.
H.2 Links§
A store with typed links SHOULD realize every relationship twice: as a direct link of its predicate, for traversal, and — where the relationship carries provenance, qualifiers, a validity interval, or ports — as a link object holding that metadata, since most stores cannot attach properties to an edge. A consumer MUST NOT silently discard relationship metadata to fit an edge-only model: dropping the validity interval turns was connected until the 2019 retrofit into is connected, which is a false statement about the building.
Link cardinality comes from the registry (bus-predicates.json, 9.2), and its ADVISORY grading governs: a consumer SHOULD index to the hinted shape and MUST NOT refuse or truncate instances that exceed it. The registry’s notes name the known cases — dual feeds, check meters, consolidations — and a store that cannot hold them is misrepresenting the buildings where topology matters most.
H.3 Denormalization§
5.3.1 keeps every fact in one place, and stores tuned for interactive query will want some facts copied — a located-in space key on the asset object, not a two-hop traversal. Materialized properties of that kind are a cache, and MUST behave like one: derived from relationships by rule, regenerated on every synchronization, and never exported back as intrinsic properties of the entity. A re-export that turns a cached copy into an asserted fact manufactures an assertion nobody made, which is the 5.3.5 failure in a new coat.
H.4 Open vocabularies in closed stores§
Enumerations are open (7.5) and store enum types are usually closed. A consumer MUST land open-enumeration values as strings — or an equivalent type that admits unknown members — rather than a closed enum that would refuse the next MINOR version’s token, which is the IM-4 failure relocated into the store. Relationship qualifiers land as structured values preserved whole; a consumer that indexes some qualifier keys MUST still retain the ones it does not index.
H.5 Time series and quality§
Stores whose series type is timestamp-and-value have nowhere for the quality column of BUS-2. A consumer MUST NOT silently drop rows whose quality it cannot carry. It SHOULD carry quality as a parallel series per point; where it cannot, it MUST record per-series counts of uncertain, bad and missing rows on the series object, so that the store holds less than the package is a stated fact rather than a discovery.
H.6 Provenance§
Entity-level provenance lands as structured properties on the object. Property-level provenance (7.8) usually has no native home; a consumer SHOULD spill it to provenance records linked to the object, and where it drops it instead MUST say so in whatever completeness statement its import produces. Losing who-asserted-this silently is the one loss this standard was built to make impossible, and an import that reintroduces it has not imported the package — it has imported the data and discarded the understanding.
H.7 What not to import§
The presentation model does not map to a store and is not meant to: drawings, elements and figures are rebuilt in the receiving system’s own display layer (13.9). Two parts of it are data a consumer should still take. Bindings carry the display logic an owner paid for — state maps and range maps from element to point — and translate directly into widget configuration. And a georeferenced drawing (13.3) places every element with geometry into the named CRS, which makes the drawing’s contents spatial data even where its artwork is ignored.