From 3636facba78127ebf8405830ea2834f29ec75d9a Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Wed, 18 Sep 2024 10:51:19 +0200 Subject: [PATCH 01/13] openDS term data schema A JSON schema to describe the openDS terms as FDO. --- data-model/fdo-type/term/term.json | 195 +++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 data-model/fdo-type/term/term.json diff --git a/data-model/fdo-type/term/term.json b/data-model/fdo-type/term/term.json new file mode 100644 index 00000000..43cd6998 --- /dev/null +++ b/data-model/fdo-type/term/term.json @@ -0,0 +1,195 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://schemas.dissco.tech/schemas/fdo-type/term/latest/term.json", + "title": "DiSSCo openDS Terms Schema", + "description": "A schema for defining standard terms in openDS.", + "type": "object", + "properties": { + "@id": { + "type": "string", + "description": "The unique identifier (handle) of the term object", + "pattern": "^https://hdl\\.handle\\.net/[\\w.]+/(.){3}-(.){3}-(.){3}", + "examples": [ + "https://hdl.handle.net/20.5000.1025/XXX-XXX-XXX" + ] + }, + "@type": { + "type": "string", + "description": "The type of the object, in this case ods:Term", + "const": "ods:Term", + "examples": [ + "ods:Term" + ] + }, + "rdf:type": { + "type": "object", + "properties": { + "@id": { + "type": "string", + "enum": [ + "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property", + "http://www.w3.org/2000/01/rdf-schema#Class", + "http://www.w3.org/2002/07/owl#Class", + "http://www.w3.org/2004/02/skos/core#Concept" + ] + } + } + }, + "dcterms:identifier": { + "type": "string", + "description": "Handle of the Term", + "pattern": "^https://hdl\\.handle\\.net/[\\w.]+/(.){3}-(.){3}-(.){3}", + "examples": [ + "https://hdl.handle.net/20.5000.1025/XXX-XXX-XXX" + ] + }, + "ods:type": { + "type": "string", + "description": "The DOI to the FDO type of the object", + "pattern": "^https://doi\\.org/[\\w.]+/[\\w.]+", + "examples": [ + "https://doi.org/10.15468/1a2b3c" + ] + }, + "ods:status": { + "type": "string", + "enum": [ + "ods:Draft", + "ods:Active", + "ods:Tombstone" + ], + "description": "The status of the Digital Object", + "examples": [ + "ods:Active" + ] + }, + "schema:version": { + "type": "integer", + "minimum": 1, + "description": "Version of the Schema, https://schema.org/version", + "examples": [ + 1 + ] + }, + "schema:name": { + "type": "string", + "description": "Name of the Term, https://schema.org/name", + "examples": [ + "ods:DigitalSpecimen" + ] + }, + "skos:prefLabel": { + "type": "string", + "description": "The preferred lexical label for the term", + "examples": [ + "Digital Specimen" + ] + }, + "schema:dateCreated": { + "type": "string", + "description": "Timestamp of creation. Internally generated, https://schema.org/dateCreated", + "format": "date-time", + "examples": [ + "2021-06-01T12:00:000Z" + ] + }, + "schema:dateModified": { + "type": "string", + "description": "Timestamp of last modification. Internally generated, https://schema.org/dateModified", + "format": "date-time", + "examples": [ + "2021-06-06T13:22:00.445Z" + ] + }, + "schema:creator": { + "type": "object", + "description": "Contains an ods:Agent object", + "$ref": "https://schemas.dissco.tech/schemas/fdo-type/shared-model/0.3.0/agent.json", + "examples": [ + { + "@id": "https://orcid.org/0000-0002-1825-0097", + "@type": "schema:Person", + "schema:name": "John Doe", + "schema:email": "john.doe@example.com" + } + ] + }, + "schema:contributor": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of contributors", + "examples": [ + ["Jane Smith", "Bob Johnson"] + ] + }, + "skos:definition": { + "type": "string", + "description": "A definition of what the term represents.", + "examples": [ + "A digital representation of a physical specimen" + ] + }, + + "dcterms:licence": { + "type": "string", + "format": "uri", + "description": "License URI", + "enum": [ + "https://creativecommons.org/licenses/by/4.0/", + "https://creativecommons.org/licenses/by-sa/4.0/", + "https://creativecommons.org/licenses/by-nc/4.0/", + "https://creativecommons.org/licenses/by-nc-sa/4.0/" + ], + "examples": [ + "https://creativecommons.org/licenses/by/4.0/" + ] + }, + "ods:belongsToClass": { + "type": "string", + "format": "uri", + "description": "URI of the class this term belongs to", + "examples": [ + "https://schema.org/Thing" + ] + }, + "ods:repeatable": { + "type": "boolean", + "description": "Indicates whether the term is repeatable", + "examples": [ + true + ] + }, + "ods:isRequired": { + "type": "boolean", + "description": "Indicates whether the term is required", + "examples": [ + false + ] + }, + "skos:broadMatch": { + "type": "string", + "format": "uri", + "description": "URI of a broader matching concept", + "examples": [ + "http://rs.tdwg.org/dwc/terms/Occurrence" + ] + }, + "owl:deprecated": { + "type": "boolean", + "description": "Indicates whether the term is deprecated", + "examples": [ + false + ] + } + }, + "required": [ + "@type", + "ods:type", + "dcterms:identifier", + "schema:name", + "schema:dateCreated", + "schema:dateModified" + ] +} From 09c67ce17b6a95dfb134c3e995fa69f5963689e5 Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Mon, 14 Oct 2024 13:17:43 +0200 Subject: [PATCH 02/13] Update term.json - Used dcterms properties to be consistent with the rest of the digital objects. Removed schema.org properties. - Fixed naming style to be consistent with the rest. - Followed ISO standards and examples for dcterms:created and dcterms:modified. - Removed contributor, seemed not needed for now. We can use Creator as an Agent object. This should be sufficient for now. - Removed mapping. As mentioned in the pull request when we add a mapping to other standards, we would need to update the term, which might get tricky. - Added const spdx URl for license. - To handle "repeatable" and "required" properties, using existing terms is better, so we are using "owl:cardinality", "owl:minCardinality", and "owl:maxCardinality". - If a term can be required for one class but optional for another, this introduces complexity because JSON Schema doesn't easily support conditional logic like this. This might need to addressed in the application layer. --- data-model/fdo-type/term/term.json | 111 +++++++++++------------------ 1 file changed, 42 insertions(+), 69 deletions(-) diff --git a/data-model/fdo-type/term/term.json b/data-model/fdo-type/term/term.json index 43cd6998..183c6a62 100644 --- a/data-model/fdo-type/term/term.json +++ b/data-model/fdo-type/term/term.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://schemas.dissco.tech/schemas/fdo-type/term/latest/term.json", - "title": "DiSSCo openDS Terms Schema", + "$id": "https://schemas.dissco.tech/schemas/fdo-type/term/0.1.0/term.json", + "title": "DiSSCo openDS Term Schema", "description": "A schema for defining standard terms in openDS.", "type": "object", "properties": { @@ -43,12 +43,13 @@ "https://hdl.handle.net/20.5000.1025/XXX-XXX-XXX" ] }, - "ods:type": { + "ods:fdoType": { "type": "string", "description": "The DOI to the FDO type of the object", - "pattern": "^https://doi\\.org/[\\w.]+/[\\w.]+", + "pattern": "^https://doi\\.org/[\\w\\.]+/[\\w\\.]+", "examples": [ - "https://doi.org/10.15468/1a2b3c" + "https://doi.org/21.T11148/bbad8c4e101e8af01115", + "https://doi.org/21.T11148/894b1e6cad57e921764e" ] }, "ods:status": { @@ -63,17 +64,17 @@ "ods:Active" ] }, - "schema:version": { + "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, - "description": "Version of the Schema, https://schema.org/version", "examples": [ 1 ] }, - "schema:name": { + "dcterms:title": { "type": "string", - "description": "Name of the Term, https://schema.org/name", + "description": "A Name given to the resource, in this case openDS term name", "examples": [ "ods:DigitalSpecimen" ] @@ -85,26 +86,25 @@ "Digital Specimen" ] }, - "schema:dateCreated": { + "dcterms:created": { "type": "string", - "description": "Timestamp of creation. Internally generated, https://schema.org/dateCreated", + "description": "The timestamp that the object was created in DiSSCo, following the ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss.SSSXXX", "format": "date-time", "examples": [ - "2021-06-01T12:00:000Z" + "2023-10-02T12:31:34.806Z" ] }, - "schema:dateModified": { + "dcterms:modified": { "type": "string", - "description": "Timestamp of last modification. Internally generated, https://schema.org/dateModified", - "format": "date-time", + "description": "The timestamp that the object was last changed, following the ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss.SSSXXX", "examples": [ - "2021-06-06T13:22:00.445Z" + "2023-10-02T12:31:34.806Z" ] }, - "schema:creator": { + "dcterms:creator": { "type": "object", - "description": "Contains an ods:Agent object", - "$ref": "https://schemas.dissco.tech/schemas/fdo-type/shared-model/0.3.0/agent.json", + "description": "Contains information about the creator/proposer/requester of the term. This is an ods:Agent object", + "$ref": "https://schemas.dissco.tech/schemas/fdo-type/shared-model/0.4.0/agent.json", "examples": [ { "@id": "https://orcid.org/0000-0002-1825-0097", @@ -113,16 +113,6 @@ "schema:email": "john.doe@example.com" } ] - }, - "schema:contributor": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of contributors", - "examples": [ - ["Jane Smith", "Bob Johnson"] - ] }, "skos:definition": { "type": "string", @@ -131,50 +121,35 @@ "A digital representation of a physical specimen" ] }, - "dcterms:licence": { - "type": "string", - "format": "uri", - "description": "License URI", - "enum": [ - "https://creativecommons.org/licenses/by/4.0/", - "https://creativecommons.org/licenses/by-sa/4.0/", - "https://creativecommons.org/licenses/by-nc/4.0/", - "https://creativecommons.org/licenses/by-nc-sa/4.0/" - ], - "examples": [ - "https://creativecommons.org/licenses/by/4.0/" - ] + "const": "https://spdx.org/licenses/CC0-1.0.json", + "description": "The licence for the term, required to be always public domain" }, "ods:belongsToClass": { - "type": "string", - "format": "uri", - "description": "URI of the class this term belongs to", + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "URIs of the classes this term belongs to", "examples": [ - "https://schema.org/Thing" + ["https://terms.dissco.tech/digital-specimen-terms#EntityRelationship", "http://purl.org/dc/dcmitype/Collection"] ] }, - "ods:repeatable": { - "type": "boolean", - "description": "Indicates whether the term is repeatable", - "examples": [ - true - ] + "owl:cardinality": { + "type": "integer", + "description": "Exact number of occurrences allowed for the term.", + "examples": [1] }, - "ods:isRequired": { - "type": "boolean", - "description": "Indicates whether the term is required", - "examples": [ - false - ] + "owl:minCardinality": { + "type": "integer", + "description": "Minimum number of occurrences required for the term.", + "examples": [1] }, - "skos:broadMatch": { - "type": "string", - "format": "uri", - "description": "URI of a broader matching concept", - "examples": [ - "http://rs.tdwg.org/dwc/terms/Occurrence" - ] + "owl:maxCardinality": { + "type": "integer", + "description": "Maximum number of occurrences allowed for the term.", + "examples": [1] }, "owl:deprecated": { "type": "boolean", @@ -186,10 +161,8 @@ }, "required": [ "@type", - "ods:type", + "ods:fdoType", "dcterms:identifier", - "schema:name", - "schema:dateCreated", - "schema:dateModified" + "dcterms:title" ] } From db1cf29825e2ba9cc81611bc4fb9ef5ab4c61fd2 Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Tue, 17 Dec 2024 10:43:15 +0100 Subject: [PATCH 03/13] new term schema changes in this version: - updated Regex for the Handle - removed rdf:Type - used ods:hasAgent instead of dcterms:creator - added skos:note and skos:example - removed owl cardinality. we use json schema required for this - added hasVersion for more provenance metadata - used rdfs:range instead of new term belongsToClass - added langiage in prefLabel --- data-model/fdo-type/term/term.json | 122 ++++++++++++----------------- 1 file changed, 51 insertions(+), 71 deletions(-) diff --git a/data-model/fdo-type/term/term.json b/data-model/fdo-type/term/term.json index 183c6a62..e19814e9 100644 --- a/data-model/fdo-type/term/term.json +++ b/data-model/fdo-type/term/term.json @@ -8,39 +8,9 @@ "@id": { "type": "string", "description": "The unique identifier (handle) of the term object", - "pattern": "^https://hdl\\.handle\\.net/[\\w.]+/(.){3}-(.){3}-(.){3}", + "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/([^/]+)$", "examples": [ - "https://hdl.handle.net/20.5000.1025/XXX-XXX-XXX" - ] - }, - "@type": { - "type": "string", - "description": "The type of the object, in this case ods:Term", - "const": "ods:Term", - "examples": [ - "ods:Term" - ] - }, - "rdf:type": { - "type": "object", - "properties": { - "@id": { - "type": "string", - "enum": [ - "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property", - "http://www.w3.org/2000/01/rdf-schema#Class", - "http://www.w3.org/2002/07/owl#Class", - "http://www.w3.org/2004/02/skos/core#Concept" - ] - } - } - }, - "dcterms:identifier": { - "type": "string", - "description": "Handle of the Term", - "pattern": "^https://hdl\\.handle\\.net/[\\w.]+/(.){3}-(.){3}-(.){3}", - "examples": [ - "https://hdl.handle.net/20.5000.1025/XXX-XXX-XXX" + "https://hdl.handle.net/20.500.1025/DigitalSpecimen" ] }, "ods:fdoType": { @@ -72,6 +42,14 @@ 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": "A Name given to the resource, in this case openDS term name", @@ -84,8 +62,39 @@ "description": "The preferred lexical label for the term", "examples": [ "Digital Specimen" + ], + "@language": { + "type": "string" + } + }, + "skos:definition": { + "type": "string", + "description": "A definition of what the term represents.", + "examples": [ + "A digital representation of a physical specimen" + ], + "@language": { + "type": "string" + } + }, + "skos:note": { + "type": "string", + "description": "A note field to capture contexts and other information around the decision.", + "examples": [ + "This term was discussed in projectX" + ], + "@language": { + "type": "string" + } + }, + "skos:example": { + "type": "string", + "description": "An example usage of the term.", + "examples": [ + "A record of a butterfly specimen collected in the field" ] }, + "dcterms:created": { "type": "string", "description": "The timestamp that the object was created in DiSSCo, following the ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss.SSSXXX", @@ -101,56 +110,25 @@ "2023-10-02T12:31:34.806Z" ] }, - "dcterms:creator": { - "type": "object", - "description": "Contains information about the creator/proposer/requester of the term. This is an ods:Agent object", - "$ref": "https://schemas.dissco.tech/schemas/fdo-type/shared-model/0.4.0/agent.json", - "examples": [ - { - "@id": "https://orcid.org/0000-0002-1825-0097", - "@type": "schema:Person", - "schema:name": "John Doe", - "schema:email": "john.doe@example.com" - } - ] - }, - "skos:definition": { + + "dcterms:hasVersion": { "type": "string", - "description": "A definition of what the term represents.", + "description": "A related resource that is a version, edition, or adaptation of the described resource.", "examples": [ - "A digital representation of a physical specimen" + "1.0.1" ] }, - "dcterms:licence": { - "const": "https://spdx.org/licenses/CC0-1.0.json", - "description": "The licence for the term, required to be always public domain" - }, - "ods:belongsToClass": { + "rdfs:range": { "type": "array", "items": { "type": "string", "format": "uri" }, - "description": "URIs of the classes this term belongs to", + "description": "URIs of the classes this term ranges to or belongs to", "examples": [ ["https://terms.dissco.tech/digital-specimen-terms#EntityRelationship", "http://purl.org/dc/dcmitype/Collection"] ] }, - "owl:cardinality": { - "type": "integer", - "description": "Exact number of occurrences allowed for the term.", - "examples": [1] - }, - "owl:minCardinality": { - "type": "integer", - "description": "Minimum number of occurrences required for the term.", - "examples": [1] - }, - "owl:maxCardinality": { - "type": "integer", - "description": "Maximum number of occurrences allowed for the term.", - "examples": [1] - }, "owl:deprecated": { "type": "boolean", "description": "Indicates whether the term is deprecated", @@ -160,9 +138,11 @@ } }, "required": [ - "@type", + "@id", + "ods:version", "ods:fdoType", - "dcterms:identifier", + "dcterms:created", + "dcterms:modified", "dcterms:title" ] } From aea1982d6357c6fd4669a2a2f41ab65631c8dfee Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Wed, 30 Jul 2025 11:07:43 +0200 Subject: [PATCH 04/13] A new version of the term schema Changes (based on the PR and meeting feedback) - updated required properties - added hasAgents (this is another object we will call from this) - removed dcterms:hasVersion. Even though this is semantically diff than ods:version we do not need this now. - added "@type" - Regarding self reference. yes, that was answered in the PR comment. Yes, this is common in RDF/ontology and data typing world. self referencing/recursive definition. For example in RDF schema (https://www.w3.org/2000/01/rdf-schema) rdfs:Class is the class of all classes, and it is itself an instance of rdfs:Class. --- data-model/fdo-type/term/term.json | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/data-model/fdo-type/term/term.json b/data-model/fdo-type/term/term.json index e19814e9..6a14b162 100644 --- a/data-model/fdo-type/term/term.json +++ b/data-model/fdo-type/term/term.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://schemas.dissco.tech/schemas/fdo-type/term/0.1.0/term.json", "title": "DiSSCo openDS Term Schema", - "description": "A schema for defining standard terms in openDS.", + "description": "A schema for defining standard terms used in openDS.", "type": "object", "properties": { "@id": { @@ -13,6 +13,11 @@ "https://hdl.handle.net/20.500.1025/DigitalSpecimen" ] }, + "@type": { + "type": "string", + "const": "ods:Term", + "description": "The type of the digital object, in this case a ods:Term" + }, "ods:fdoType": { "type": "string", "description": "The DOI to the FDO type of the object", @@ -91,10 +96,9 @@ "type": "string", "description": "An example usage of the term.", "examples": [ - "A record of a butterfly specimen collected in the field" + "ods:physicalSpecimenID is used in Digital Specimen data schema" ] }, - "dcterms:created": { "type": "string", "description": "The timestamp that the object was created in DiSSCo, following the ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss.SSSXXX", @@ -110,7 +114,6 @@ "2023-10-02T12:31:34.806Z" ] }, - "dcterms:hasVersion": { "type": "string", "description": "A related resource that is a version, edition, or adaptation of the described resource.", @@ -138,11 +141,19 @@ } }, "required": [ - "@id", + "@id", + "@type", "ods:version", "ods:fdoType", "dcterms:created", - "dcterms:modified", - "dcterms:title" - ] + "dcterms:modified", + "dcterms:title", + "owl:deprecated", + "skos:prefLabel", + "skos:definition", + "ods:hasAgents", + "ods:status", + "rdfs:range" + ], + "additionalProperties": false } From 525cfdeb3c6db7d28739cb46a4b64e2db4b2490f Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Wed, 30 Jul 2025 11:13:15 +0200 Subject: [PATCH 05/13] An example based on the latest Jul 2025 schema version --- .../ods:physicalSpecimenID-example.json | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json diff --git a/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json b/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json new file mode 100644 index 00000000..eb59d5d6 --- /dev/null +++ b/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json @@ -0,0 +1,32 @@ +{ + "@id": "https://hdl.handle.net/20.500.1025/physicalSpecimenID", + "@type": "ods:Term", + "ods:fdoType": "https://doi.org/21.T11148/bbad8c4e101e8af01115", + "ods:version": 1, + "ods:status": "ods:Active", + "dcterms:title": "ods:physicalSpecimenID", + "skos:prefLabel": "Physical Specimen ID", + "skos:definition": "The physical specimen identifier of the object. The main identifier of the object is used (which can be indicated by the user through the DataMapping). If the ods:physicalSpecimenIDType is Resolvable or Global, this identifier is the same as the `ods:normalisedPhysicalSpecimenID`.", + "skos:note": "Used in multiple schemas including the Digital Specimen FDO.", + "skos:example": "https://data.biodiversitydata.nl/naturalis/specimen/RGM.234626", + "dcterms:created": "2025-07-30T10:00:00Z", + "dcterms:modified": "2025-07-30T10:00:00Z", + "rdfs:range": [ + "https://terms.dissco.tech/digital-specimen-terms#DigitalSpecimen" + ], + "owl:deprecated": false, + "ods:hasAgents": [ + { + "@id": "https://orcid.org/0000-0002-1825-0097", + "@type": "schema:Person", + "schema:name": "First Second", + "schema:identifier": "https://orcid.org/0000-0002-1825-0097", + "ods:hasRoles": [ + { + "@type": "schema:Role", + "schema:roleName": "creator" + } + ] + } + ] +} From 1af40c393582b38391126ce56055088b4720c510 Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Thu, 31 Jul 2025 14:19:12 +0200 Subject: [PATCH 06/13] Update term.json; add ods:ControlledValue Added optional ods:hasControlledValues array to define controlled vocabulary values that a term accepts (e.g., topicDiscipline can have values: Botany, Geology, etc.). Each controlled value gets its own PID following pattern hdl:20.500.1025/term/value. This complements skos:inScheme usage and maintains FAIR/FDO compliance while avoiding misuse of skos:member outside of collections. skos:narrower: Implies hierarchical relationships where the controlled values are "narrower concepts" of the term itself. But that's not quite right - "Botany" isn't a narrower concept of "topicDiscipline", it's a value that topicDiscipline can take. skos:related: Too vague and doesn't capture the specific "this term accepts these values" relationship --- data-model/fdo-type/term/term.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/data-model/fdo-type/term/term.json b/data-model/fdo-type/term/term.json index 6a14b162..7e916c6e 100644 --- a/data-model/fdo-type/term/term.json +++ b/data-model/fdo-type/term/term.json @@ -55,6 +55,21 @@ "$ref": "https://schemas.dissco.tech/schemas/fdo-type/shared-model/0.4.0/agent.json" } }, + "ods:hasControlledValues": { + "type": "array", + "description": "The controlled vocabulary values that this term accepts. Each URI represents a valid value for this term.", + "items": { + "type": "string", + "format": "uri", + "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/([^/]+)/([^/]+)$" + }, + "examples": [ + [ + "https://hdl.handle.net/20.500.1025/topicDiscipline/Botany", + "https://hdl.handle.net/20.500.1025/topicDiscipline/Geology" + ] + ] + }, "dcterms:title": { "type": "string", "description": "A Name given to the resource, in this case openDS term name", @@ -72,6 +87,17 @@ "type": "string" } }, + "skos:member": { + "type": "array", + "description": "Indicates that this term is a member of a specific concept scheme or collection", + "items": { + "type": "string", + "format": "uri" + }, + "examples": [ + ["https://terms.dissco.tech/digital-specimen-terms", "https://vocabularies.dissco.tech/core-terms"] + ] +} "skos:definition": { "type": "string", "description": "A definition of what the term represents.", From 41c03a363eab6506da361bd22da415a44f6cb695 Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Thu, 31 Jul 2025 14:23:39 +0200 Subject: [PATCH 07/13] fix rdfs range --- .../fdo-type/term/examples/ods:physicalSpecimenID-example.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json b/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json index eb59d5d6..d0fe7809 100644 --- a/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json +++ b/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json @@ -12,7 +12,7 @@ "dcterms:created": "2025-07-30T10:00:00Z", "dcterms:modified": "2025-07-30T10:00:00Z", "rdfs:range": [ - "https://terms.dissco.tech/digital-specimen-terms#DigitalSpecimen" + "https://hdl.handle.net/20.500.1025/DigitalSpecimen" ], "owl:deprecated": false, "ods:hasAgents": [ From 5ee122615fdfbc634f4249d8e6a63ff29eb90104 Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Thu, 31 Jul 2025 14:24:28 +0200 Subject: [PATCH 08/13] Create ods:topicDiscipline-example.json --- .../examples/ods:topicDiscipline-example.json | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 data-model/fdo-type/term/examples/ods:topicDiscipline-example.json diff --git a/data-model/fdo-type/term/examples/ods:topicDiscipline-example.json b/data-model/fdo-type/term/examples/ods:topicDiscipline-example.json new file mode 100644 index 00000000..26bf6162 --- /dev/null +++ b/data-model/fdo-type/term/examples/ods:topicDiscipline-example.json @@ -0,0 +1,23 @@ +{ + "@id": "https://hdl.handle.net/20.500.1025/topicDiscipline", + "@type": "ods:Term", + "ods:fdoType": "https://doi.org/21.T11148/bbad8c4e101e8af01115", + "ods:status": "ods:Active", + "ods:version": 1, + "ods:hasAgents": [], + "dcterms:title": "ods:topicDiscipline", + "skos:prefLabel": "Topic Discipline", + "skos:definition": "Add def here.", + "dcterms:created": "2025-01-15T09:00:00.000Z", + "dcterms:modified": "2025-01-15T09:00:00.000Z", + "rdfs:range": [ + "https://hdl.handle.net/20.500.1025/topicDiscipline" + ], + "owl:deprecated": false, + "ods:hasControlledValues": [ + "https://hdl.handle.net/20.500.1025/topicDiscipline/Anthropology", + "https://hdl.handle.net/20.500.1025/topicDiscipline/Botany", + "https://hdl.handle.net/20.500.1025/topicDiscipline/Astrogeology", + "https://hdl.handle.net/20.500.1025/topicDiscipline/Geology" + ] +} From 9283d260ceb14933ed578b2dada2e64185fea55f Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:25:30 +0100 Subject: [PATCH 09/13] Update topicDiscipline example Fixed hasAgents, added modifier role added correct fdoType PID. --- .../examples/ods:topicDiscipline-example.json | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/data-model/fdo-type/term/examples/ods:topicDiscipline-example.json b/data-model/fdo-type/term/examples/ods:topicDiscipline-example.json index 26bf6162..25e93c03 100644 --- a/data-model/fdo-type/term/examples/ods:topicDiscipline-example.json +++ b/data-model/fdo-type/term/examples/ods:topicDiscipline-example.json @@ -1,17 +1,32 @@ { "@id": "https://hdl.handle.net/20.500.1025/topicDiscipline", "@type": "ods:Term", - "ods:fdoType": "https://doi.org/21.T11148/bbad8c4e101e8af01115", + "ods:fdoType": "https://doi.org/21.T11148/770bce19da07e2e1106c", "ods:status": "ods:Active", "ods:version": 1, - "ods:hasAgents": [], + "ods:hasAgents": [ + { + "@id": "https://orcid.org/0000-0002-5669-2769", + "@type": "schema:Person", + "schema:identifier": "https://orcid.org/0000-0002-5669-2769", + "schema:name": "Sam Leeflang", + "ods:hasRoles": [ + { + "@type": "schema:Role", + "schema:roleName": "modifier", + "schema:startDate": "2025-01-17T09:00:00.000Z", + "schema:endDate": "2025-01-17T09:00:00.000Z" + } + ] + } + ], "dcterms:title": "ods:topicDiscipline", "skos:prefLabel": "Topic Discipline", - "skos:definition": "Add def here.", + "skos:definition": "Overarching classification of the scientific discipline to which the objects within the collection belong or are related", "dcterms:created": "2025-01-15T09:00:00.000Z", - "dcterms:modified": "2025-01-15T09:00:00.000Z", - "rdfs:range": [ - "https://hdl.handle.net/20.500.1025/topicDiscipline" + "dcterms:modified": "2025-01-17T09:00:00.000Z", + "rdfs:range": [ + "https://hdl.handle.net/20.500.1025/DigitalSpecimen" ], "owl:deprecated": false, "ods:hasControlledValues": [ From 72545074c2dbf419e5a9b2d63edb583054dba2af Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:26:36 +0100 Subject: [PATCH 10/13] Update fdoType URL in physicalSpecimenID example --- .../fdo-type/term/examples/ods:physicalSpecimenID-example.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json b/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json index d0fe7809..57e3a034 100644 --- a/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json +++ b/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json @@ -1,7 +1,7 @@ { "@id": "https://hdl.handle.net/20.500.1025/physicalSpecimenID", "@type": "ods:Term", - "ods:fdoType": "https://doi.org/21.T11148/bbad8c4e101e8af01115", + "ods:fdoType": "https://doi.org/21.T11148/770bce19da07e2e1106c", "ods:version": 1, "ods:status": "ods:Active", "dcterms:title": "ods:physicalSpecimenID", @@ -10,7 +10,6 @@ "skos:note": "Used in multiple schemas including the Digital Specimen FDO.", "skos:example": "https://data.biodiversitydata.nl/naturalis/specimen/RGM.234626", "dcterms:created": "2025-07-30T10:00:00Z", - "dcterms:modified": "2025-07-30T10:00:00Z", "rdfs:range": [ "https://hdl.handle.net/20.500.1025/DigitalSpecimen" ], From 44a3cabf4a5bb7053a61ad3713806248d9ff588c Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:28:32 +0100 Subject: [PATCH 11/13] Update ods:fdoType description and pattern --- data-model/fdo-type/term/term.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/data-model/fdo-type/term/term.json b/data-model/fdo-type/term/term.json index 7e916c6e..662f59f3 100644 --- a/data-model/fdo-type/term/term.json +++ b/data-model/fdo-type/term/term.json @@ -18,16 +18,15 @@ "const": "ods:Term", "description": "The type of the digital object, in this case a ods:Term" }, - "ods:fdoType": { + "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\/[\\w.]+\/(.){3}-(.){3}-(.){3}", "examples": [ - "https://doi.org/21.T11148/bbad8c4e101e8af01115", - "https://doi.org/21.T11148/894b1e6cad57e921764e" + "https://hdl.handle.net/21.T11148/2ac65a933b7a0361b651" ] }, - "ods:status": { + "ods:status": { "type": "string", "enum": [ "ods:Draft", @@ -97,7 +96,7 @@ "examples": [ ["https://terms.dissco.tech/digital-specimen-terms", "https://vocabularies.dissco.tech/core-terms"] ] -} +}, "skos:definition": { "type": "string", "description": "A definition of what the term represents.", From 5bff3b87f702c9802b09146abb06f5e771aa6efd Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:59:06 +0100 Subject: [PATCH 12/13] update several things based on PR - Updated regex patterns for FDO type - removed skos:member as this is same as hasControlledvalue - removed rdfs:range from required - added skos:example in required - removed @langauge as this is not valid JSON --- data-model/fdo-type/term/term.json | 38 +++++++----------------------- 1 file changed, 9 insertions(+), 29 deletions(-) diff --git a/data-model/fdo-type/term/term.json b/data-model/fdo-type/term/term.json index 662f59f3..51adeaf6 100644 --- a/data-model/fdo-type/term/term.json +++ b/data-model/fdo-type/term/term.json @@ -21,9 +21,9 @@ "ods:fdoType": { "type": "string", "description": "The Handle to the FDO type of the object", - "pattern": "^https:\/\/hdl\\.handle\\.net\/[\\w.]+\/(.){3}-(.){3}-(.){3}", + "pattern": "^https://hdl\\.handle\\.net/\\d{2}\\.[A-Z]\\d+/[a-fA-F0-9-]+$", "examples": [ - "https://hdl.handle.net/21.T11148/2ac65a933b7a0361b651" + "https:\/\/hdl.handle.net/21.T11148/770bce19da07e2e1106c" ] }, "ods:status": { @@ -48,7 +48,7 @@ }, "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 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" @@ -60,7 +60,7 @@ "items": { "type": "string", "format": "uri", - "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/([^/]+)/([^/]+)$" + "pattern": "^https://hdl\\.handle\\.net/20\\.500\\.1025/[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$" }, "examples": [ [ @@ -81,41 +81,21 @@ "description": "The preferred lexical label for the term", "examples": [ "Digital Specimen" - ], - "@language": { - "type": "string" - } + ] }, - "skos:member": { - "type": "array", - "description": "Indicates that this term is a member of a specific concept scheme or collection", - "items": { - "type": "string", - "format": "uri" - }, - "examples": [ - ["https://terms.dissco.tech/digital-specimen-terms", "https://vocabularies.dissco.tech/core-terms"] - ] -}, "skos:definition": { "type": "string", "description": "A definition of what the term represents.", "examples": [ "A digital representation of a physical specimen" - ], - "@language": { - "type": "string" - } + ] }, "skos:note": { "type": "string", "description": "A note field to capture contexts and other information around the decision.", "examples": [ "This term was discussed in projectX" - ], - "@language": { - "type": "string" - } + ] }, "skos:example": { "type": "string", @@ -177,8 +157,8 @@ "skos:prefLabel", "skos:definition", "ods:hasAgents", - "ods:status", - "rdfs:range" + "ods:status", + "skos:example" ], "additionalProperties": false } From d6c71de021b8412542e1abce2815bc59b0c88609 Mon Sep 17 00:00:00 2001 From: Sharif Islam <50382675+sharifX@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:16:08 +0100 Subject: [PATCH 13/13] fixed fdoType link regex, and hasIdentifier - updated fdoType link to the correct Handle - updated regex - updated hasAgents to have hasIdentifier. --- .../examples/ods:physicalSpecimenID-example.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json b/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json index 57e3a034..145ccea8 100644 --- a/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json +++ b/data-model/fdo-type/term/examples/ods:physicalSpecimenID-example.json @@ -1,7 +1,7 @@ { "@id": "https://hdl.handle.net/20.500.1025/physicalSpecimenID", "@type": "ods:Term", - "ods:fdoType": "https://doi.org/21.T11148/770bce19da07e2e1106c", + "ods:fdoType": "https://hdl.handle.net/21.T11148/770bce19da07e2e1106c", "ods:version": 1, "ods:status": "ods:Active", "dcterms:title": "ods:physicalSpecimenID", @@ -10,6 +10,7 @@ "skos:note": "Used in multiple schemas including the Digital Specimen FDO.", "skos:example": "https://data.biodiversitydata.nl/naturalis/specimen/RGM.234626", "dcterms:created": "2025-07-30T10:00:00Z", + "dcterms:modified": "2024-09-06T12:34:42.840Z", "rdfs:range": [ "https://hdl.handle.net/20.500.1025/DigitalSpecimen" ], @@ -25,6 +26,18 @@ "@type": "schema:Role", "schema:roleName": "creator" } + ], + "ods:hasIdentifiers": [ + { + "@id": "https://orcid.org/0000-0002-5669-2769", + "@type": "ods:Identifier", + "dcterms:title": "ORCID", + "dcterms:type": "URL", + "dcterms:identifier": "https://orcid.org/0000-0002-5669-2769", + "ods:isPartOfLabel": false, + "ods:gupriLevel": "GloballyUniqueStablePersistentResolvable", + "ods:identifierStatus": "Preferred" + } ] } ]