Created by S.M. Richard and claude-code 2026-02-15
Core modular schema components following the OGC Building Blocks pattern for implementation of modular interoperable metadata for the Cross-Domain Interoperability Framework (CDIF). Each building block is a self-contained directory with a JSON Schema, JSON-LD context, metadata, and description. Building blocks compose into profiles that define complete metadata schemas for specific use cases.
This repository contains the shared core building blocks (schema.org properties, CDIF properties, PROV-O provenance, SKOS vocabulary, Bioschemas, data quality, XAS spectroscopy, and DDI-CDI). Domain-specific building blocks have been refactored into separate repositories:
- ddeBuildingBlocks — DDE (Deep-time Digital Earth) geoscience properties and profiles (7 BBs + 11 profiles)
- geochemBuildingBlocks — ADA (IEDA Analytics & Data Archive) geochemistry properties and profiles (30 BBs + 36 profiles)
- ecrrBuildingBlocks — ECRR (EarthCube Resource Registry) properties and profiles (10 BBs + 11 profiles)
Domain-specific repos reference core building blocks in this repository via absolute URLs (https://cross-domain-interoperability-framework.github.io/metadataBuildingBlocks/_sources/...).
For more info see the OGC Documentation.
The schema pipeline transforms modular YAML source schemas into JSON Forms-compatible Draft 7 schemas in two steps, plus an augmentation step for the bblocks-viewer:
schema.yaml → resolve_schema.py → resolvedSchema.json → convert_for_jsonforms.py → schema.json
→ augment_register.py → register.json (adds resolvedSchema URLs)
Resolves all external $ref references from modular YAML/JSON source schemas into a single standalone JSON Schema and writes it to resolvedSchema.json next to each schema.yaml. Output is in structured form: composing BBs are deep-merged into properties + allOf, frequently-used type schemas (Person, Identifier, Organization, etc.) appear as named $defs with internal $refs, and recursive types stay as $ref cycles. Types used ≤2 times are inlined at usage sites. The structured output is recursion-safe and typically 88–90% smaller than the older fully-inlined form. Handles relative paths, fragment-only refs (#/$defs/X), cross-file fragments, URL refs (including transitive relative refs within fetched files), and both YAML/JSON extensions.
# Resolve a profile by name (searches profiles/cdifProfile/ and
# profiles/cdifCompositeProfile/ for modules and composites respectively)
python tools/resolve_schema.py CoreDiscovery
# Resolve all building blocks with external $refs (writes each BB's resolvedSchema.json)
python tools/resolve_schema.py --all
# Resolve an arbitrary schema file
python tools/resolve_schema.py --file path/to/any/schema.yaml -o resolvedSchema.jsonThe legacy --structured flag is accepted but ignored — structured form is the only output mode.
Requirements: Python 3.6+ with pyyaml (pip install pyyaml)
Reads resolvedSchema.json and converts to JSON Forms-compatible Draft 7:
- Converts
$schemafrom Draft 2020-12 to Draft 7 - Simplifies
anyOfpatterns for form rendering - Converts
contains→enum,const→default - Removes
notconstraints and relaxesminItems
# Convert all profiles
python tools/convert_for_jsonforms.py --all -v
# Convert a single profile
python tools/convert_for_jsonforms.py CoreDiscovery -vAdds resolvedSchema URLs to build/register.json for each profile building block that has a resolvedSchema.json file. This enables the bblocks-viewer's "Resolved (JSON)" button to fetch and display the standalone resolved schema (structured form — external $refs resolved into $defs + internal $refs; recursive types stay as $ref cycles).
python tools/augment_register.pyThe generate-jsonforms workflow runs this automatically after schema conversion.
Replaces the OGC bblocks-postprocess report.html with a version that shows granular validation labels instead of binary PASS/FAIL. Parses SHACL severity levels (Violation, Warning, Info) from the report data and displays them as separate badges.
- JSON Schema Fail (red) if JSON Schema validation fails
- SHACL: N Violation, N Warning, N Info with color-coded severity
- SHACL Warnings and Info do not cause a building block to be marked as failed
python tools/generate_custom_report.pyThe deploy-viewer workflow runs this automatically after augment_register.py.
A static HTML browser rendering each profile module / composite as a UML class diagram + per-class pages. Two emitters feed the same browser:
- XMI-driven pipeline (
tools/uml_to_schema.py+ the ucmism2m mapping configs at../ucmism2m/configuration/) — drives most pages. Eachddi-cdi2<slug>_mapping.jsonconfig controls one profile's class set, withcomposes:chaining for composites. Run via../ucmism2m/script/build-docs.ps1(needs Java +tools/plantuml.jar; the Docker bblocks-postprocess step is optional, skip with-SkipBblocks). - JSON-schema-direct tool (
tools/jsonschema_to_html.py) — generates HTML + PlantUML SVGs straight from a profile module'sschema.yaml. No XMI / mapping config needed; useful for tight modules where the schema is the single source of truth. Run viapython tools/jsonschema_to_html.py cdifConceptScheme.
Both emitters share the same _static/style.css + diagram.js for visual consistency and click-to-zoom / pan / copy on the SVGs. The root cdif-uml-model/index.html splits profiles into Composite Profiles and Profiles sections, driven by cdif-uml-model/_categories.json (a umlName → 'composite' | 'module' map written by build-docs.ps1).
Diagram layout uses three skinparams (ranksep 250, nodesep 20, linetype ortho) to push the bounding box toward ~1:1 aspect ratio instead of the default very-wide Graphviz dot layout.
Generates a CDIF building-block schema.yaml (plus bblock.json/context.jsonld/rules.shacl/examples.yaml skeletons) from a DDI-CDI / UCMIS class model. Used to bootstrap and refresh the _sources/ddiProperties/ddicdi* BBs. The XMI format is auto-detected: both the canonical XMI 2.5.1 (OMG namespaces, uml:Model) and the Enterprise Architect native XMI 1.1 export (xmlns:UML="omg.org/UML1.3") are supported — both parsers emit the same internal model so the rest of the generator is format-agnostic.
Generated schemas follow the project's conventions: Node-only root (no single/array/@graph wrapper); class-typed properties default to inline-or-ref with sibling-BB lookup before local inline; UCMIS overload of duplicate role names merged via flat anyOf; multiplicity → array-only when upper is *; UML generalization walked with subclass-shadows-parent.
python tools/uml_to_schema.py \
--xmi C:/path/to/ddi-cdi_ea15.2026.March.xml \
--class EnumerationDomain \
--bb-name ddicdiEnumerationDomain \
--out-dir _sources/ddiProperties/See agents.md for full CLI options and convention details.
Requirements: Python 3.10+ with pyyaml
audit_ddi_xmi_consistency.py— checks the_sources/ddiPropertiesBBs against a DDI-CDI EA XMI export: flags classes a BB references that are no longer in the model, attributes/associations added or dropped, and (with--dump-class) prints a class's full member set.python tools/audit_ddi_xmi_consistency.py --xmi <xmi> [--bb NAME] [--dump-class A,B]audit_cdif_vs_ddi.py— checks that everycdi:-prefixed property in_sources/cdifDataType(and_sources/profiles/cdifProfile/) has a value-type shape consistent with the corresponding_sources/ddiPropertiesdefinition; classifies MATCH / SOFT / STRUCTURAL / CDIF-ONLY.
Validates all example JSON files against their resolved schemas. Uses schema_resolver.py's SchemaResolver for proper $defs and cross-file $ref handling, with fallback to tools/resolve_schema.py for schemas with circular references.
python tools/validate_examples.py --verbose
python tools/validate_examples.py --filter personRequirements: Python 3.6+ with pyyaml, jsonschema
Optional, standalone SHACL validation for one building block or profile (the JSON-Schema validate_examples.py stays the default gate). Gathers the target's rules.shacl plus every transitively-composed BB's rules, expands the target's examples from JSON-LD to RDF, and runs pyshacl. Report-only by default; --strict fails on sh:Violation. Catches cross-reference constraints JSON Schema can't (e.g. "every RepresentedVariable used by a component must be instantiated by an InstanceVariable").
python tools/validate_shacl.py DiscoveryDataDescriptionStructure
python tools/validate_shacl.py DiscoveryDataDescriptionStructure --verbose
python tools/validate_shacl.py DiscoveryDataDescriptionStructure --strictRequirements: pyshacl (pulls in rdflib) — pip install --user pyshacl
Comprehensive audit tool for any OGC Building Block repository. Checks file completeness, schema consistency, example validation, SHACL completeness, and property coverage.
python tools/audit_building_blocks.py -v
python tools/audit_building_blocks.py /path/to/_sources -v
python tools/audit_building_blocks.py --json -o report.jsonRequirements: Python 3.6+ with pyyaml, jsonschema
Generates propertyTree_2 worksheets from resolved JSON Schemas showing complete property hierarchy with type suffixes and array cardinality.
python tools/generate_property_tree2.py --profile all
python tools/generate_property_tree2.py --profile discoveryRequirements: Python 3.6+ with openpyxl, pyyaml
Each building block and profile includes example JSON-LD instances:
- Minimal (
*Minimal.json) — only required properties, simplest valid record - Complete (
*Complete.json) — exercises every property allowed by the schema
Validate examples with:
python tools/validate_examples.py --verbose
python tools/validate_examples.py --filter CDIFDiscovery --verboseProfile content is split across two trees (2026-05 reorg):
_sources/profiles/cdifProfile/— profile modules. Tight, self-contained building blocks that each add one slice of metadata (discovery properties, data-description extensions, archive distribution, provenance, …). Modules do NOT compose cdifCore; they're composed by composite profiles._sources/profiles/cdifCompositeProfile/— composite profiles. ThinallOfchains over modules; these are what an instance document validates against._sources/profiles/archive/— deprecated / not-promoted-to-composite (e.g.CDIFCodelistProfile).
| Composite | Composes (allOf) | Notes |
|---|---|---|
CoreDiscovery |
cdifCore + cdifDiscovery | Smallest valid CDIF dataset metadata record |
DiscoveryDataDescription |
cdifCore + cdifDiscovery + cdifDataDescription | Adds per-variable physical types, primary key, statistics, per-distribution physical mappings, file fingerprint |
DiscoveryDataDescriptionStructure |
+ cdifDataStructure | Full DDI-CDI structural complexity (DataStructure variants Dimensional / Long / Wide, six component subtypes, PrimaryKey / ForeignKey over RepresentedVariables with cdif:position) |
XASdata |
cdifCore + cdifDiscovery + cdifDataDescription + xasProperties (xasCore, xasOptional) | X-ray Absorption Spectroscopy profile |
cdifComplete |
cdifCore + cdifDiscovery + cdifDataDescription + cdifDataStructure + cdifManifest + cdifProvenance | Everything |
| Module | Adds (on a CDIFCore Dataset) |
|---|---|
cdifCore |
Foundational schema:Dataset shape — identifiers, name/description, distribution, license, agents, dateModified, subjectOf → CatalogRecord |
cdifDiscovery |
schema:measurementTechnique, schema:variableMeasured (PropertyValue), schema:spatialCoverage, schema:temporalCoverage, dqv:hasQualityMeasurement |
cdifDataDescription |
cdif:hasPrimaryKey, cdif:statistics, InstanceVariable with cdif:physicalDataType, cdif:hasPhysicalMapping (PhysicalMapping / TextMapping / LocatorMapping), cdi:characterSet, cdi:fingerprint, DataDownload co-typing as cdi:TabularTextDataSet / cdi:StructuredDataSet |
cdifDataStructure |
Distribution-level cdi:isStructuredBy → DataStructure / Dimensional / Long / Wide; six component subtypes; cdi:has_PrimaryKey + cdi:has_ForeignKey over RepresentedVariables (membership wrapped with required cdif:position integer) |
cdifManifest |
schema:hasPart on a DataDownload listing schema:MediaObject component files. Conditional: when schema:encodingFormat contains application/zip, schema:hasPart is required. Requires cdif:manifest/1.0 conformsTo. (Merged from the previous cdifArchive BB.) |
cdifProvenance |
prov:wasGeneratedBy → ProvActivity array (instruments, agents, temporal bounds, methodology, action chaining) |
cdifCodelist |
skos:ConceptScheme shape constrained for CDIF codelist use |
cdifConceptScheme |
SKOS concept scheme wrapper (thin) |
See agents.md for the full building block structure, authoring rules, and composition hierarchy.
Per-profile repos publish the release form of these profiles for implementers (GitHub org Cross-Domain-Interoperability-Framework): profile (module) repos profile-core, profile-discovery, profile-datadescription, profile-datastructure, profile-provenance, profile-manifest, profile-codelist, profile-conceptscheme, and composite-profile repos doc-corediscovery, doc-discoverydatadescription, doc-discoverydatadescriptionstructure. (Renamed + expanded in the 2026-05 reorg from the original four core/discovery/datadescription/codelist.) Each carries a *StructuredSchema.json (generated here via resolve_schema.py <Profile> --structured), a merged *Rules.shacl, an implementation guide (.md/.docx), JSON-LD frame, and validated examples. They are manually synced from this repo (no automation) — see agents.md §"Release profile repos & sync".
Some building blocks define item-level schemas (e.g., a single provenance activity, or a single archive distribution item) rather than root-level dataset properties. These cannot be placed directly in a profile's allOf because their constraints would apply to the root dataset object instead of to items within a property array.
Wrapper building blocks solve this by defining a root-level property whose items reference the item-level building block. This keeps profiles as pure allOf compositions of building block refs, with no inline property definitions.
| Wrapper | Root Property | Item Building Block |
|---|---|---|
cdifProvenance |
prov:wasGeneratedBy (array) |
cdifProvActivity |
cdifManifest |
schema:distribution (array, adds archive option) |
cdifArchive |
For example, cdifProvActivity defines the schema for a single provenance Activity object. The cdifProvenance wrapper defines prov:wasGeneratedBy as an array of cdifProvActivity items, making it composable at the profile level. Similarly, cdifArchive defines the schema for a single archive DataDownload item (with schema:hasPart component files), and cdifManifest adds it as a valid schema:distribution item type alongside the DataDownload and WebAPI options already provided by cdifCore.
| Category | Directory | Description |
|---|---|---|
| schemaorgProperties | _sources/schemaorgProperties/ |
schema.org vocabulary building blocks (person, organization, identifier, definedTerm, instrument, etc.) |
| cdifDataType | _sources/cdifDataType/ |
CDIF data-type / value-object building blocks: cdifInstanceVariable, cdifKey, cdifEnumerationDomain, cdifValueDomain, cdifRepresentedVariable, cdifDataStructureComponent, cdifDescriptorVariable, cdifPhysicalMapping, cdifTextMapping, cdifLocatorMapping, cdifTabularTextDataSet, cdifStructuredDataSet, cdifDataFingerprint, cdifStatistics, cdifCatalogRecord, cdifReference, cdifProvActivity, cdifOpenApi, cdifTabularData, cdifDataCube, cdifLongData. (Renamed from cdifProperties in the 2026-05 reorg; profile-level BBs that compose these moved to _sources/profiles/cdifProfile/.) |
| ddiProperties | _sources/ddiProperties/ |
DDI-CDI vocabulary building blocks |
| provProperties | _sources/provProperties/ |
PROV-O provenance (generatedBy, derivedFrom, provActivity) |
| skosProperties | _sources/skosProperties/ |
W3C SKOS vocabulary building blocks (ConceptScheme, Concept, Collection) |
| qualityProperties | _sources/qualityProperties/ |
DQV data quality measures |
| xasProperties | _sources/xasProperties/ |
X-ray Absorption Spectroscopy domain properties |
| bioschemasProperties | _sources/bioschemasProperties/ |
Bioschemas vocabulary building blocks (lab protocols, samples, computational workflows) |
| cdifProfile (modules) | _sources/profiles/cdifProfile/ |
Profile-module building blocks: cdifCore, cdifDiscovery, cdifDataDescription, cdifDataStructure, cdifManifest, cdifProvenance, cdifCodelist, cdifConceptScheme |
| cdifCompositeProfile | _sources/profiles/cdifCompositeProfile/ |
Composite profiles assembled via composes from the modules above: CoreDiscovery, DiscoveryDataDescription, DiscoveryDataDescriptionStructure, XASdata, cdifComplete |
| archive | _sources/profiles/archive/ |
Deprecated profiles retained for reference (e.g. CDIFCodelistProfile) |
DDI-CDI vocabulary building blocks for communities using the DDI Cross-Domain Integration standard natively. Most are generated from a DDI-CDI XMI export of the Enterprise Architect UML model via tools/uml_to_schema.py, which auto-detects the canonical XMI 2.5.1 and the EA-native XMI 1.1 formats (see agents.md for details). The set was reconciled against the 2026-03 DDI-CDI model: ddicdiDataStore was retired in favour of ddicdiLogicalRecordRepository, ddicdiPhysicalSegmentLayout in favour of ddicdiPhysicalMapping, and ddicdiStatistics / ddicdiKeyValueStructure / ddicdiCollections were added. The table below is representative, not exhaustive.
Each BB's schema.yaml validates a single Node (or, for multi-class BBs, an anyOf of Node $defs); profile schemas wrap nodes for @graph JSON-LD documents. Class-typed properties default to inline-or-ref (anyOf [class def, id-reference]), where the class def comes from another BB if one owns that class, otherwise inlined locally.
| Building Block | Description |
|---|---|
ddicdiActivity |
DDI-CDI Activity class (DDICDILibrary/Classes/Process) -- describes tasks using cdi:Activity, cdi:Step, and cdi:Parameter. Includes cdi:definition (InternationalString), cdi:start/cdi:end (timestamps), cdi:hasInternal (ControlLogic), cdi:entityUsed/cdi:entityProduced (References), and cdi:has_Step with cdi:script (CommandCode). SHACL shapes for Activity and Step. |
ddicdiDataTypes |
Shared DDI-CDI data types used across BBs: identifiers (cdi:Identifier, cdi:NonDdiIdentifier, cdi:IRDI), names (cdi:ObjectName, cdi:IndividualName, cdi:OrganizationName), contact information (cdi:ContactInformation, cdi:Address, cdi:Email, cdi:Telephone, cdi:WebLink), references (cdi:Reference, cdi:ControlledVocabularyEntry, cdi:PairedControlledVocabularyEntry), strings (cdi:InternationalString, cdi:LanguageString), and others (cdi:DateRange, cdi:CombinedDate, cdi:PrivateImage, cdi:CatalogDetails, cdi:AccessLocation). |
ddicdiIndividual |
DDI-CDI Individual agent (person) with cdi:individualName (IndividualName), cdi:contactInformation, and identification. Refs ddicdiDataTypes for shared data types. |
ddicdiMachine |
DDI-CDI Machine agent (software/hardware) with cdi:accessLocation, cdi:function, cdi:machineInterface, and cdi:typeOfMachine. Refs ddicdiDataTypes for shared data types. |
ddicdiOrganization |
DDI-CDI Organization agent (group/institution) with cdi:organizationName (OrganizationName), cdi:contactInformation, and identification. Refs ddicdiDataTypes for shared data types. |
ddicdiProcessingAgent |
DDI-CDI ProcessingAgent that orchestrates activities via cdi:performs and cdi:operatesOn (ProductionEnvironment references). Refs ddicdiDataTypes for shared data types. |
ddicdiAgent |
Umbrella building block composing the 4 agent subtypes (ddicdiIndividual, ddicdiMachine, ddicdiOrganization, ddicdiProcessingAgent) via root anyOf of $ref to each sub-BB. |
ddicdiValueDomain |
DDI-CDI ValueDomain (DDICDILibrary/Classes/Representations) -- multi-root BB covering both cdi:SubstantiveValueDomain (subject-matter values) and cdi:SentinelValueDomain (processing/missing-value codes like SAS .R, SPSS 999). Includes cdi:isDescribedBy (ValueAndConceptDescription with min/max bounds, regex, classification level), cdi:takesValuesFrom (refs ddicdiEnumerationDomain), cdi:takesConceptsFrom (Substantive/SentinelConceptualDomain), and cdi:platformType (sentinel only). |
ddicdiEnumerationDomain |
DDI-CDI EnumerationDomain — base class acting as an extension point so all codifications (codelist, statistical classification, etc.) are usable as enumerated value domains. Refs LevelStructure, CategorySet, Concept. |
ddicdiCodeList |
DDI-CDI CodeList (extends EnumerationDomain) — collection of cdi:Codes with their cdi:CodePositions. Both targets reachable via cdi:has (merged anyOf). |
ddicdiStatisticalClassification |
DDI-CDI StatisticalClassification (extends EnumerationDomain) — full classification with cdi:has reaching ClassificationItem / ClassificationItemPosition / LevelStructure, plus cdi:isMaintainedBy (refs ddicdiOrganization), cdi:isIndexedBy (ClassificationIndex), and self-references for variant/successor/predecessor lineage. |
ddicdiControlledVocabularyEntry |
DDI-CDI ControlledVocabularyEntry — entry from an externally maintained controlled vocabulary. 5 properties: cdi:entryReference, cdi:entryValue, cdi:name, cdi:valueForOther, cdi:vocabulary. Same shape as the inlined dt-ControlledVocabularyEntry $def in ddicdiDataTypes. |
ddicdiDataStructure |
DDI-CDI DataStructure — multi-root BB covering DataStructure plus the four leaf subclasses (Dimensional, KeyValue, Long, Wide). Inherits component properties from DataStructureComponent: cdi:has → ForeignKey (1..*), cdi:identifier, cdi:isDefinedBy → RepresentedVariable (refs ddicdiRepresentedVariable), cdi:semantic, cdi:specialization. |
ddicdiDataStructureComponent |
DDI-CDI DataStructureComponent subclasses (IdentifierComponent, MeasureComponent, AttributeComponent, DimensionComponent, VariableValueComponent, VariableDescriptorComponent). |
ddicdiRepresentedVariable |
DDI-CDI RepresentedVariable — variable definition with cdi:takesSubstantiveValuesFrom / cdi:takesSentinelValuesFrom (refs ddicdiValueDomain), conceptual domains, unit-of-measure, and intended data type. Pulled out as its own BB to break the DataStructure → RepresentedVariable → ValueDomain transitive cascade. |
ddicdiInstanceVariable |
DDI-CDI InstanceVariable plus the RepresentedVariable property set (ConceptualVariable-level properties excluded). |
ddicdiPresentationalVariable |
DDI-CDI ReferenceVariable / DescriptorVariable — long-format presentational variables. |
ddicdiLogicalRecord |
DDI-CDI LogicalRecord. |
ddicdiLogicalRecordRepository |
DDI-CDI LogicalRecordRepository — successor to the retired DataStore class (renamed and relocated to the FormatDescription package in the 2026-03 model). $defs for LogicalRecordRepositoryStructure, LogicalRecordRelationship (successor to RecordRelation), and InstanceVariableMap. |
ddicdiPhysicalDataSet |
DDI-CDI PhysicalDataSet subclasses (Wide / Long / Dimensional / Tabular / Structured DataSet). |
ddicdiPhysicalMapping |
DDI-CDI PhysicalMapping — successor to the retired ValueMapping class; describes how an InstanceVariable's values are physically represented. Root validates cdi:PhysicalMapping / cdi:TextMapping / cdi:LocatorMapping; $def for PhysicalMappingPosition. |
ddicdiStatistics |
DDI-CDI Statistics / CategoryStatistics / StatisticsCollection — summary and per-category statistics for an instance variable. |
ddicdiKeyValueStructure |
DDI-CDI KeyValueStructure family (KeyValue package): KeyValueStructure, KeyValueDataStore, InstanceKey, MainKeyMember, ContextualComponent, SyntheticIdComponent. |
ddicdiCollections |
DDI-CDI CollectionsPattern: the generic Collection / List / Map / Member / MemberRelationship / Position / Structure / Comparison machinery. |
W3C SKOS vocabulary building blocks for controlled vocabulary and codelist representation.
| Building Block | Description |
|---|---|
skosConceptScheme |
SKOS ConceptScheme with skos:hasTopConcept, prefLabel, and nested concepts. Composed by cdifConceptScheme (cdifProfile) and the archived CDIFCodelistProfile. |
skosConcept |
SKOS Concept with prefLabel, notations, broader/narrower/related hierarchical relations, cross-scheme mapping properties, and documentary notes. Defines $defs: ConceptRef, LanguageTaggedValue. |
skosCollection |
SKOS Collection and OrderedCollection. Collection groups concepts via skos:member; OrderedCollection preserves ordering via JSON-LD @list. References skosConcept for concept items. |
Schema.org vocabulary building blocks for reusable metadata components.
| Building Block | Description |
|---|---|
instrument |
Generic instrument or instrument system -- uses schema:Thing base type with optional schema:Product typing. Supports hierarchical instrument systems via schema:hasPart for sub-components. Instruments are nested within prov:used items via a schema:instrument sub-key (instruments are prov:Entity subclasses). Referenced by cdifProvActivity, provActivity, and xasInstrument. |
statisticalVariable |
schema:StatisticalVariable — a variable representing a statistical measure. Properties: @type, @id, schema:name, schema:description, schema:measurementTechnique, schema:statType, schema:measuredProperty. Uses definedTerm building block. |
actionResult |
The schema:result of a schema:Action on a WebAPI distribution — the format/serialization of the data the service returns. Typed schema:DataDownload but with no schema:contentUrl/schema:contentSize (the response is generated per request). Properties: @type, schema:name, schema:description, schema:encodingFormat, dcterms:conformsTo. Referenced by the action BB's schema:result. |
PROV-O provenance building blocks.
| Building Block | Description |
|---|---|
generatedBy |
Base provenance activity -- minimal prov:Activity with prov:used. Extended by cdifProvActivity and provActivity. |
provActivity |
PROV-O native provenance activity -- extends generatedBy with W3C PROV-O properties (prov:wasAssociatedWith, prov:startedAtTime, prov:endedAtTime, prov:atLocation, prov:wasInformedBy, prov:generated). Uses schema.org fallbacks only where PROV-O has no equivalent (name, description, methodology, status). Instruments nested in prov:used via schema:instrument sub-key. |
derivedFrom |
Provenance derivation -- prov:wasDerivedFrom linking. |
The repository implements a three-tier provenance architecture:
| Tier | Building Block | Introduced At | Description |
|---|---|---|---|
| 1 (simple) | generatedBy (provProperties) |
cdifCore |
Minimal prov:Activity — prov:used accepts only string names or @id references |
| 2 (extended) | cdifProvActivity (cdifDataType) |
cdifComplete (via cdifProvenance, both in cdifProfile/) |
Extends generatedBy with schema.org Action properties (schema:agent, schema:actionProcess, schema:object, schema:result, temporal bounds, location). Requires @type: ["schema:Action", "prov:Activity"]. Instruments nested in prov:used via schema:instrument sub-key. The cdifProvenance building block wraps cdifProvActivity items in the prov:wasGeneratedBy root property. |
| 3 (domain) | xasGeneratedBy, etc. |
Domain-specific profiles | Extend cdifProvActivity with domain-specific instrument types, agents, and additional properties (see ddeBuildingBlocks, geochemBuildingBlocks) |
| Building Block | Description |
|---|---|
xasSample |
Material sample that is the schema:mainEntity of an XAS analysis (extends schema:Product). |
xasInstrument |
XAS instrument with schema:hasPart for hierarchical sub-components (refs generic instrument building block). |
xasFacility |
XAS facility (synchrotron source / beamline host). |
xasGeneratedBy |
XAS analysis event — extends cdifProvActivity with xas:AnalysisEvent typing, XAS facility location, sample object, XAS-specific instrument types, and XAS additional properties (edge_energy, calibration method, etc.). |
xasXdiTabularTextDataset |
XDI data structure description — fixed-width tabular text dataset for XAS experiment results. |
xasCore |
XAS mandatory properties — prov:wasGeneratedBy items use allOf with cdifProvActivity + NXsource/NXmonochromator instrument constraints via schema:instrument sub-key. |
xasOptional |
Same provenance structure as xasCore — cdifProvActivity activity with XAS instrument constraints. |
Each building block that represents a CDIF specification component declares a required dcterms:conformsTo URI in the metadata catalog record (schema:subjectOf). When building blocks are composed into profiles via allOf, these constraints roll up automatically — the conformsTo array must include URIs for all constituent building blocks. Corresponding SHACL shapes enforce the same constraints via sh:hasValue on dcterms:conformsTo.
See agents.md → Building Block Conformance URIs for the canonical table of URIs, the per-profile rollup, the URI convention (no trailing slash), and the JSON Schema / SHACL patterns used to enforce them.
Each building block has a persistent HTTP URI under https://w3id.org/cdif/bbr/metadata/. The URI pattern is:
https://w3id.org/cdif/bbr/metadata/{category}/{name}
where {category} is one of schemaorgProperties, cdifDataType, provProperties, qualityProperties, ddiProperties, xasProperties, skosProperties, bioschemasProperties, or profiles/cdifProfile / profiles/cdifCompositeProfile, and {name} is the building block directory name (e.g., person, cdifProvActivity, xasGeneratedBy, cdifCore, CoreDiscovery).
Examples:
https://w3id.org/cdif/bbr/metadata/schemaorgProperties/personhttps://w3id.org/cdif/bbr/metadata/cdifDataType/cdifProvActivityhttps://w3id.org/cdif/bbr/metadata/xasProperties/xasGeneratedBy
The register root https://w3id.org/cdif/bbr/metadata resolves to the building blocks viewer home page.
All redirects use HTTP 303 (See Other).
A single building block URI serves different representations depending on the Accept header:
| Accept header | Returns |
|---|---|
text/html (default) |
Landing page in the building blocks viewer |
application/schema+json |
JSON Schema (JSON format) |
application/yaml |
JSON Schema (YAML format) |
text/turtle |
SHACL validation rules (Turtle) |
application/ld+json |
JSON-LD context |
application/json |
Full JSON documentation |
# Landing page (browser default)
curl -L https://w3id.org/cdif/bbr/metadata/schemaorgProperties/person
# JSON Schema
curl -L -H "Accept: application/schema+json" \
https://w3id.org/cdif/bbr/metadata/schemaorgProperties/person
# SHACL rules
curl -L -H "Accept: text/turtle" \
https://w3id.org/cdif/bbr/metadata/schemaorgProperties/person
# JSON-LD context
curl -L -H "Accept: application/ld+json" \
https://w3id.org/cdif/bbr/metadata/schemaorgProperties/personThese resolve directly to the named resource regardless of Accept header:
| Sub-path | Returns |
|---|---|
.../{category}/{name}/schema |
JSON Schema (YAML; or JSON via Accept: application/json) |
.../{category}/{name}/resolved |
Resolved schema -- all $ref inlined (JSON) |
.../{category}/{name}/shacl |
SHACL validation rules (Turtle) |
.../{category}/{name}/context |
JSON-LD context |
curl -L https://w3id.org/cdif/bbr/metadata/schemaorgProperties/person/schema
curl -L https://w3id.org/cdif/bbr/metadata/schemaorgProperties/person/resolved
curl -L https://w3id.org/cdif/bbr/metadata/schemaorgProperties/person/shacl
curl -L https://w3id.org/cdif/bbr/metadata/schemaorgProperties/person/contextThis work is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0).
This material is based upon work supported by the National Science Foundation (NSF) under awards 2012893, 2012748, and 2012593.