Skip to content

Concepts

Explanation: how DFC data actually works, and why the connectors behave the way they do. Read these when a tutorial told you what to do and you want to know why.

Pages

Page Answers
Identifiers What counts as an @id, what survives a round trip, what breaks references
Relationships How object properties become JSON-LD links, and the single-value shape rule
Cardinality What the ontology states about how many values a property holds, and what it leaves unstated
Context and versioning What a @context does, why it is a URL, how ontology and taxonomy versions differ
Vocabularies Where controlled terms come from, why they are not in the schema
Validation The four levels of "valid", which one actually ships, what the connectors do not reject

How this fits together

tutorials  (docs/getting-started/)     what to do
    ↓ links into
reference  (docs/reference/model/)      what exists -- generated from the schema
    ↓ explained by
concepts   (this directory)             why it works this way

Reference is generated, so it cannot drift from the schema. These pages are written, because the reasoning is not in the schema.

The short version of each

Identifiers are yours. The connectors never generate, rewrite, or validate one, which is deliberate: what counts as a valid identifier depends on your data graph, not on the identifier alone.

Relationships become links by @id, never inline copies. A single-valued reference serialises as a scalar even when you set a one-element array — that is JSON-LD compaction behaviour, and all three connectors match it.

Context binds terms to meanings and is emitted as a URL, bundled for v2.0.0 so everything works offline. Ontology and taxonomy versions are independent because they are versioned separately upstream.

Vocabularies are five external SKOS taxonomies, bundled but never enforced. A concept CURIE that does not exist is still just a string that exports cleanly.

Validation — only SHACL shapes ship. The connectors preserve and normalise, they do not reject, and they keep exactly what the schema says a class can hold — which means a document mixing in your own predicates does not survive a round trip. See property retention before you rely on that.