@base             <https://w3id.org/oseg/ont/okh> .
@prefix okh:      <#> .
@prefix cc:       <http://creativecommons.org/ns#> .
@prefix dce:      <http://purl.org/dc/elements/1.1/> .
@prefix dcterms:  <http://purl.org/dc/terms/> .
@prefix npg:      <http://ns.nature.com/terms/> .
@prefix obo:      <http://purl.obolibrary.org/obo/> .
@prefix orcid:    <https://orcid.org/> .
@prefix otrl:     <https://w3id.org/oseg/ont/otrl#> .
@prefix owl:      <http://www.w3.org/2002/07/owl#> .
@prefix patent:   <http://data.epo.org/linked-data/def/patent/> .
@prefix rdf:      <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:     <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema:   <http://schema.org/> .
@prefix spdxt:    <http://spdx.org/rdf/terms#> .
@prefix tsdc:     <https://w3id.org/oseg/ont/tsdc/core#> .
@prefix vann:     <http://purl.org/vocab/vann/> .
@prefix vs:       <http://www.w3.org/2003/06/sw-vocab-status/ns#> .
@prefix xsd:      <http://www.w3.org/2001/XMLSchema#> .

# SPDX-FileCopyrightText: 2020 - 2021 Martin Häuer <martin.haeuer@ose-germany.de>
# SPDX-FileCopyrightText: 2020 - 2024 Robin Vobruba <hoijui.quaero@gmail.com>
#
# SPDX-License-Identifier: GPL-3.0-or-later

<>
  a owl:Ontology ;
  vann:preferredNamespacePrefix "okh" ;
  vann:preferredNamespaceUri "https://w3id.org/oseg/ont/okh#" ;
  owl:versionInfo "1.1.0" ;
  owl:versionIRI <https://w3id.org/oseg/ont/1.1.0/okh> ;
  dcterms:title "Open Know How (OKH) ontology"@en ;
  dcterms:description "Used for indexing, searching and comparing Open Source Hardware projects"@en ;
  schema:comment """Regarding the use of `schema:domainIncludes`
and `schema:rangeIncludes` in this ontology:
Looking at the definitions for the RDFS version
of the two, `rdfs:domain` and `rdfs:range`:
* https://www.w3.org/TR/rdf-schema/#ch_domain
* https://www.w3.org/TR/rdf-schema/#ch_range
and as described in this StackOverflow answer:
<https://stackoverflow.com/a/74782257/586229>,
multiple objects for the two RDFS properties mean,
that *all of them* apply, simultaneously,
not *one of them*.
You may think of this as an `AND` coupling.
We want the *one of them* meaning though (`OR`).
The `schema:*` properties give us just that."""@en ;
  dcterms:language <http://id.loc.gov/vocabulary/iso639-1/en> ;
  dce:creator "Martin Häuer <martin.haeuer@ose-germany.de>" ;
  dcterms:creator orcid:0000-0002-1611-7129 ;
  dce:creator "Robin Vobruba <hoijui.quaero@gmail.com>" ;
  dcterms:creator orcid:0009-0004-3559-6542 ;
  dce:publisher "Robin Vobruba (Open Source Ecology Germany e.V.) <hoijui.quaero@gmail.com>" ;
  dce:issued "2021-08-24 16:32:33" ;
  dce:modified "2022-02-22 12:01:28" ;
  dcterms:license <https://www.gnu.org/licenses/gpl-3.0.txt> ;
  cc:license <https://www.gnu.org/licenses/gpl-3.0.txt> ;
  spdxt:ListedLicense "GPL-3.0-or-later" ;
  dce:source "https://github.com/OPEN-NEXT/OKH-LOSH/master/OKH-LOSH.ttl" ;
  .

okh:Component
  a owl:Class ;
  rdfs:label "Component"@en ;
  rdfs:comment "Either a module (MOSH) or Part (POSH); more component types may be added in the future"@en ;
  .

okh:Module
  a owl:Class ;
  rdfs:label "Module"@en ;
  rdfs:comment "Module of Open Source Hardware (MOSH)"@en ;
  rdfs:subClassOf okh:Component ;
  .

okh:Part
  a owl:Class ;
  rdfs:label "Part"@en ;
  rdfs:comment "Piece of Open Source Hardware (POSH)"@en ;
  rdfs:subClassOf okh:Component ;
  .

okh:Software
  a owl:Class ;
  rdfs:label "Software"@en ;
  rdfs:comment "Software (including firmware) needed to run & use the OSH" ;
  rdfs:subClassOf okh:Component ;
  .

okh:Reference
  a owl:Class ;
  rdfs:label "unambiguous reference" ;
  .

okh:Publication
  a owl:Class ;
  rdfs:label "Scientific Publication" ;
  rdfs:comment "_scientific_ (that is: peer reviewed) publication that _contains_ the design files";
  rdfs:subClassOf npg:Publication ;
  .

okh:Standard
  a owl:Class ;
  rdfs:label "Technical Standard"@en ;
  rdfs:comment "official standard used in the _design_ (not e.g. DIN SPEC 3105-1)" ;
  .

okh:WebsiteUrl
  a owl:Class ;
  rdfs:label "Website URL" ;
  rdfs:subClassOf okh:Reference ;
  rdfs:subClassOf schema:URL ;
  .

okh:FileUrl
  a owl:Class ;
  rdfs:label "permanent URL to file" ;
  rdfs:subClassOf okh:ComponentReference ;
  rdfs:subClassOf schema:URL ;
  vs:term_status "deprecated" ;
  owl:deprecated "true"^^xsd:boolean ;
  cc:deprecatedOn "2023-07-11"^^xsd:date ;
  schema:supersededBy okh:File ;
  .

okh:File
  a owl:Class ;
  rdfs:label "File" ;
  rdfs:comment "A file that forms part of the project, specified/located either by a URL (okh:url) or a repo-/project-relative path (okh:relativePath)." ;
  .

okh:ManifestFile
  a owl:Class ;
  rdfs:label "manifest file" ;
  rdfs:comment "file holding the metadata" ;
  rdfs:subClassOf okh:File ;
  .

okh:Readme
  a owl:Class ;
  rdfs:label "Readme" ;
  rdfs:subClassOf okh:File ;
  .

okh:ContributionGuide
  a owl:Class ;
  rdfs:label "Contribution Guide" ;
  rdfs:subClassOf okh:File ;
  .

okh:Image
  a owl:Class ;
  rdfs:label "Image" ;
  rdfs:subClassOf okh:File ;
  .

okh:BoM
  a owl:Class ;
  rdfs:label "Bill of Materials" ;
  rdfs:subClassOf okh:File ;
  .

okh:SourceFile
  a owl:Class ;
  rdfs:label "source file" ;
  rdfs:subClassOf okh:File ;
  .

okh:ExportFile
  a owl:Class ;
  rdfs:label "exported source file" ;
  rdfs:subClassOf okh:File ;
  .

okh:AuxiliaryFile
  a owl:Class ;
  rdfs:label "auxiliary file (neither source nor export)" ;
  rdfs:subClassOf okh:File ;
  .

okh:ManufacturingInstructions
  a owl:Class ;
  rdfs:label "Manufacturing Instructions" ;
  rdfs:subClassOf okh:File ;
  .

okh:UserManual
  a owl:Class ;
  rdfs:label "User Manual" ;
  rdfs:subClassOf okh:File ;
  .

okh:OuterDimensions
  a owl:Class ;
  rdfs:label "outer dimensions"@en ;
  rdfs:comment "…of a module or a part"@en ;
  .

okh:Mass
  a owl:Class ;
  rdfs:label "mass"@en ;
  rdfs:comment "…of a module or a part"@en ;
  .

okh:ComponentReference
  a owl:Class ;
  rdfs:subClassOf okh:Reference ;
  rdfs:label "Component Reference" ;
  rdfs:comment '''
    others shall be able to identify/procure this component only by the given reference(s),
    MOSH → URL to corresponding release
    POSH → URL to containing folder
    STD  → standard designation (preferably naming the _latest_ standard)
    BUY  → unambiguous reference'''@en ;
  vs:term_status "deprecated" ;
  owl:deprecated "true"^^xsd:boolean ;
  cc:deprecatedOn "2023-08-19"^^xsd:date ;
  .

okh:okhv
  a owl:DatatypeProperty ;
  rdfs:label "OKH version" ;
  rdfs:comment "version of OKH specification the metadata is following (different version → different data fields)" ;
  rdfs:subPropertyOf schema:version ;
  schema:domainIncludes okh:ManifestFile ;
  owl:cardinality 1 ;
  .

okh:dataSource
  a owl:DatatypeProperty ;
  rdfs:label "Metadata Source" ;
  rdfs:comment "platform, where the crawler found the metadata (e.g. GitHub, Wikifactory)"@en ;
  rdfs:subPropertyOf schema:url ;
  schema:domainIncludes okh:Module ;
  owl:cardinality 1 ;
  .

okh:repoHost
  a owl:DatatypeProperty ;
  rdfs:label "Repository Host" ;
  rdfs:comment "platform where the OSH documentation is located (e.g. GitLab, Wikifactory or any self-hosted website or wiki)"@en ;
  rdfs:subPropertyOf schema:url ;
  schema:domainIncludes okh:Module ;
  owl:cardinality 1 ;
  .

okh:uploadMethod
  a owl:DatatypeProperty ;
  rdfs:label "Upload Method" ;
  rdfs:comment "e.g. auto (fully integrated platforms) or manifest file (for connected platforms)"@en ;
  schema:rangeIncludes xsd:string ;
  schema:domainIncludes okh:Component ;
  owl:cardinality 1 ;
  .

## ----- identification -----

okh:repo
  a owl:ObjectProperty ;
  rdfs:label "repository" ;
  rdfs:comment '''
    URL to the place where development happens (typically the repository)" ;
    following this link people shall be able to contribute to the development
    (reporting issues, suggesting changes, connecting to the team etc.)" '''@en;
  rdfs:subPropertyOf schema:codeRepository ;
  schema:rangeIncludes okh:WebsiteUrl ;
  owl:cardinality 1 ;
  schema:domainIncludes okh:Module ;
  .

okh:repoSnapshot
  a owl:ObjectProperty ;
  rdfs:label "respository snapshot" ;
  rdfs:comment "Repoistory snapshot (=specific version) URL" ;
  rdfs:subPropertyOf okh:repo ;
  schema:rangeIncludes okh:WebsiteUrl ;
  owl:cardinality 1 ;
  schema:domainIncludes okh:Module ;
  .

okh:version
  a owl:DatatypeProperty ;
  rdfs:label "version" ;
  rdfs:comment "version of this Component, preferably in the semantic versioning scheme (semver.org)" ;
  rdfs:subPropertyOf schema:version ;
  schema:domainIncludes okh:Module ;
  owl:cardinality 1 ;
  .

okh:forkOf
  a owl:ObjectProperty ;
  rdfs:label "fork of" ;
  rdfs:subPropertyOf schema:isBasedOn ;
  owl:cardinality 1 ;
  schema:domainIncludes
    okh:Module,
    okh:Part ;
  .

okh:versionOf
  a owl:ObjectProperty ;
  rdfs:label "version of" ;
  rdfs:comment "connects specific versions of Modules with their versionless superclass" ;
  schema:rangeIncludes okh:Module ;
  schema:domainIncludes okh:Module ;
  .

okh:documentationLanguage
  a owl:DatatypeProperty ;
  rdfs:label "documentation language" ;
  rdfs:comment '''
   IETF language tag
   following the BCP 47 standard e.g. en-GB
   denotes the language of the documentation for the component subject '''@en;
  rdfs:subPropertyOf schema:inLanguage ;
  owl:cardinality 1 ;
  schema:domainIncludes
    okh:Module,
    okh:Part ;
  .

## ----- legal -----

okh:licensor
  a owl:ObjectProperty ;
  rdfs:label "licensor" ;
  rdfs:comment "organization/individual behind the hardware design (holder of intellectual property)" ;
  rdfs:subPropertyOf schema:copyrightHolder ;
  schema:rangeIncludes
    schema:Organization,
    schema:Person ;
  schema:domainIncludes okh:Module ;
  owl:cardinality 1 ;
  .

okh:organization
  a owl:ObjectProperty ;
  rdfs:label "organization" ;
  rdfs:comment "organization representing (most) contributors of this project" ;
  schema:rangeIncludes schema:Organization ;
  schema:domainIncludes okh:Module ;
  .

okh:spdxLicense
  a owl:ObjectProperty ;
  rdfs:label "SPDX license identifier" ;
  rdfs:comment "view complete list under https://spdx.org/licenses/" ;
  schema:domainIncludes okh:Module ;
  schema:rangeIncludes spdxt:ListedLicense ; # aka SPDX license identifier for a single, atomar license
  owl:cardinality 1 ;
  .

okh:alternativeLicense
  a owl:ObjectProperty ;
  rdfs:label "non-SPDX license" ;
  rdfs:comment "URL to legal code of a license without SPDX identifier, hence OSHWA-compliance is to be checked manually" ;
#  rdfs:subPropertyOf spdxt:License ;
  schema:domainIncludes okh:Module ;
  schema:rangeIncludes okh:File ;
  owl:cardinality 1 ;
  .

## ----- informative -----

# okh:contributorCount
#   a owl:DatatypeProperty ;
#   rdfs:label "number of conributors participating in the project" ;
#   schema:domainIncludes okh:Module ;
#   schema:rangeIncludes xsd:int ;
#   .

## ----- development stage -----

okh:technologyReadinessLevel
  a owl:ObjectProperty ;
  rdfs:label "Technology Readiness Level (TRL)" ;
  rdfs:comment "…using the OTRL definitions" ;
  owl:cardinality 1 ;
  schema:rangeIncludes otrl:OTRL ;
  schema:domainIncludes okh:Module ;
  .

okh:documentationReadinessLevel
  a owl:ObjectProperty ;
  rdfs:label "Documentation Readiness Level (DLR)" ;
  rdfs:comment "…using the ODRL definitions" ;
  owl:cardinality 1 ;
  schema:rangeIncludes otrl:ODRL ;
  schema:domainIncludes okh:Module ;
  .

okh:attestation
  a owl:ObjectProperty ;
  rdfs:label "attestation" ;
  rdfs:comment "permanent URL to evidence of compliance (OSHWA, FSF, DIN SPEC 3105)" ;
  schema:rangeIncludes okh:WebsiteUrl ;
  schema:domainIncludes okh:Module ;
  .

okh:hasPublication
  a owl:ObjectProperty ;
  rdfs:label "has Publication" ;
  rdfs:comment "design files of this OSH modules have been peer reviewed in a scientific publication" ;
  rdfs:subPropertyOf npg:hasPublication;
  schema:domainIncludes okh:Module ;
  .

# okh:certificate
#   a owl:ObjectProperty ;
#   rdfs:label "certificate" ;
#   rdfs:comment "official certificate, such as CE mark" ;
# FIXME rdfs:subPropertyOf ;
#   schema:domainIncludes okh:Module ;
#   .

## ----- basic description -----

okh:cpcPatentClass
  a owl:ObjectProperty ;
  rdfs:label "Patent Class" ;
  rdfs:comment "International Patent Classification (IPC)" ;
  rdfs:subPropertyOf patent:classificationIPCInventive;
  schema:domainIncludes okh:Module ;
  schema:rangeIncludes xsd:string ;
  .

okh:compliesWith
  a owl:ObjectProperty ;
  rdfs:label "complies with a technical standard" ;
#  rdfs:subPropertyOf wdp:P5009 ;
  schema:domainIncludes okh:Component ;
  schema:rangeIncludes okh:Standard ;
  .

okh:standardID
  a owl:DatatypeProperty ;
  rdfs:label "Document identifier for the technical standard" ;
#  rdfs:subPropertyOf wdp:P5046 ;
  schema:rangeIncludes xsd:string ;
  schema:domainIncludes okh:Standard ;
  .

okh:function
  a owl:DatatypeProperty ;
  rdfs:label "functional description" ;
  rdfs:comment '''
    functional description, e.g. what it actually does, what problem it solves, for whom, under which conditions etc.
    so if you wish that someone finds & uses your okh specifically e.g. for COVID-19-crisis response, include relevant keywords in this field
    optional: description of input, output and interfaces'''@en ;
  rdfs:subPropertyOf obo:BFO_0000016 ; # aka function
  owl:cardinality 1 ;
  schema:domainIncludes okh:Module ;
  schema:rangeIncludes xsd:string ;
  .

okh:hasReadme
  a owl:ObjectProperty ;
  rdfs:label "has Readme" ;
  rdfs:comment "links to the corresponding Readme" ;
  schema:rangeIncludes okh:Readme ;
  schema:domainIncludes okh:Module ;
  .

okh:hasContributionGuide
  a owl:ObjectProperty ;
  rdfs:label "has Contribution Guide" ;
  rdfs:comment "links to the corresponding Contribution Guide" ;
  schema:rangeIncludes okh:ContributionGuide ;
  schema:domainIncludes okh:Module ;
  .

okh:hasBoM
  a owl:ObjectProperty ;
  rdfs:label "has Bill of Materials" ;
  rdfs:comment "links to the corresponding Bill of Materials" ;
  schema:rangeIncludes okh:BoM ;
  schema:domainIncludes okh:Module ;
  .

okh:hasComponent
  a owl:ObjectProperty ;
  rdfs:label "has Component" ;
  rdfs:comment "Links to sub-components of the Module. In the case of that sub-component being an external Module, it has to refer to a snapshot of the RDF object representing that OKH Module. Each sub-component should also appear in the BoM." ;
  schema:rangeIncludes
    okh:Part,
    okh:Module,
    okh:WebsiteUrl ;
  schema:domainIncludes okh:Module ;
  .

okh:hasImage
  a owl:ObjectProperty ;
  rdfs:label "has image" ;
  rdfs:comment "links to the corresponding Image" ;
  rdfs:subPropertyOf schema:image ;
  schema:rangeIncludes okh:Image ;
  schema:domainIncludes okh:Component ;
  .

okh:functionalMetadata
  a owl:DatatypeProperty ;
  rdfs:label "functionality metadata" ;
  rdfs:comment "Metadata addressing functionality, such as dimensions, material, weight, RPM,… (not standardized)" ;
  rdfs:subPropertyOf schema:value ;
  schema:rangeIncludes schema:StructuredValue ;
  schema:domainIncludes okh:Module ;
  .

okh:productionMetadata
  a rdf:Property ;
  rdfs:label "production metadata" ;
  rdfs:comment "production-relevant metadata, such as material, manufacturing technology, outer dimensions, smallest tolerance, finest surface roughness" ;
  rdfs:subPropertyOf schema:value ;
  schema:domainIncludes
    okh:Module,
    okh:Part ;
  .

okh:manufacturingProcess
  a owl:DatatypeProperty ;
  rdfs:label "manufacturing process" ;
  rdfs:subPropertyOf okh:productionMetadata ;
  .

okh:material
  a owl:DatatypeProperty ;
  rdfs:label "material" ;
  rdfs:subPropertyOf okh:productionMetadata ;
  .

okh:hasOuterDimensions
  a owl:ObjectProperty ;
  rdfs:label "outer dimensions using OpenSCAD primitives" ;
  rdfs:comment "https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids" ;
  schema:rangeIncludes okh:OuterDimensions ;
  rdfs:subPropertyOf okh:productionMetadata ;
  .

okh:hasMass
  a owl:ObjectProperty ;
  rdfs:label "mass of the component" ;
  rdfs:subPropertyOf okh:productionMetadata ;
  schema:rangeIncludes okh:Mass ;
  .

okh:openSCAD
  a owl:DatatypeProperty ;
  rdfs:label "OpenSCAD code defining a shape" ;
  schema:domainIncludes okh:OuterDimensions ;
  schema:rangeIncludes xsd:string ;
  .

okh:openScad
  vs:term_status "deprecated" ;
  owl:deprecated "true"^^xsd:boolean ;
  cc:deprecatedOn "2023-07-06"^^xsd:date ;
  schema:supersededBy okh:openSCAD ;
  owl:sameAs okh:openSCAD ;
  .

okh:unit
  a owl:DatatypeProperty ;
  rdfs:label "unit" ;
  rdfs:comment "mm, cm, m, g, kg" ;
  schema:domainIncludes
    okh:Mass,
    okh:OuterDimensions ;
  .

okh:value
  a owl:DatatypeProperty ;
  rdfs:label "value" ;
  schema:domainIncludes okh:Mass ;
  .

okh:smallestToleranceClass
  a owl:ObjectProperty ;
  rdfs:label "smallest tolerance class (following ISO 286)" ;
# fixme rdfs:subPropertyOf ;
  rdfs:subPropertyOf okh:productionMetadata ;
  schema:domainIncludes okh:Part ;
  .

okh:hasManifestFile
  a owl:ObjectProperty ;
  rdfs:label "has manifest file" ;
  schema:rangeIncludes okh:ManifestFile ;
  schema:domainIncludes
    okh:Module,
    okh:Part ;
  .

okh:doi
  a owl:DatatypeProperty ;
  rdfs:label "DOI"@en ;
  rdfs:comment "this publication has a digital object identifier (DOI)"@en ;
  schema:domainIncludes okh:Publication ;
  rdfs:subPropertyOf npg:doi ;
  .

okh:relativePath
  a owl:ObjectProperty ;
  rdfs:label "Project-/Repo-relative file path, directly starting with the first path element, *NOT* with '/' or './'" ;
  rdfs:subPropertyOf schema:url ;
  schema:domainIncludes okh:File ;
  # NOTE Looked for HOURS to find a file-path, file-location, ... anything like that in tthe RDF world, suitable for relative paths, and there seems to be none!
  #      Closest thing was this: <https://www.semanticdesktop.org/ontologies/2007/03/22/nfo/#fileUrl>,
  #      which links to this: <https://commons.apache.org/proper/commons-vfs/filesystems.html#Local_Files>,
  #      which does not allow for relative paths, only for absolute ones.
  #      (Searched with <https://lov.linkeddata.es/dataset/lov/terms>)
  schema:rangeIncludes xsd:string ;
  .

okh:url
  a owl:ObjectProperty ;
  rdfs:label "file URL"@en ;
  rdfs:comment "Global file locator, using either the HTTP or the HTTPS protocol."@en ;
  rdfs:subPropertyOf schema:url ;
  schema:domainIncludes okh:File ;
  .

okh:fileUrl
  a owl:ObjectProperty ;
  rdfs:label "file URL" ;
  rdfs:subPropertyOf schema:url ;
  schema:domainIncludes okh:File ;
  vs:term_status "deprecated" ;
  owl:deprecated "true"^^xsd:boolean ;
  cc:deprecatedOn "2023-07-11"^^xsd:date ;
  schema:supersededBy okh:url ;
  .

okh:permaURL
  a owl:ObjectProperty ;
  rdfs:label "Permanent file URL - It was not 'permanent', but rather 'frozen in time', and it was alsoThis was used in the karwler, but badly. Things simply should not be done that way, but rather with a separate manifest file, where either everything is frozen, or nothing is, and the manifest file (internally) itsself being marked accordingly." ;
  schema:domainIncludes okh:File ;
  vs:term_status "deprecated" ;
  owl:deprecated "true"^^xsd:boolean ;
  cc:deprecatedOn "2023-07-11"^^xsd:date ;
  .

okh:fileFormat
  a owl:ObjectProperty ;
  rdfs:label "file format" ;
  rdfs:subPropertyOf schema:encodingFormat ;
  schema:domainIncludes okh:File ;
  .

okh:timestamp
  a owl:ObjectProperty ;
  rdfs:label "timestamp" ;
  rdfs:comment "following ISO 8601; see: <https://www.w3.org/TR/xmlschema11-2/#dateTimeStamp>" ;
  schema:domainIncludes okh:Module ;
  schema:rangeIncludes xsd:dateTimeStamp ;
  .

okh:source
  a owl:ObjectProperty ;
  rdfs:label "source file" ;
  rdfs:comment "relative link to a source file" ;
  schema:rangeIncludes okh:SourceFile ;
  schema:domainIncludes
    okh:Module,
    okh:Part ;
  .

okh:export
  a owl:ObjectProperty ;
  rdfs:label "exported source file" ;
  rdfs:comment "URL to a (generated) exported source file" ;
  schema:rangeIncludes okh:ExportFile ;
  schema:domainIncludes
    okh:Module,
    okh:Part ;
  .

okh:auxiliary
  a owl:ObjectProperty ;
  rdfs:label "has auxiliary file" ;
  rdfs:comment "reference to an auxiliary file" ;
  schema:rangeIncludes okh:AuxiliaryFile ;
  schema:domainIncludes
    okh:Module,
    okh:Part ;
  .

okh:hasUserManual
  a owl:ObjectProperty ;
  rdfs:label "has User Manual" ;
  schema:rangeIncludes okh:UserManual ;
  schema:domainIncludes okh:Module ;
  .

okh:hasManufacturingInstructions
  a owl:ObjectProperty ;
  rdfs:label "has Manufacturing Instructions" ;
  schema:rangeIncludes okh:ManufacturingInstructions ;
  schema:domainIncludes
    okh:Module,
    okh:Part ;
  .

okh:tsdc
  a owl:ObjectProperty ;
  rdfs:label "TsDC" ;
  rdfs:comment "Applicable Technology-specific Documentation Criteria, according to DIN SPEC 3105-1, e.g. `tsdc:3DP`" ;
  schema:rangeIncludes tsdc:OHTsDC ;
  schema:domainIncludes okh:Component ;
  .

okh:relatedTsdc
  vs:term_status "deprecated" ;
  owl:deprecated "true"^^xsd:boolean ;
  cc:deprecatedOn "2023-07-10"^^xsd:date ;
  schema:supersededBy okh:tsdc ;
  owl:sameAs okh:tsdc ;
  .

# source, export

okh:hasSoftware
  a owl:ObjectProperty ;
  rdfs:label "has Software" ;
  schema:rangeIncludes okh:Software ;
  schema:domainIncludes okh:Module ;
  .

okh:release
  a owl:DatatypeProperty ;
  rdfs:label "release" ;
  rdfs:comment "URL to release" ;
#  rdfs:subPropertyOf schema:url ;
  schema:domainIncludes
    okh:Module,
    okh:Software ;
  .

okh:installationGuide
  a owl:DatatypeProperty ;
  rdfs:label "Installation Guide" ;
#  rdfs:subPropertyOf schema:url ;
  schema:domainIncludes okh:Software ;
  .

### ----- source/export subproperties -----
### (from TsDC)
#
#okh:rationale
#  a owl:ObjectProperty ;
#  rdfs:label "rationale" ;
#  schema:rangeIncludes
#    okh:export,
#    okh:source ;
#  schema:domainIncludes okh:Component ;
#  .
#
#okh:design
#  a owl:ObjectProperty ;
#  rdfs:label "design file" ;
#  schema:rangeIncludes
#    okh:export,
#    okh:source ;
#  schema:domainIncludes
#    okh:Module,
#    okh:Part ;
#  .
