@prefix :       <http://demo.openlinksw.com/schemas/CustomerKG/> .
@prefix ckg:    <http://demo.openlinksw.com/schemas/CustomerKG/> .
@prefix schema: <http://schema.org/> .
@prefix xsd:    <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:   <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:    <http://www.w3.org/2002/07/owl#> .
@prefix skos:   <http://www.w3.org/2004/02/skos/core#> .

# TBox for the CustomerKG RDF View on demo.openlinksw.com. The ontology is the entity
# <http://demo.openlinksw.com/schemas/CustomerKG/>; this document is a separate CreativeWork.

<http://demo.openlinksw.com/schemas/CustomerKG/ontology-document> a schema:CreativeWork ;
    schema:name "CustomerKG ontology (TBox)"@en ;
    schema:description "RDFS/OWL vocabulary for the CustomerKG demonstration: customers, identity signals, consent, channels, products, offers, guardrails, campaigns, decisions, context items and outcomes, grouped under the four kinds of context the Databricks agentic-marketing article names. Loaded into the named graph http://demo.openlinksw.com/schemas/CustomerKG/."@en ;
    schema:dateCreated "2026-10-02T00:00:00Z"^^xsd:dateTime ;
    schema:dateModified "2026-10-02T00:00:00Z"^^xsd:dateTime ;
    schema:author <https://www.linkedin.com/in/kidehen#this> ;
    schema:about <http://demo.openlinksw.com/schemas/CustomerKG/> .

<http://demo.openlinksw.com/schemas/CustomerKG/> a owl:Ontology ;
    rdfs:label "CustomerKG ontology"@en ;
    rdfs:comment "Vocabulary for describing the customer, business, decision and control context an agent reads before choosing a marketing action, and the measured outcome that follows."@en ;
    owl:versionInfo "1.0"@en .

# ── Classes ────────────────────────────────────────────────────────────────

ckg:ContextElement a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Context element"@en ;
    rdfs:comment "Anything an agent may read before deciding what to do for a customer. The four groups below follow the four kinds of context the Databricks article names: customer, business, decision and control."@en ;
    rdfs:subClassOf schema:Thing .

ckg:CustomerContextElement a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Customer context element"@en ;
    rdfs:comment "Identity, behaviour, preference, consent and lifecycle facts about a customer."@en ;
    rdfs:subClassOf ckg:ContextElement .

ckg:BusinessContextElement a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Business context element"@en ;
    rdfs:comment "Growth objectives, margin, brand rules, inventory and channel constraints."@en ;
    rdfs:subClassOf ckg:ContextElement .

ckg:DecisionContextElement a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Decision context element"@en ;
    rdfs:comment "The actions already taken, how customers responded and why earlier decisions were made."@en ;
    rdfs:subClassOf ckg:ContextElement .

ckg:ControlElement a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Control element"@en ;
    rdfs:comment "The intent, guardrails, permissions and approval points that people define and agents must respect."@en ;
    rdfs:subClassOf ckg:ContextElement .

ckg:Customer a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Customer"@en ;
    rdfs:comment "A person who buys from the brand, with a lifecycle stage and a loyalty tier."@en ;
    rdfs:subClassOf schema:Person, ckg:CustomerContextElement .

ckg:IdentitySignal a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Identity signal"@en ;
    rdfs:comment "One observation that may identify a customer: an email hash, device, app session, ad exposure or loyalty id, with the method that matched it and the confidence. Unmatched pseudonymous signals have no customer."@en ;
    rdfs:subClassOf schema:Observation, ckg:CustomerContextElement .

ckg:ConsentRecord a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Consent record"@en ;
    rdfs:comment "Whether a customer allows contact on one channel. It is both a customer fact and a control, so it sits under both groups."@en ;
    rdfs:subClassOf schema:Permit, ckg:CustomerContextElement, ckg:ControlElement .

ckg:Channel a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Channel"@en ;
    rdfs:comment "A way to reach a customer, owned or paid."@en ;
    rdfs:subClassOf schema:Thing, ckg:BusinessContextElement .

ckg:Product a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Product"@en ;
    rdfs:comment "A menu item with a category and a margin percentage."@en ;
    rdfs:subClassOf schema:Product, ckg:BusinessContextElement .

ckg:Offer a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Offer"@en ;
    rdfs:comment "A reminder or incentive the brand may extend, with a discount depth and an optional promoted product."@en ;
    rdfs:subClassOf schema:Offer, ckg:BusinessContextElement .

ckg:Campaign a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Campaign"@en ;
    rdfs:comment "A goal-driven effort such as reactivating lapsed customers, within which decisions are made."@en ;
    rdfs:subClassOf schema:Action, ckg:BusinessContextElement .

ckg:Guardrail a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Guardrail"@en ;
    rdfs:comment "A rule the agent must respect: a discount cap, a contact-frequency limit, a consent requirement or a human-approval threshold."@en ;
    rdfs:subClassOf schema:Rule, ckg:ControlElement .

ckg:Decision a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Decision"@en ;
    rdfs:comment "One choice about one customer: act or not, with which offer and channel, in which experiment arm, and why."@en ;
    rdfs:subClassOf schema:Action, ckg:DecisionContextElement .

ckg:ContextItem a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Context item"@en ;
    rdfs:comment "A single labelled fact an agent read when making a decision, tagged with the kind of context it belongs to."@en ;
    rdfs:subClassOf schema:PropertyValue, ckg:ContextElement .

ckg:Outcome a owl:Class ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "Outcome"@en ;
    rdfs:comment "What happened after a decision: whether the customer ordered and the revenue, margin and costs involved."@en ;
    rdfs:subClassOf schema:Event, ckg:DecisionContextElement .

# ── Properties ─────────────────────────────────────────────────────────────

ckg:channelKind a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "channel kind"@en ;
    rdfs:comment "Whether a channel is owned (the brand controls it) or paid (media is bought)."@en ;
    rdfs:domain ckg:Channel ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:category .

ckg:category a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "category"@en ;
    rdfs:comment "Menu category such as meal, bundle, side or dessert."@en ;
    rdfs:domain ckg:Product ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:category .

ckg:marginPct a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "margin percentage"@en ;
    rdfs:comment "Gross margin of the product, in percent of price."@en ;
    rdfs:domain ckg:Product ;
    rdfs:range xsd:integer .

ckg:lifecycleStage a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "lifecycle stage"@en ;
    rdfs:comment "Where the customer sits in the relationship: active, lapsing or lapsed."@en ;
    rdfs:domain ckg:Customer ;
    rdfs:range xsd:string .

ckg:loyaltyTier a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "loyalty tier"@en ;
    rdfs:comment "Loyalty programme tier: bronze, silver or gold."@en ;
    rdfs:domain ckg:Customer ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:memberOf .

ckg:homeCity a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "home city"@en ;
    rdfs:comment "The city the customer usually orders in. Residence, never birthplace."@en ;
    rdfs:domain ckg:Customer ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:homeLocation .

ckg:usualOrderDay a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "usual order day"@en ;
    rdfs:comment "The weekday on which the customer usually orders."@en ;
    rdfs:domain ckg:Customer ;
    rdfs:range xsd:string .

ckg:signalKind a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "signal kind"@en ;
    rdfs:comment "The kind of signal: email, loyalty_id, device, app_session or ad_exposure."@en ;
    rdfs:domain ckg:IdentitySignal ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:additionalType .

ckg:signalValue a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "signal value"@en ;
    rdfs:comment "A pseudonymous token for the signal, never a raw identifier."@en ;
    rdfs:domain ckg:IdentitySignal ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:value .

ckg:matchMethod a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "match method"@en ;
    rdfs:comment "How the signal was tied to a customer: deterministic, probabilistic, agentic, or unmatched."@en ;
    rdfs:domain ckg:IdentitySignal ;
    rdfs:range xsd:string .

ckg:confidence a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "confidence"@en ;
    rdfs:comment "Match confidence in percent; zero for an unmatched signal."@en ;
    rdfs:domain ckg:IdentitySignal ;
    rdfs:range xsd:integer .

ckg:seenDate a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "seen date"@en ;
    rdfs:comment "The date the signal was last observed."@en ;
    rdfs:domain ckg:IdentitySignal ;
    rdfs:range xsd:date ;
    skos:closeMatch schema:observationDate .

ckg:resolvesTo a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "resolves to"@en ;
    rdfs:comment "The customer a signal has been resolved to. Absent for unmatched signals."@en ;
    rdfs:domain ckg:IdentitySignal ;
    rdfs:range ckg:Customer ;
    skos:closeMatch schema:about .

ckg:consentStatus a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "consent status"@en ;
    rdfs:comment "granted or withdrawn."@en ;
    rdfs:domain ckg:ConsentRecord ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:status .

ckg:updatedDate a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "updated date"@en ;
    rdfs:comment "The date the consent status last changed."@en ;
    rdfs:domain ckg:ConsentRecord ;
    rdfs:range xsd:date ;
    skos:closeMatch schema:dateModified .

ckg:forChannel a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "for channel"@en ;
    rdfs:comment "The channel the consent applies to."@en ;
    rdfs:domain ckg:ConsentRecord ;
    rdfs:range ckg:Channel .

ckg:offerKind a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "offer kind"@en ;
    rdfs:comment "reminder, incentive or bundle-incentive."@en ;
    rdfs:domain ckg:Offer ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:category .

ckg:discountPct a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "discount percentage"@en ;
    rdfs:comment "Discount depth in percent of price."@en ;
    rdfs:domain ckg:Offer ;
    rdfs:range xsd:integer ;
    skos:closeMatch schema:discount .

ckg:promotes a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "promotes"@en ;
    rdfs:comment "The product an offer promotes, when it promotes one."@en ;
    rdfs:domain ckg:Offer ;
    rdfs:range ckg:Product ;
    skos:closeMatch schema:itemOffered .

ckg:ruleKind a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "rule kind"@en ;
    rdfs:comment "discount-cap, contact-frequency, consent-required or human-approval."@en ;
    rdfs:domain ckg:Guardrail ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:category .

ckg:limitValue a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "limit value"@en ;
    rdfs:comment "The threshold the rule enforces."@en ;
    rdfs:domain ckg:Guardrail ;
    rdfs:range xsd:integer ;
    skos:closeMatch schema:value .

ckg:appliesToOffer a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "applies to offer"@en ;
    rdfs:comment "Narrows a guardrail to one offer; absent means the rule is global."@en ;
    rdfs:domain ckg:Guardrail ;
    rdfs:range ckg:Offer .

ckg:goal a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "goal"@en ;
    rdfs:comment "The business outcome the campaign is meant to move."@en ;
    rdfs:domain ckg:Campaign ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:description .

ckg:startDate a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "start date"@en ;
    rdfs:comment "When the campaign started."@en ;
    rdfs:domain ckg:Campaign ;
    rdfs:range xsd:date ;
    skos:closeMatch schema:startDate .

ckg:arm a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "experiment arm"@en ;
    rdfs:comment "treatment, or holdout for the randomised group that is deliberately left alone."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range xsd:string .

ckg:actionKind a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "action kind"@en ;
    rdfs:comment "send-reminder, send-incentive, switch-channel, suppress or no-action."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:additionalType .

ckg:decidedDate a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "decided date"@en ;
    rdfs:comment "When the decision was taken."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range xsd:date ;
    skos:closeMatch schema:startTime .

ckg:rationale a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "rationale"@en ;
    rdfs:comment "Why the agent chose this action, in words a marketer can audit."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:description .

ckg:approvedByHuman a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "approved by human"@en ;
    rdfs:comment "1 when a person approved the action, 0 otherwise."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range xsd:integer .

ckg:groundedIn a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "grounded in"@en ;
    rdfs:comment "Super-property of every link from a decision to a thing it was grounded in: its customer, campaign, offer, channel and guardrails."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range ckg:ContextElement .

ckg:forCustomer a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "for customer"@en ;
    rdfs:comment "The customer a decision or consent record concerns."@en ;
    rdfs:domain ckg:ContextElement ;
    rdfs:range ckg:Customer ;
    rdfs:subPropertyOf ckg:groundedIn ;
    skos:closeMatch schema:about .

ckg:inCampaign a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "in campaign"@en ;
    rdfs:comment "The campaign a decision belongs to."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range ckg:Campaign ;
    rdfs:subPropertyOf ckg:groundedIn ;
    skos:closeMatch schema:isPartOf .

ckg:usesOffer a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "uses offer"@en ;
    rdfs:comment "The offer a decision extends. Absent for reminders without an offer, suppressions and holdouts."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range ckg:Offer ;
    rdfs:subPropertyOf ckg:groundedIn ;
    skos:closeMatch schema:object .

ckg:viaChannel a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "via channel"@en ;
    rdfs:comment "The channel a decision acts through. Absent for a suppression or a holdout."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range ckg:Channel ;
    rdfs:subPropertyOf ckg:groundedIn ;
    skos:closeMatch schema:instrument .

ckg:constrainedBy a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "constrained by"@en ;
    rdfs:comment "A guardrail that applied to the decision."@en ;
    rdfs:domain ckg:Decision ;
    rdfs:range ckg:Guardrail ;
    rdfs:subPropertyOf ckg:groundedIn .

ckg:contextType a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "context type"@en ;
    rdfs:comment "customer, business, decision or control: which of the four kinds of context the item is."@en ;
    rdfs:domain ckg:ContextItem ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:additionalType .

ckg:contextKey a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "context key"@en ;
    rdfs:comment "A short label for the fact."@en ;
    rdfs:domain ckg:ContextItem ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:name .

ckg:contextValue a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "context value"@en ;
    rdfs:comment "The fact itself."@en ;
    rdfs:domain ckg:ContextItem ;
    rdfs:range xsd:string ;
    skos:closeMatch schema:value .

ckg:informs a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "informs"@en ;
    rdfs:comment "The decision the item was read for."@en ;
    rdfs:domain ckg:ContextItem ;
    rdfs:range ckg:Decision .

ckg:ordered a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "ordered"@en ;
    rdfs:comment "1 when the customer ordered inside the measurement window, 0 otherwise."@en ;
    rdfs:domain ckg:Outcome ;
    rdfs:range xsd:integer .

ckg:revenueUsd a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "revenue (USD)"@en ;
    rdfs:comment "Revenue from the order, in whole US dollars."@en ;
    rdfs:domain ckg:Outcome ;
    rdfs:range xsd:integer ;
    skos:closeMatch schema:price .

ckg:marginUsd a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "margin (USD)"@en ;
    rdfs:comment "Gross margin on the order before discount and media costs."@en ;
    rdfs:domain ckg:Outcome ;
    rdfs:range xsd:integer .

ckg:mediaCostUsd a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "media cost (USD)"@en ;
    rdfs:comment "Paid-media cost attributed to the decision."@en ;
    rdfs:domain ckg:Outcome ;
    rdfs:range xsd:integer .

ckg:discountCostUsd a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "discount cost (USD)"@en ;
    rdfs:comment "Discount given on the order."@en ;
    rdfs:domain ckg:Outcome ;
    rdfs:range xsd:integer .

ckg:repeatVisit30d a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "repeat visit within 30 days"@en ;
    rdfs:comment "1 when the customer returned within 30 days of the order."@en ;
    rdfs:domain ckg:Outcome ;
    rdfs:range xsd:integer .

ckg:windowEnd a owl:DatatypeProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "window end"@en ;
    rdfs:comment "The last day of the measurement window."@en ;
    rdfs:domain ckg:Outcome ;
    rdfs:range xsd:date ;
    skos:closeMatch schema:endTime .

ckg:ofDecision a owl:ObjectProperty ;
    rdfs:isDefinedBy <http://demo.openlinksw.com/schemas/CustomerKG/> ;
    rdfs:label "of decision"@en ;
    rdfs:comment "The decision whose result this is."@en ;
    rdfs:domain ckg:Outcome ;
    rdfs:range ckg:Decision .
