From d942ef975f67a735a016eae4d156095705082c15 Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:15:23 +0200 Subject: [PATCH 1/5] Create controlled-value.json A new FDO type to accommodate the controlled values in terms. Example topicDiscipline has a value called Botany. We need a schema to indicate that this a value and it belongs to a term and also vice versa. In essence the term and controlled-value are mostly same but with the above distinction. we need separate entities to link terms with values and extend the term also in future have hierarchies. --- .../controlled-value/controlled-value.json | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 data-model/fdo-type/controlled-value/controlled-value.json diff --git a/data-model/fdo-type/controlled-value/controlled-value.json b/data-model/fdo-type/controlled-value/controlled-value.json new file mode 100644 index 0000000..b68ee5f --- /dev/null +++ b/data-model/fdo-type/controlled-value/controlled-value.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.dissco.tech/schemas/fdo-type/controlled-value/0.1.0/controlled-value.json", + "title": "DiSSCo Controlled Value", + "description": "A schema for defining individual controlled values used in openDS Terms.", + "type": "object", + "properties": { + "@id": { + "type": "string", + "description": "The unique identifier (handle) of the controlled value", + "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/.+", + "examples": [ + "https://hdl.handle.net/20.500.1025/topicDiscipline/Botany" + ] + }, + "@type": { + "type": "string", + "const": "ods:ControlledValue", + "description": "The type of the digital object" + }, + "ods:fdoType": { + "type": "string", + "description": "The DOI to the FDO type of the object", + "pattern": "^https://doi\\.org/[\\w\\.]+/[\\w\\.]+", + "examples": [ + "https://doi.org/21.T11148/bbad8c4e101e8af01115", + "https://doi.org/21.T11148/894b1e6cad57e921764e" + ] + }, + "ods:status": { + "type": "string", + "enum": [ + "ods:Draft", + "ods:Active", + "ods:Tombstone" + ], + "description": "The status of the Digital Object", + "examples": [ + "ods:Active" + ] + }, + "ods:version": { + "type": "integer", + "description": "The version of the object, each change generates a new version. The version starts at 1 and each change will increment the version number with 1", + "minimum": 1, + "examples": [ + 1 + ] + }, + "ods:hasAgents": { + "type": "array", + "description": "Contains all agents that are connected to the specimen. Agents that are part of a specific part of the specimen should be added there. For example, a Collector is connected to the CollectingEvent so is added in the event.", + "items": { + "type": "object", + "$ref": "https://schemas.dissco.tech/schemas/fdo-type/shared-model/0.4.0/agent.json" + } + }, + "dcterms:title": { + "type": "string", + "description": "The title of the controlled value", + "examples": [ + "Botany" + ] + }, + "skos:prefLabel": { + "type": "string", + "description": "Preferred label for the value", + "examples": [ + "Botany" + ] + }, + "skos:definition": { + "type": "string", + "description": "A concise definition of the controlled value", + "examples": [ + "The scientific study of plants." + ] + }, + "skos:inScheme": { + "type": "string", + "format": "uri", + "description": "The PID of the Term (e.g. ods:topicDiscipline) this value belongs to", + "examples": [ + "https://hdl.handle.net/20.500.1025/topicDiscipline" + ] + }, + "owl:deprecated": { + "type": "boolean", + "description": "Indicates whether the value is deprecated", + "examples": [false] + }, + "dcterms:created": { + "type": "string", + "format": "date-time", + "description": "Timestamp of creation" + }, + "dcterms:modified": { + "type": "string", + "format": "date-time", + "description": "Timestamp of last modification" + } + }, + "required": [ + "@id", + "@type", + "dcterms:title", + "skos:prefLabel", + "skos:definition", + "skos:inScheme", + "owl:deprecated", + "ods:version", + "ods:hasAgents", + "dcterms:created", + "dcterms:modified" + ] +} From 011f2f7a034b2594433cfb2e8b5e150644a60f8c Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:20:25 +0200 Subject: [PATCH 2/5] add botany example --- .../controlled-value/examples/botany.json | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 data-model/fdo-type/controlled-value/examples/botany.json diff --git a/data-model/fdo-type/controlled-value/examples/botany.json b/data-model/fdo-type/controlled-value/examples/botany.json new file mode 100644 index 0000000..6ea60c2 --- /dev/null +++ b/data-model/fdo-type/controlled-value/examples/botany.json @@ -0,0 +1,23 @@ +{ + "@id": "https://hdl.handle.net/20.500.1025/topicDiscipline/Botany", + "@type": "ods:ControlledValue", + "ods:fdoType": "https://doi.org/21.T11148/bbad8c4e101e8af01115", + "ods:status": "ods:Active", + "ods:version": 1, + "ods:hasAgents": [ + { + "@id": "https://orcid.org/0000-0002-1825-0097", + "@type": "schema:Person", + "schema:name": "FirstName LastName", + "schema:roleName": "Creator", + "dcterms:created": "2024-01-15T10:30:00Z" + } + ], + "dcterms:title": "Botany", + "skos:prefLabel": "Botany", + "skos:definition": "The scientific study of plants.", + "skos:inScheme": "https://hdl.handle.net/20.500.1025/topicDiscipline", + "owl:deprecated": false, + "dcterms:created": "2024-01-15T10:30:00Z", + "dcterms:modified": "2024-01-15T10:30:00Z" +} From a46e4aa18fcc08a42e77592650a7c00f3af1f46c Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Thu, 31 Jul 2025 14:35:30 +0200 Subject: [PATCH 3/5] Update controlled-value.json; add skos:broader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit here skos:broader as optional. this tells that Term: topicDiscipline ├── ControlledValue: Anthropology ├── ControlledValue: Botany ├── ControlledValue: Astrogeology └── ControlledValue: Geology Each ControlledValue (like Botany) uses: skos:inScheme → points back to the Term (topicDiscipline) skos:broader → (optional) points to parent ControlledValue if there's hierarchy So Botany is a controlled value of topicDiscipline, not a narrower concept of the term itself. The term defines the "field" and the controlled values are the allowed "options" for that field. --- data-model/fdo-type/controlled-value/controlled-value.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data-model/fdo-type/controlled-value/controlled-value.json b/data-model/fdo-type/controlled-value/controlled-value.json index b68ee5f..7945841 100644 --- a/data-model/fdo-type/controlled-value/controlled-value.json +++ b/data-model/fdo-type/controlled-value/controlled-value.json @@ -84,6 +84,12 @@ "https://hdl.handle.net/20.500.1025/topicDiscipline" ] }, + "skos:broader": { + "type": "string", + "format": "uri", + "description": "The broader controlled value in the hierarchy", + "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/([^/]+)/([^/]+)$" +} "owl:deprecated": { "type": "boolean", "description": "Indicates whether the value is deprecated", From d930584dfbc22ed2ad5b11f9ec9f34e1944aa43b Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Tue, 28 Oct 2025 12:00:13 +0100 Subject: [PATCH 4/5] Update controlled-value based on PR comments checked assumption: Each controlled value belongs to exactly ONE term. updated regex for FDO Type and controlled value update hasAgents desc to a more generic one add more examples ods:status and ods:fdoType now required. moved modified from required. --- .../controlled-value/controlled-value.json | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/data-model/fdo-type/controlled-value/controlled-value.json b/data-model/fdo-type/controlled-value/controlled-value.json index 7945841..3e54769 100644 --- a/data-model/fdo-type/controlled-value/controlled-value.json +++ b/data-model/fdo-type/controlled-value/controlled-value.json @@ -8,9 +8,10 @@ "@id": { "type": "string", "description": "The unique identifier (handle) of the controlled value", - "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/.+", + "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/[a-zA-Z0-9/_-]+$", "examples": [ - "https://hdl.handle.net/20.500.1025/topicDiscipline/Botany" + "https://hdl.handle.net/20.500.1025/topicDiscipline/Botany", + "https://hdl.handle.net/20.500.1025/status/Active" ] }, "@type": { @@ -20,14 +21,14 @@ }, "ods:fdoType": { "type": "string", - "description": "The DOI to the FDO type of the object", - "pattern": "^https://doi\\.org/[\\w\\.]+/[\\w\\.]+", + "description": "The Handle to the FDO type of the object", + "pattern": "^https://hdl\\.handle\\.net/[0-9]+\\.[0-9A-Z]+/[a-f0-9]+$", "examples": [ - "https://doi.org/21.T11148/bbad8c4e101e8af01115", - "https://doi.org/21.T11148/894b1e6cad57e921764e" + "https://hdl.handle.net/21.T11148/bbad8c4e101e8af01115", + "https://hdl.handle.net/21.T11148/894b1e6cad57e921764e" ] }, - "ods:status": { + "ods:status": { "type": "string", "enum": [ "ods:Draft", @@ -47,9 +48,9 @@ 1 ] }, - "ods:hasAgents": { + "ods:hasAgents": { "type": "array", - "description": "Contains all agents that are connected to the specimen. Agents that are part of a specific part of the specimen should be added there. For example, a Collector is connected to the CollectingEvent so is added in the event.", + "description": "Contains all agents that are connected to this digital object.", "items": { "type": "object", "$ref": "https://schemas.dissco.tech/schemas/fdo-type/shared-model/0.4.0/agent.json" @@ -59,7 +60,9 @@ "type": "string", "description": "The title of the controlled value", "examples": [ - "Botany" + "Botany", + "Geology", + "Preserved" ] }, "skos:prefLabel": { @@ -85,17 +88,19 @@ ] }, "skos:broader": { - "type": "string", - "format": "uri", - "description": "The broader controlled value in the hierarchy", - "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/([^/]+)/([^/]+)$" -} + "type": "string", + "format": "uri", + "description": "The broader controlled value in the hierarchy", + "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/([^/]+)/([^/]+)$" + }, "owl:deprecated": { "type": "boolean", "description": "Indicates whether the value is deprecated", - "examples": [false] + "examples": [ + "false" + ] }, - "dcterms:created": { + "dcterms:created": { "type": "string", "format": "date-time", "description": "Timestamp of creation" @@ -109,6 +114,8 @@ "required": [ "@id", "@type", + "ods:status", + "ods:fdoType", "dcterms:title", "skos:prefLabel", "skos:definition", @@ -116,7 +123,6 @@ "owl:deprecated", "ods:version", "ods:hasAgents", - "dcterms:created", - "dcterms:modified" + "dcterms:created" ] } From 678ab4ea146099a795d2a32387bdeb24d78b0c62 Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:02:19 +0100 Subject: [PATCH 5/5] Update botany.json examples with correct hasAgents --- .../controlled-value/examples/botany.json | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/data-model/fdo-type/controlled-value/examples/botany.json b/data-model/fdo-type/controlled-value/examples/botany.json index 6ea60c2..f53878f 100644 --- a/data-model/fdo-type/controlled-value/examples/botany.json +++ b/data-model/fdo-type/controlled-value/examples/botany.json @@ -1,16 +1,22 @@ { "@id": "https://hdl.handle.net/20.500.1025/topicDiscipline/Botany", "@type": "ods:ControlledValue", - "ods:fdoType": "https://doi.org/21.T11148/bbad8c4e101e8af01115", + "ods:fdoType": "https://hdl.handle.net/21.T11148/bbad8c4e101e8af01115", "ods:status": "ods:Active", "ods:version": 1, "ods:hasAgents": [ { - "@id": "https://orcid.org/0000-0002-1825-0097", "@type": "schema:Person", + "schema:identifier": "https://orcid.org/0000-0001-1234-5678", "schema:name": "FirstName LastName", - "schema:roleName": "Creator", - "dcterms:created": "2024-01-15T10:30:00Z" + "ods:hasRoles": [ + { + "@type": "schema:Role", + "schema:roleName": "creator", + "schema:startDate": "2024-01-15T10:30:00Z", + "schema:position": 1 + } + ] } ], "dcterms:title": "Botany", @@ -19,5 +25,5 @@ "skos:inScheme": "https://hdl.handle.net/20.500.1025/topicDiscipline", "owl:deprecated": false, "dcterms:created": "2024-01-15T10:30:00Z", - "dcterms:modified": "2024-01-15T10:30:00Z" + "dcterms:modified": "2024-10-15T14:22:00Z" }