@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix dc:      <http://purl.org/dc/elements/1.1/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix bibo:    <http://purl.org/ontology/bibo/> .
@prefix vann:    <http://purl.org/vocab/vann/> .
@prefix cc:      <http://creativecommons.org/ns#> .

@prefix arch:    <https://meta.linked.archi/core#> .
@prefix :        <https://meta.linked.archi/backstage/onto#> .

#################################################################
# Ontology Declaration
#################################################################

<https://meta.linked.archi/backstage/onto#>
    rdf:type                      owl:Ontology ;
    owl:imports                   <https://meta.linked.archi/core#> ;
    cc:license                    "http://creativecommons.org/licenses/by/4.0/" ;
    vann:preferredNamespaceUri    "https://meta.linked.archi/backstage/onto#" ;
    vann:preferredNamespacePrefix "bs" ;
    dcterms:creator               "Kalin Maldzhanski"^^xsd:string ;
    dc:title                      "Linked.Archi Backstage Metamodel Ontology"@en ;
    dc:description                '''An RDF/OWL ontology for Backstage catalog entities and their
relationships, extending the Linked.Archi core ontology.
This is not an official Spotify document.'''@en ;
    dcterms:created               "2019-03-17"^^xsd:date ;
    dcterms:modified              "2026-04-12"^^xsd:date ;
    dc:publisher                  "Linked.Archi"@en,
                                  <https://linked.archi> ;
    bibo:status                   "draft" ;
    owl:versionIRI                <https://meta.linked.archi/backstage/onto/0.2.0#> ;
    owl:versionInfo               "0.2.0"@en ;
    rdfs:seeAlso                  <https://backstage.io/docs/features/software-catalog/> ;
    skos:historyNote              '''0.2.0: Modernized to Linked.Archi conventions. Replaced
rdfs:domain/rdfs:range with arch:domainIncludes/arch:rangeIncludes. Added three-declaration
qualified relationship pattern. Added @en language tags. Added full ontology header.'''@en ;
.

#################################################################
# Element Classes
#################################################################

:Component
    a               owl:Class ;
    rdfs:subClassOf arch:Element ;
    skos:prefLabel  "Component"@en ;
    skos:definition "A deployable unit, service, library, or application."@en ;
.

:System
    a               owl:Class ;
    rdfs:subClassOf arch:Element ;
    skos:prefLabel  "System"@en ;
    skos:definition "A set of components and resources that provide business or technical value."@en ;
.

:API
    a               owl:Class ;
    rdfs:subClassOf arch:Element ;
    skos:prefLabel  "API"@en ;
    skos:definition "An API that is owned and maintained in the ecosystem."@en ;
.

:Resource
    a               owl:Class ;
    rdfs:subClassOf arch:Element ;
    skos:prefLabel  "Resource"@en ;
    skos:definition "A resource used by components or systems (e.g., database, bucket, external service)."@en ;
.

:Domain
    a               owl:Class ;
    rdfs:subClassOf arch:Element ;
    skos:prefLabel  "Domain"@en ;
    skos:definition "A high-level grouping (often aligned to business domains)."@en ;
.

:User
    a               owl:Class ;
    rdfs:subClassOf arch:Element ;
    skos:prefLabel  "User"@en ;
    skos:definition "A human user in the Backstage ecosystem."@en ;
.

:Group
    a               owl:Class ;
    rdfs:subClassOf arch:Element ;
    skos:prefLabel  "Group"@en ;
    skos:definition "A group of users (e.g., team, department, tribe)."@en ;
.


#################################################################
# Relationship Types
#################################################################

## Ownership ───────────────────────────────────────────────────

:ownedBy
    a                    owl:ObjectProperty ;
    skos:prefLabel       "Owned By"@en ;
    skos:definition      "Element is owned by a group."@en ;
    arch:domainIncludes  arch:Element ;
    arch:rangeIncludes   :Group ;
.

:Ownership
    a                    owl:Class ;
    rdfs:subClassOf      arch:QualifiedRelationship ;
    arch:unqualifiedForm :ownedBy ;
    skos:prefLabel       "Ownership"@en ;
    skos:definition      "An ownership relationship from an element to a group."@en ;
    arch:domainIncludes  arch:Element ;
    arch:rangeIncludes   :Group ;
.

:qualifiedOwnedBy
    a                    owl:ObjectProperty ;
    rdfs:range           :Ownership ;
    arch:unqualifiedForm :ownedBy ;
.

## Part of System ──────────────────────────────────────────────

:partOfSystem
    a                    owl:ObjectProperty ;
    skos:prefLabel       "Part of System"@en ;
    skos:definition      "Component is part of a system."@en ;
    arch:domainIncludes  :Component ;
    arch:rangeIncludes   :System ;
.

:SystemMembership
    a                    owl:Class ;
    rdfs:subClassOf      arch:QualifiedRelationship ;
    arch:unqualifiedForm :partOfSystem ;
    skos:prefLabel       "System Membership"@en ;
    skos:definition      "A membership relationship from a component to a system."@en ;
    arch:domainIncludes  :Component ;
    arch:rangeIncludes   :System ;
.

:qualifiedPartOfSystem
    a                    owl:ObjectProperty ;
    rdfs:range           :SystemMembership ;
    arch:unqualifiedForm :partOfSystem ;
.

## Provides API ────────────────────────────────────────────────

:providesAPI
    a                    owl:ObjectProperty ;
    skos:prefLabel       "Provides API"@en ;
    skos:definition      "Component provides an API."@en ;
    arch:domainIncludes  :Component ;
    arch:rangeIncludes   :API ;
.

:APIProvision
    a                    owl:Class ;
    rdfs:subClassOf      arch:QualifiedRelationship ;
    arch:unqualifiedForm :providesAPI ;
    skos:prefLabel       "API Provision"@en ;
    skos:definition      "A provision relationship from a component to an API."@en ;
    arch:domainIncludes  :Component ;
    arch:rangeIncludes   :API ;
.

:qualifiedProvidesAPI
    a                    owl:ObjectProperty ;
    rdfs:range           :APIProvision ;
    arch:unqualifiedForm :providesAPI ;
.

## Consumes API ────────────────────────────────────────────────

:consumesAPI
    a                    owl:ObjectProperty ;
    skos:prefLabel       "Consumes API"@en ;
    skos:definition      "Component consumes an API."@en ;
    arch:domainIncludes  :Component ;
    arch:rangeIncludes   :API ;
.

:APIConsumption
    a                    owl:Class ;
    rdfs:subClassOf      arch:QualifiedRelationship ;
    arch:unqualifiedForm :consumesAPI ;
    skos:prefLabel       "API Consumption"@en ;
    skos:definition      "A consumption relationship from a component to an API."@en ;
    arch:domainIncludes  :Component ;
    arch:rangeIncludes   :API ;
.

:qualifiedConsumesAPI
    a                    owl:ObjectProperty ;
    rdfs:range           :APIConsumption ;
    arch:unqualifiedForm :consumesAPI ;
.

## Uses Resource ───────────────────────────────────────────────

:usesResource
    a                    owl:ObjectProperty ;
    skos:prefLabel       "Uses Resource"@en ;
    skos:definition      "Component uses a resource."@en ;
    arch:domainIncludes  :Component ;
    arch:rangeIncludes   :Resource ;
.

:ResourceUsage
    a                    owl:Class ;
    rdfs:subClassOf      arch:QualifiedRelationship ;
    arch:unqualifiedForm :usesResource ;
    skos:prefLabel       "Resource Usage"@en ;
    skos:definition      "A usage relationship from a component to a resource."@en ;
    arch:domainIncludes  :Component ;
    arch:rangeIncludes   :Resource ;
.

:qualifiedUsesResource
    a                    owl:ObjectProperty ;
    rdfs:range           :ResourceUsage ;
    arch:unqualifiedForm :usesResource ;
.

## Belongs to Domain ───────────────────────────────────────────

:belongsToDomain
    a                    owl:ObjectProperty ;
    skos:prefLabel       "Belongs to Domain"@en ;
    skos:definition      "Element belongs to a domain."@en ;
    arch:domainIncludes  arch:Element ;
    arch:rangeIncludes   :Domain ;
.

:DomainMembership
    a                    owl:Class ;
    rdfs:subClassOf      arch:QualifiedRelationship ;
    arch:unqualifiedForm :belongsToDomain ;
    skos:prefLabel       "Domain Membership"@en ;
    skos:definition      "A membership relationship from an element to a domain."@en ;
    arch:domainIncludes  arch:Element ;
    arch:rangeIncludes   :Domain ;
.

:qualifiedBelongsToDomain
    a                    owl:ObjectProperty ;
    rdfs:range           :DomainMembership ;
    arch:unqualifiedForm :belongsToDomain ;
.

## Member of Group ─────────────────────────────────────────────

:memberOf
    a                    owl:ObjectProperty ;
    skos:prefLabel       "Member Of"@en ;
    skos:definition      "User is a member of a group."@en ;
    arch:domainIncludes  :User ;
    arch:rangeIncludes   :Group ;
.

:GroupMembership
    a                    owl:Class ;
    rdfs:subClassOf      arch:QualifiedRelationship ;
    arch:unqualifiedForm :memberOf ;
    skos:prefLabel       "Group Membership"@en ;
    skos:definition      "A membership relationship from a user to a group."@en ;
    arch:domainIncludes  :User ;
    arch:rangeIncludes   :Group ;
.

:qualifiedMemberOf
    a                    owl:ObjectProperty ;
    rdfs:range           :GroupMembership ;
    arch:unqualifiedForm :memberOf ;
.

#################################################################
# Attribute Properties
#################################################################

:lifecycle
    a                   owl:DatatypeProperty ;
    skos:prefLabel      "Lifecycle"@en ;
    skos:definition     "Component lifecycle (e.g., production, deprecated, experimental)."@en ;
    arch:domainIncludes :Component ;
    rdfs:range          xsd:string ;
.
