PREFIX cold: <http://purl.org/configurationontology#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

cold:CompletelyDefinedConfiguration a rdfs:Class ;
  rdfs:label "Completely defined configuration"@en ;
  rdfs:subClassOf cold:Configuration .

cold:impossible a rdf:Property ;
  rdfs:label "impossible"@en ;
  rdfs:comment "Models a choice that conflicts with the definition of this configuration: when a specification is not compatible with a configuration, the configuration engine can nevertheless provide a way to select it - of course, at the cost of discarding some of the previous selections; there is a conflict, to be resolved by removing or changing some of the cold:definingChoice(s). "@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range cold:ConfigurationLink ;
  rdfs:subPropertyOf cold:link .

cold:maxPrice a rdf:Property ;
  rdfs:label "max price"@en ;
  rdfs:comment "An upper limit set on the price of the configuration."@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range <http://purl.org/goodrelations/v1#UnitPriceSpecification> ;
  rdfs:subPropertyOf cold:definingChoice .

cold:choiceSeq a rdf:Property ;
  rdfs:label "choice sequence"@en ;
  rdfs:comment "Choices are made one at a time and in a given order, which may matter. Of course it doesn’t impact the characteristics of the product in any way, but it can be used by some applications."@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range rdf:Seq ;
  rdfs:subPropertyOf cold:definingChoice .

cold:lexicon a rdf:Property ;
  rdfs:label "lexicon"@en ;
  rdfs:comment "Used to link a Configuration, a ConfigurationVariable or a Specification to a Lexicon."@en ;
  rdfs:range cold:Lexicon .

cold:alternative a rdf:Property ;
  rdfs:label "alternative"@en ;
  rdfs:comment "Models the possibility to change a previous choice (links the configuration to a similar one, with one of the definingChoices removed or changed. This property may not be used when the chosen specification in question happens to be implied by the other choices"@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range cold:ConfigurationLink ;
  rdfs:subPropertyOf cold:link .

cold:defaultSpec a rdf:Property ;
  rdfs:label "default"@en ;
  rdfs:comment "Specification included by default in a Completely Defined Product matching this configuration"@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range cold:Specification .

cold:chosenSpec a rdf:Property ;
  rdfs:label "chosen specification"@en ;
  rdfs:comment """A SubProperty of co:definingChoice listing the specifications selected by the user: 
If two or more of the cold:chosenSpec of a Configuration correspond to the same cold:ConfigurationVariable, by convention they are to be interpreted as ORed (even XORed, by the way, as such specifications are alternative). 
So:
ex:AConf coold:chosenSpec ex:SimpleRadio, ex:RadioMP3.
means that the car has either a ex:SimpleRadio, or a ex:RadioMP3, not both. """@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range cold:Specification ;
  rdfs:subPropertyOf cold:definingChoice .

cold:completed a rdf:Property ;
  rdfs:label "completed"@en ;
  rdfs:comment "Links a Configuration to a completely defined one (that is, a Completely Defined Configuration that matches the configuration in question). The price of the linked configuration may be higher than this configuration price. Configurations completed at the same price are given by the completedAtSamePrice property."@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range <https://w3id.org/linkml/Any> .

cold:impliedSpec a rdf:Property ;
  rdfs:label "implied specification"@en ;
  rdfs:comment "A Specification that is implied by the conjunction of the definingChoice(s) of this Configuration."@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range cold:Specification .

cold:link a rdf:Property ;
  rdfs:label "configuration link"@en ;
  rdfs:comment """Parent property of all the properties linking a Configuration to another one in the configuration process.
The HTML display of a cold:ConfigurationLink corresponds to an hypertext link, whose href is the value of the cold:linkedConf property. As for the text of this link, the rdfs:label of the cold:specToBeAdded value is quite adequate. It can be directly included in the RDF as the rdfs:label of the cold: ConfigurationLink"""@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range cold:ConfigurationLink .

cold:completedAtSamePrice a rdf:Property ;
  rdfs:label "completed at the same price"@en ;
  rdfs:comment "Links a Configuration to a completely defined one, which has the same price."@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range <https://w3id.org/linkml/Any> ;
  rdfs:subPropertyOf cold:completed .

cold:definingChoice a rdf:Property ;
  rdfs:label "defining choice"@en ;
  rdfs:comment "Parent to all properties specifying the choices that define the Configuration: a Configuration is defined by the list of triples it is the subject of, and which have a co:definingChoice as their predicates. "@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range <https://w3id.org/linkml/Any> .

cold:proposedConf a rdf:Property ;
  rdfs:label "proposal"@en ;
  rdfs:comment "Links a Configuration to another one supposed to be of interest for a customer at this point in the configuration process. The semantics is rather vague, leaving open the possibility to link to a Configuration that matches the defining choices of the subject configuration, or not (to be used by marketing people for bargains, 'upselling', etc.)"@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range cold:Configuration .

cold:possible a rdf:Property ;
  rdfs:label "possible"@en ;
  rdfs:comment "Models a choice (or a set of choices) that can be made without changing any of the previous choices done in the configuration: links to a Configuration whose list of definingChoice(s) contains the list of definingChoice(s) of this configuration."@en ;
  rdfs:domain cold:Configuration ;
  rdfs:range cold:ConfigurationLink ;
  rdfs:subPropertyOf cold:link .

cold:Lexicon a rdfs:Class ;
  rdfs:label "Lexicon"@en ;
  rdfs:comment "The set of specifications (and of their corresponding configuration variables) used in the configuration process: all the possible descriptive attributes of the configured product."@en .

cold:Configuration a rdfs:Class ;
  rdfs:label "Configuration"@en , "Configuration"@fr ;
  rdfs:comment """A state of the configuration process, assumed to correspond to a valid partially defined product - valid in the sense that it can be completed into an existing fully specified product, one that can be ordered, without changing any of the current selections.

A configuration is defined by a Lexicon (the set of the descriptive attributes of the configured product, cf. the \"lexicon\" property), and by the set of choices that have been made so far (typically  selected specifications), cf. the \"definingChoice\" property.

Note: A configurator application may conceivably have to handle “invalid configurations”, that is, combinations of specifications that are impossible. This can happen, for instance, if the user is allowed to begin the configuration process by choosing features without any control of their compatibility; or if she is allowed to choose a feature incompatible with her previous selections. In this case, it is the responsibility of the configurator application to restore the consistency of the configuration, necessarily by excluding some of the previous user selections. This Configuration class excludes such invalid combinations. 

Relation with GoodRelations and schema.org vocabularies :
because a configuration mainly describes a Partially Defined Product, it can be seen as a GoodRelations \"ProductOrServiceModel\" (or a schema.org \"ProductModel): \"an intangible entity that specifies some characteristics of a group of similar, usually mass-produced products, in the sense of a prototype\". The suffix \"Model\" may seem misleading when used for a Configuration, as it suggests something such as \"Ford T\", and not \"Ford T with sunroof and climat control (itself not a completely defined product -  you still can choose, well, the color: it is a \"prototype of similar products\").

On the other hand, a Configuration has a price (more precisely, a \"from price\" - the minimum of the \"suggested retail prices\" of all the matching completely defined products). As such, a Configuration may be seen as a commercial offer. It can also be used to represent a customer's wish list, constrained by the definition of the range. It could therefore be considered as a gr:Offering (or a schema:Offer) as well.

But gr:ProductOrService and gr:Offering are disjoint classes: a given Configuration cannot be both. Depending on the use case, one publisher of configuration data may want to type her Configurations with either of these classes."""@en .

<http://purl.org/goodrelations/v1#QuantitativeValue> a rdfs:Class .

<http://purl.org/goodrelations/v1#QualitativeValue> a rdfs:Class .

cold:Model a rdfs:Class ;
  rdfs:label "Model specification"@en ;
  rdfs:comment "A specification that identifies a model (like \"Ford T\"). Corresponding configurations are supposed to share the same lexicon."@en ;
  rdfs:subClassOf cold:Specification .

cold:specId a rdf:Property ;
  rdfs:comment "Code identifying a Specification within the Lexicon it belongs to."@en ;
  rdfs:domain cold:Specification ;
  rdfs:range <https://w3id.org/linkml/Any> .

rdf:Seq a rdfs:Class .

cold:ConfigurationLink a rdfs:Class ;
  rdfs:label "Configuration Link"@en ;
  rdfs:comment "Models the link between a given Configuration and another one (a change of state in the configuration process): typically, the association of a Specification to be selected, and of a resulting Configuration."@en .

cold:specToBeAdded a rdf:Property ;
  rdfs:label "added specification"@en ;
  rdfs:comment "Specification to be added to a Configuration in a ConfigurationLink"@en ;
  rdfs:domain cold:ConfigurationLink ;
  rdfs:range cold:Specification .

cold:linkedConf a rdf:Property ;
  rdfs:label "linked configuration"@en ;
  rdfs:comment "the linked configuration that contains choices of current Configuration plus the specifications that will be added and listed in the configuration link it belongs to."@en ;
  rdfs:domain cold:ConfigurationLink ;
  rdfs:range cold:Configuration .

cold:specToBeRemoved a rdf:Property ;
  rdfs:label "removed specification"@en ;
  rdfs:comment "Specification to be removed from a Configuration in a ConfigurationLink"@en ;
  rdfs:domain cold:ConfigurationLink ;
  rdfs:range cold:Specification .

<http://purl.org/goodrelations/v1#UnitPriceSpecification> a rdfs:Class .

cold:ConfigurationVariable a rdfs:Class ;
  rdfs:label "Configuration variable"@en ;
  rdfs:comment "A variable in a Lexicon, eg. the fuel type, or the body color. Automotive ranges typically only use discrete variables: the possible values corresponding to one ConfigurationVariable are alternative specifications (for instance \"Diesel\", \"Gasoline\", etc.  for the fuel type variable)"@en .

cold:hasValue a rdf:Property ;
  rdfs:label "has value"@en ;
  rdfs:comment "Used in a Lexicon to list the values (specifications) of a ConfigurationVariable. Alternatively, we could say that these specifications have rdf:type the ConfigurationVariable in question."@en ;
  rdfs:domain cold:ConfigurationVariable ;
  rdfs:range cold:Specification .

cold:confVarId a rdf:Property ;
  rdfs:comment "Code identifying a ConfigurationVariable within the Lexicon it belongs to."@en ;
  rdfs:domain cold:ConfigurationVariable ;
  rdfs:range <https://w3id.org/linkml/Any> .

<https://w3id.org/linkml/Any> a rdfs:Class ;
  rdfs:comment "An unconstrained type or object"@en .

cold:Specification a rdfs:Class ;
  rdfs:label "Specification"@en ;
  rdfs:comment "Feature, option, any value of a characteristic of a product that can be chosen during the configuration process. For instance: \"Automatic gearbox\", \"Blue body color\", \"CO2 emission value < 100 g of CO2\""@en .

<http://purl.org/goodrelations/v1#includes> a rdf:Property ;
  rdfs:range <https://w3id.org/linkml/Any> .
