{
  "@context": {
    "aeo": "https://prismdiscovery.ai/ontology/aeo#",
    "owl": "http://www.w3.org/2002/07/owl#",
    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "schema": "https://schema.org/",
    "prov": "http://www.w3.org/ns/prov#",
    "skos": "http://www.w3.org/2004/02/skos/core#",
    "dcterms": "http://purl.org/dc/terms/",
    "cc": "http://creativecommons.org/ns#",
    "label": {"@id": "rdfs:label", "@container": "@language"},
    "comment": {"@id": "rdfs:comment", "@container": "@language"}
  },
  "@graph": [
    {
      "@id": "https://prismdiscovery.ai/ontology/aeo",
      "@type": "owl:Ontology",
      "label": {"en": "AEO Ontology"},
      "owl:versionIRI": {"@id": "https://prismdiscovery.ai/ontology/aeo/1.0.0"},
      "owl:versionInfo": "1.0.0",
      "dcterms:title": {"@value": "Answer Engine Optimisation (AEO) Ontology", "@language": "en"},
      "dcterms:description": {"@value": "An OWL 2 DL ontology modelling the domain of Answer Engine Optimisation (AEO): brands, pages, prompts, AI engines, citations, mentions, visibility reports, opportunities, compliance checks, and optimisation scores. Extends schema.org for web resources, PROV-O for provenance of citations, and SKOS for compliance taxonomies.", "@language": "en"},
      "dcterms:creator": "SEO/AEO App Team",
      "dcterms:issued": {"@value": "2026-04-23", "@type": "xsd:date"},
      "dcterms:license": {"@id": "https://creativecommons.org/licenses/by/4.0/"},
      "cc:license": {"@id": "https://creativecommons.org/licenses/by/4.0/"},
      "owl:imports": [
        {"@id": "https://schema.org/version/latest/schemaorg-current-https.ttl"},
        {"@id": "http://www.w3.org/ns/prov-o"},
        {"@id": "http://www.w3.org/2004/02/skos/core"}
      ]
    },

    { "@id": "aeo:Brand", "@type": "owl:Class",
      "rdfs:subClassOf": {"@id": "schema:Organization"},
      "label": {"en": "Brand"},
      "comment": {"en": "A commercial, non-profit or personal brand tracked for answer-engine visibility. Extends schema:Organization with AEO-specific semantics (monitored prompts, AI visibility, citations)."} },

    { "@id": "aeo:Page", "@type": "owl:Class",
      "rdfs:subClassOf": {"@id": "schema:WebPage"},
      "label": {"en": "Page"},
      "comment": {"en": "A web page indexed, crawled, or evaluated by the AEO platform. Extends schema:WebPage with AEO-specific annotations such as optimisation scores and compliance checks."} },

    { "@id": "aeo:Query", "@type": "owl:Class",
      "rdfs:subClassOf": {"@id": "schema:SearchAction"},
      "label": {"en": "Query"},
      "comment": {"en": "A user-issued information-seeking expression directed at a search or answer engine. Specialisation of schema:SearchAction capturing both classical search queries and answer-engine prompts."} },

    { "@id": "aeo:Prompt", "@type": "owl:Class",
      "rdfs:subClassOf": {"@id": "aeo:Query"},
      "label": {"en": "Prompt"},
      "comment": {"en": "A natural-language input issued to a generative AI engine (e.g. ChatGPT, Gemini, Perplexity, Claude). A specialisation of aeo:Query focused on conversational or answer-engine interactions."} },

    { "@id": "aeo:AIEngine", "@type": "owl:Class",
      "rdfs:subClassOf": {"@id": "schema:SoftwareApplication"},
      "label": {"en": "AI Engine"},
      "comment": {"en": "A generative answer engine or large language model service that produces answers to prompts. Examples: ChatGPT, Gemini, Perplexity, Claude, Google AI Overview."} },

    { "@id": "aeo:Citation", "@type": "owl:Class",
      "rdfs:subClassOf": {"@id": "prov:Entity"},
      "label": {"en": "Citation"},
      "comment": {"en": "A reference in an AI engine's answer that links to, quotes from, or attributes information to a source (typically a web page). Modelled as a prov:Entity so that its derivation chain can be tracked."} },

    { "@id": "aeo:Mention", "@type": "owl:Class",
      "label": {"en": "Mention"},
      "comment": {"en": "An occurrence of a brand name or brand entity inside an AI engine's answer text, regardless of whether it is linked or cited."} },

    { "@id": "aeo:Competitor", "@type": "owl:Class",
      "rdfs:subClassOf": {"@id": "aeo:Brand"},
      "label": {"en": "Competitor"},
      "comment": {"en": "A brand identified as competing with the tracked brand for the same prompts, queries, or answer-engine share of voice. Every Competitor is a Brand."} },

    { "@id": "aeo:VisibilityReport", "@type": "owl:Class",
      "label": {"en": "Visibility Report"},
      "comment": {"en": "A periodic aggregation of a brand's AI visibility metrics across engines and prompts, including mention rate, citation rate, share of voice, and rank."} },

    { "@id": "aeo:Opportunity", "@type": "owl:Class",
      "label": {"en": "Opportunity"},
      "comment": {"en": "A detected actionable insight — for example an unranked keyword, a missing citation, or a declining mention trend — that represents a chance to improve visibility."} },

    { "@id": "aeo:AEOComplianceCheck", "@type": "owl:Class",
      "rdfs:subClassOf": {"@id": "skos:Concept"},
      "label": {"en": "AEO Compliance Check"},
      "comment": {"en": "A named rule or heuristic used to evaluate whether a page complies with AEO best practices (e.g. schema markup, Q&A structure, factual grounding). Modelled as a skos:Concept to allow hierarchical taxonomies of checks."} },

    { "@id": "aeo:OptimisationScore", "@type": "owl:Class",
      "label": {"en": "Optimisation Score"},
      "comment": {"en": "A numerical assessment of how well a page is optimised for answer engines, composed of weighted compliance check outcomes."} },

    { "@id": "aeo:cites", "@type": "owl:ObjectProperty",
      "label": {"en": "cites"},
      "comment": {"en": "Relates an AI engine answer (or aeo:Citation) to the source aeo:Page it references."},
      "rdfs:domain": {"@id": "aeo:Citation"}, "rdfs:range": {"@id": "aeo:Page"} },

    { "@id": "aeo:mentions", "@type": "owl:ObjectProperty",
      "label": {"en": "mentions"},
      "comment": {"en": "Relates an aeo:Mention instance to the aeo:Brand it names inside an AI answer."},
      "rdfs:domain": {"@id": "aeo:Mention"}, "rdfs:range": {"@id": "aeo:Brand"} },

    { "@id": "aeo:answersPrompt", "@type": "owl:ObjectProperty",
      "label": {"en": "answers prompt"},
      "comment": {"en": "Relates an aeo:Page that is intended (or observed) to answer a specific aeo:Prompt."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:Prompt"} },

    { "@id": "aeo:competesWith", "@type": ["owl:ObjectProperty", "owl:SymmetricProperty"],
      "label": {"en": "competes with"},
      "comment": {"en": "Symmetric relation declaring that two brands compete for the same prompts, queries, or topical share of voice."},
      "rdfs:domain": {"@id": "aeo:Brand"}, "rdfs:range": {"@id": "aeo:Brand"} },

    { "@id": "aeo:ranksFor", "@type": "owl:ObjectProperty",
      "label": {"en": "ranks for"},
      "comment": {"en": "Relates an aeo:Page to an aeo:Query for which the page holds (or held) a position in classical search results."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:Query"} },

    { "@id": "aeo:targetsQuery", "@type": "owl:ObjectProperty",
      "label": {"en": "targets query"},
      "comment": {"en": "Relates an aeo:Page to an aeo:Query it is deliberately optimised to rank for, independent of whether it currently ranks."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:Query"} },

    { "@id": "aeo:failsCheck", "@type": "owl:ObjectProperty",
      "label": {"en": "fails check"},
      "comment": {"en": "Relates an aeo:Page to an aeo:AEOComplianceCheck whose rule it does not satisfy."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:AEOComplianceCheck"} },

    { "@id": "aeo:passesCheck", "@type": "owl:ObjectProperty",
      "label": {"en": "passes check"},
      "comment": {"en": "Relates an aeo:Page to an aeo:AEOComplianceCheck whose rule it satisfies."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:AEOComplianceCheck"} },

    { "@id": "aeo:forBrand", "@type": "owl:ObjectProperty",
      "label": {"en": "for brand"},
      "comment": {"en": "Relates an aeo:VisibilityReport, aeo:Opportunity or aeo:OptimisationScore to the aeo:Brand it describes."},
      "rdfs:domain": {"@id": "aeo:VisibilityReport"}, "rdfs:range": {"@id": "aeo:Brand"} },

    { "@id": "aeo:coveringPeriod", "@type": "owl:ObjectProperty",
      "label": {"en": "covering period"},
      "comment": {"en": "Relates an aeo:VisibilityReport to the time interval (schema:DateTime range) it aggregates."},
      "rdfs:domain": {"@id": "aeo:VisibilityReport"}, "rdfs:range": {"@id": "schema:DateTime"} },

    { "@id": "aeo:sourceFor", "@type": "owl:ObjectProperty",
      "label": {"en": "source for"},
      "comment": {"en": "Relates an aeo:Page to an aeo:AIEngine answer for which the page was used as a source. Inverse direction of aeo:cites at the page level."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:AIEngine"} },

    { "@id": "aeo:citedInAnswer", "@type": "owl:ObjectProperty",
      "label": {"en": "cited in answer"},
      "comment": {"en": "Relates an aeo:Citation to the aeo:AIEngine whose generated answer contains it."},
      "rdfs:domain": {"@id": "aeo:Citation"}, "rdfs:range": {"@id": "aeo:AIEngine"} },

    { "@id": "aeo:partOfCluster", "@type": ["owl:ObjectProperty", "owl:TransitiveProperty"],
      "label": {"en": "part of cluster"},
      "comment": {"en": "Relates an aeo:Page (or aeo:Prompt) to a topical cluster represented by another aeo:Page (e.g. a pillar page). Transitive so clusters can nest."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:Page"} },

    { "@id": "aeo:linksTo", "@type": "owl:ObjectProperty",
      "label": {"en": "links to"},
      "comment": {"en": "Relates one aeo:Page to another via a hyperlink in its rendered HTML."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:Page"} },

    { "@id": "aeo:hasScore", "@type": ["owl:ObjectProperty", "owl:FunctionalProperty"],
      "label": {"en": "has score"},
      "comment": {"en": "Relates an aeo:Page to its current aeo:OptimisationScore. Functional — a page has at most one current score."},
      "rdfs:domain": {"@id": "aeo:Page"}, "rdfs:range": {"@id": "aeo:OptimisationScore"} },

    { "@id": "aeo:scoreValue", "@type": ["owl:DatatypeProperty", "owl:FunctionalProperty"],
      "label": {"en": "score value"},
      "comment": {"en": "The numeric value of an aeo:OptimisationScore, on a 0–100 scale."},
      "rdfs:domain": {"@id": "aeo:OptimisationScore"}, "rdfs:range": {"@id": "xsd:decimal"} },

    { "@id": "aeo:mentionCount", "@type": "owl:DatatypeProperty",
      "label": {"en": "mention count"},
      "comment": {"en": "Number of times a brand was mentioned inside an AI engine's answer during a report period."},
      "rdfs:domain": {"@id": "aeo:VisibilityReport"}, "rdfs:range": {"@id": "xsd:nonNegativeInteger"} },

    { "@id": "aeo:citationCount", "@type": "owl:DatatypeProperty",
      "label": {"en": "citation count"},
      "comment": {"en": "Number of citations to a brand's pages observed inside AI engine answers during a report period."},
      "rdfs:domain": {"@id": "aeo:VisibilityReport"}, "rdfs:range": {"@id": "xsd:nonNegativeInteger"} }
  ]
}
