From 680889dccdd0c39b282398209daeb3fc7804c182 Mon Sep 17 00:00:00 2001 From: Okiki Ojo Date: Mon, 22 Dec 2025 18:49:44 -0500 Subject: [PATCH] chore: add the ontology ttl files Signed-off-by: Okiki Ojo --- infra/qlever/data/narrative.ttl | 1250 +++++++++++++++++ infra/qlever/data/ttl/01-core-ontology.ttl | 404 ++++++ infra/qlever/data/ttl/02-person.ttl | 265 ++++ infra/qlever/data/ttl/03-organization.ttl | 358 +++++ infra/qlever/data/ttl/04-character.ttl | 353 +++++ infra/qlever/data/ttl/05-group-universe.ttl | 384 +++++ infra/qlever/data/ttl/06-story-structure.ttl | 1066 ++++++++++++++ .../data/ttl/07-product-manifestation.ttl | 886 ++++++++++++ infra/qlever/data/ttl/08-relationships.ttl | 689 +++++++++ .../data/ttl/09-discovery-recommendation.ttl | 473 +++++++ infra/qlever/data/ttl/10-rights-licensing.ttl | 464 ++++++ .../data/ttl/11-external-identifiers.ttl | 505 +++++++ infra/qlever/data/ttl/12-trading-cards.ttl | 256 ++++ infra/qlever/data/ttl/13-timestamps.ttl | 29 + infra/qlever/qlever.env | 5 +- 15 files changed, 7385 insertions(+), 2 deletions(-) create mode 100644 infra/qlever/data/narrative.ttl create mode 100644 infra/qlever/data/ttl/01-core-ontology.ttl create mode 100644 infra/qlever/data/ttl/02-person.ttl create mode 100644 infra/qlever/data/ttl/03-organization.ttl create mode 100644 infra/qlever/data/ttl/04-character.ttl create mode 100644 infra/qlever/data/ttl/05-group-universe.ttl create mode 100644 infra/qlever/data/ttl/06-story-structure.ttl create mode 100644 infra/qlever/data/ttl/07-product-manifestation.ttl create mode 100644 infra/qlever/data/ttl/08-relationships.ttl create mode 100644 infra/qlever/data/ttl/09-discovery-recommendation.ttl create mode 100644 infra/qlever/data/ttl/10-rights-licensing.ttl create mode 100644 infra/qlever/data/ttl/11-external-identifiers.ttl create mode 100644 infra/qlever/data/ttl/12-trading-cards.ttl create mode 100644 infra/qlever/data/ttl/13-timestamps.ttl diff --git a/infra/qlever/data/narrative.ttl b/infra/qlever/data/narrative.ttl new file mode 100644 index 0000000..5168181 --- /dev/null +++ b/infra/qlever/data/narrative.ttl @@ -0,0 +1,1250 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix dc: . +@prefix foaf: . +@prefix : . + +# Core Narrative Concepts (Schema/Ontology Prefixes) +@prefix narrative: . # Stories, plots, arcs, relationships +@prefix character: . # Characters, roles +@prefix creator: . # Writers, artists, studios, publishers +@prefix work: . # Comics, manga, anime, films, TV, novels +@prefix universe: . # Fictional worlds, settings +@prefix product: . # Physical/digital items, manifestations + +# Instance Data (Resource Prefixes) +@prefix data: . + +################################################################# +# Ontology header +################################################################# + +:Ontology a owl:Ontology ; + rdfs:label "Narrative Graph Ontology" ; + rdfs:comment "OWL ontology for people, organizations, narrative structure, universes, groups, and relationships with metadata." . + +################################################################# +# Core Classes +################################################################# + +:Person a owl:Class . +:Org a owl:Class . +:Role a owl:Class . +:StoryWork a owl:Class . +:StoryExpression a owl:Class . +:NarrativeUnit a owl:Class . +:Product a owl:Class . +:Manifestation a owl:Class . +:Item a owl:Class . +:Character a owl:Class . +:Franchise a owl:Class . +:Universe a owl:Class . +:Group a owl:Class . +:Relationship a owl:Class . + +################################################################# +# Role Hierarchy +################################################################# + +:Performer a owl:Class ; rdfs:subClassOf :Role . +:Actor a owl:Class ; rdfs:subClassOf :Performer . +:VoiceActor a owl:Class ; rdfs:subClassOf :Performer . +:Singer a owl:Class ; rdfs:subClassOf :Performer . +:Dancer a owl:Class ; rdfs:subClassOf :Performer . + +:Writer a owl:Class ; rdfs:subClassOf :Role . +:Screenwriter a owl:Class ; rdfs:subClassOf :Writer . +:Artist a owl:Class ; rdfs:subClassOf :Role . +:Penciller a owl:Class ; rdfs:subClassOf :Artist . +:Inker a owl:Class ; rdfs:subClassOf :Artist . +:Colorist a owl:Class ; rdfs:subClassOf :Artist . +:Letterer a owl:Class ; rdfs:subClassOf :Artist . + +:Director a owl:Class ; rdfs:subClassOf :Role . +:Producer a owl:Class ; rdfs:subClassOf :Role . + +################################################################# +# Role Subclass Properties +################################################################# + +### Writer-specific Properties +:writingStyle a owl:DatatypeProperty ; + rdfs:domain :Writer ; + rdfs:range xsd:string ; + rdfs:comment "Writing style or specialty" . + +:notableStories a owl:DatatypeProperty ; + rdfs:domain :Writer ; + rdfs:range xsd:string ; + rdfs:comment "Famous stories written" . + +### Artist-specific Properties +:artStyle a owl:DatatypeProperty ; + rdfs:domain :Artist ; + rdfs:range xsd:string ; + rdfs:comment "Art style or technique" . + +:primaryMedium a owl:DatatypeProperty ; + rdfs:domain :Artist ; + rdfs:range xsd:string ; + rdfs:comment "Traditional, Digital, Mixed Media, etc." . + +:influences a owl:DatatypeProperty ; + rdfs:domain :Artist ; + rdfs:range xsd:string ; + rdfs:comment "Artistic influences" . + +################################################################# +# Object Properties (structural with inverses) +################################################################# + +:worksFor a owl:ObjectProperty ; rdfs:domain :Person ; rdfs:range :Org ; owl:inverseOf :employs . +:employs a owl:ObjectProperty ; rdfs:domain :Org ; rdfs:range :Person . + +:memberOf a owl:ObjectProperty ; rdfs:domain :Person ; rdfs:range :Org ; owl:inverseOf :hasMember . +:hasMember a owl:ObjectProperty ; rdfs:domain :Org ; rdfs:range :Person . + +:hasExpression a owl:ObjectProperty ; rdfs:domain :StoryWork ; rdfs:range :StoryExpression . +:expressionOf a owl:ObjectProperty ; rdfs:domain :StoryExpression ; rdfs:range :StoryWork ; owl:inverseOf :hasExpression . + +:hasNarrativeUnit a owl:ObjectProperty ; rdfs:domain :StoryExpression ; rdfs:range :NarrativeUnit . +:narrativeUnitOf a owl:ObjectProperty ; rdfs:domain :NarrativeUnit ; rdfs:range :StoryExpression ; owl:inverseOf :hasNarrativeUnit . + +:hasProduct a owl:ObjectProperty ; rdfs:domain :NarrativeUnit ; rdfs:range :Product . +:productOf a owl:ObjectProperty ; rdfs:domain :Product ; rdfs:range :NarrativeUnit ; owl:inverseOf :hasProduct . + +:hasManifestation a owl:ObjectProperty ; rdfs:domain :Product ; rdfs:range :Manifestation . +:manifestationOf a owl:ObjectProperty ; rdfs:domain :Manifestation ; rdfs:range :Product ; owl:inverseOf :hasManifestation . + +:hasItem a owl:ObjectProperty ; rdfs:domain :Manifestation ; rdfs:range :Item . +:itemOf a owl:ObjectProperty ; rdfs:domain :Item ; rdfs:range :Manifestation ; owl:inverseOf :hasItem . + +:belongsToFranchise a owl:ObjectProperty ; rdfs:domain :Character ; rdfs:range :Franchise . +:existsInUniverse a owl:ObjectProperty ; rdfs:domain :Character ; rdfs:range :Universe . + +################################################################# +# Person Properties +################################################################# + +### Person Identity & Biography +:birthName a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Full legal birth name" . + +:knownAs a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Common name or professional name" . + +:alias a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Pen names, pseudonyms, stage names (repeatable)" . + +:birthDate a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:date ; + rdfs:comment "Date of birth" . + +:deathDate a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:date ; + rdfs:comment "Date of death (if deceased)" . + +:birthPlace a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "City, state/province, country of birth" . + +:nationality a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Country of citizenship" . + +:gender a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Gender identity" . + +### Person Contact & Social +:website a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:anyURI ; + rdfs:comment "Official website URL" . + +:socialMedia a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:anyURI ; + rdfs:comment "Social media profiles (Twitter, Instagram, etc.)" . + +:email a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Contact email" . + +### Person Professional +:activeYears a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Years active in industry (e.g., '1985-present')" . + +:activeFrom a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:int ; + rdfs:comment "Year started in industry" . + +:activeTo a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:int ; + rdfs:comment "Year ended/retired (if applicable)" . + +:primaryRole a owl:ObjectProperty ; + rdfs:domain :Person ; + rdfs:range :Role ; + rdfs:comment "Primary creative role (writer, artist, etc.)" . + +:biography a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Biographical summary" . + +:awards a owl:DatatypeProperty ; + rdfs:domain :Person ; + rdfs:range xsd:string ; + rdfs:comment "Awards and honors received" . + +################################################################# +# Org Properties +################################################################# + +### Org Identity +:legalName a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:string ; + rdfs:comment "Legal registered name of organization" . + +:shortName a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:string ; + rdfs:comment "Abbreviated name (e.g., 'DC' for 'DC Comics')" . + +:orgType a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:string ; + rdfs:comment "Publisher, Imprint, Studio, Convention, etc." . + +:parentCompany a owl:ObjectProperty ; + rdfs:domain :Org ; + rdfs:range :Org ; + rdfs:comment "Parent organization" . + +:subsidiary a owl:ObjectProperty ; + rdfs:domain :Org ; + rdfs:range :Org ; + owl:inverseOf :parentCompany ; + rdfs:comment "Subsidiary organizations" . + +### Org Timeline +:founded a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:date ; + rdfs:comment "Date organization was founded" . + +:dissolved a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:date ; + rdfs:comment "Date organization ceased operations" . + +:status a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:string ; + rdfs:comment "Active, Defunct, Acquired, Merged, etc." . + +### Org Location & Contact +:headquarters a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:string ; + rdfs:comment "Location of headquarters" . + +:country a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:string ; + rdfs:comment "Country of operation" . + +### Org Business +:industry a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:string ; + rdfs:comment "Comics, Animation, Film, Gaming, etc." . + +:revenue a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:decimal ; + rdfs:comment "Annual revenue" . + +:employeeCount a owl:DatatypeProperty ; + rdfs:domain :Org ; + rdfs:range xsd:int ; + rdfs:comment "Number of employees" . + +################################################################# +# StoryWork Properties +################################################################# + +### StoryWork Identity +:seriesName a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Name of the series" . + +:sortName a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Name for alphabetical sorting (without 'The', etc.)" . + +:volume a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Volume number (for series with multiple volumes)" . + +### StoryWork Timeline +:yearBegan a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Year series started" . + +:yearEnded a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Year series ended (if concluded)" . + +:publicationStatus a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Ongoing, Completed, Cancelled, Hiatus" . + +:issueCount a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Total number of issues published" . + +### StoryWork Classification +:seriesType a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Ongoing Series, Limited Series, Mini-Series, One-Shot, etc." . + +:genre a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Superhero, Horror, Crime, Sci-Fi, Fantasy, etc. (repeatable)" . + +:ageRating a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "All Ages, Teen, Mature Readers, etc." . + +:publishedBy a owl:ObjectProperty ; + rdfs:domain :StoryWork ; + rdfs:range :Org ; + rdfs:comment "Publisher of the series" . + +:imprint a owl:ObjectProperty ; + rdfs:domain :StoryWork ; + rdfs:range :Org ; + rdfs:comment "Imprint line (Vertigo, MAX, Black Label, etc.)" . + +### StoryWork Description +:synopsis a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Series description/premise" . + +:continuity a owl:DatatypeProperty ; + rdfs:domain :StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Continuity designation (Earth-616, New 52, etc.)" . + +################################################################# +# StoryExpression Properties +################################################################# + +### StoryExpression Identity +:issueNumber a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Issue number (can be string for special issues like '0', 'Annual')" . + +:issueTitle a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Title of this specific issue" . + +:coverImage a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:anyURI ; + rdfs:comment "URL to cover image" . + +:subtitle a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Issue subtitle or chapter title" . + +:altNumber a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Alternate numbering (legacy numbering, etc.)" . + +### StoryExpression Dates +:coverDate a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:date ; + rdfs:comment "Cover date (month/year on cover)" . + +:storeDate a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:date ; + rdfs:comment "Actual release date to stores" . + +:digitalReleaseDate a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:date ; + rdfs:comment "Digital release date (often different from print)" . + +### StoryExpression Content +:pageCount a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:int ; + rdfs:comment "Number of pages" . + +:storyPageCount a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:int ; + rdfs:comment "Story pages (excluding ads)" . + +:description a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Issue description/solicitation text" . + +:hasBackupStory a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether issue contains backup/second story" . + +### StoryExpression Identifiers +:sku a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Diamond SKU or order code" . + +:isbn a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "ISBN (for collected editions)" . + +:upc a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "UPC barcode" . + +:comicVineId a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "ComicVine ID" . + +:gcdId a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Grand Comics Database ID" . + +### StoryExpression Features +:isKeyIssue a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether considered a key/significant issue" . + +:firstAppearance a owl:ObjectProperty ; + rdfs:domain :StoryExpression ; + rdfs:range :Character ; + rdfs:comment "Characters making first appearance" . + +:significantEvent a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Major story events (death of X, origin story, etc.)" . + +:crossover a owl:DatatypeProperty ; + rdfs:domain :StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Name of crossover event (if applicable)" . + +################################################################# +# Character Properties +################################################################# + +### Character Identity +:characterName a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Primary character name" . + +:realName a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Secret identity/civilian name" . + +:aliases a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Alternate identities, codenames, nicknames" . + +:characterType a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Hero, Villain, Anti-Hero, Supporting, Civilian, etc." . + +:status a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Active, Deceased, Retired, Unknown, etc." . + +### Character Attributes +:species a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Human, Mutant, Alien, God, Robot, etc." . + +:gender a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Gender identity" . + +:height a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Character height" . + +:weight a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Character weight" . + +:eyeColor a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Eye color" . + +:hairColor a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Hair color" . + +### Character Powers & Abilities +:powers a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Superpowers and special abilities" . + +:abilities a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Skills, training, expertise" . + +:powerLevel a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Street Level, City Level, Global, Cosmic, etc." . + +:weapons a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Signature weapons and equipment" . + +### Character Background +:origin a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Origin story summary" . + +:occupation a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Job/profession" . + +:baseOfOperations a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Home city or base location" . + +:placeOfBirth a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Where character was born" . + +### Character Relationships +:affiliation a owl:ObjectProperty ; + rdfs:domain :Character ; + rdfs:range :Group ; + rdfs:comment "Team memberships" . + +:enemies a owl:ObjectProperty ; + rdfs:domain :Character ; + rdfs:range :Character ; + rdfs:comment "Arch-enemies and rivals" . + +:allies a owl:ObjectProperty ; + rdfs:domain :Character ; + rdfs:range :Character ; + rdfs:comment "Friends and allies" . + +### Character Meta +:firstAppearanceIn a owl:ObjectProperty ; + rdfs:domain :Character ; + rdfs:range :StoryExpression ; + rdfs:comment "Issue of first appearance" . + +:bio a owl:DatatypeProperty ; + rdfs:domain :Character ; + rdfs:range xsd:string ; + rdfs:comment "Character biography" . + +################################################################# +# Manifestation Properties +################################################################# + +### Manifestation Identity +:format a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Single Issue, Trade Paperback, Hardcover, Omnibus, Digital, etc." . + +:edition a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "First Edition, Second Printing, Deluxe Edition, etc." . + +:printRun a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:int ; + rdfs:comment "Number of copies printed" . + +:binding a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Saddle-Stitched, Perfect Bound, Hardcover, etc." . + +### Manifestation Physical +:trim a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Physical dimensions (6.625 x 10.25 inches, etc.)" . + +:paperStock a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Paper type and quality" . + +:coverStock a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Cover material and finish" . + +:printingProcess a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Offset, Digital, Letterpress, etc." . + +### Manifestation Dates +:printDate a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:date ; + rdfs:comment "Date this printing was produced" . + +:reprinted a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether this is a reprint" . + +:reprintOf a owl:ObjectProperty ; + rdfs:domain :Manifestation ; + rdfs:range :Manifestation ; + rdfs:comment "Original manifestation being reprinted" . + +### Manifestation Features +:variant a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Variant type (Cover A/B, Retailer Incentive, Ratio 1:25, etc.)" . + +:coverArtist a owl:ObjectProperty ; + rdfs:domain :Manifestation ; + rdfs:range :Person ; + rdfs:comment "Artist who created the cover" . + +:specialFeatures a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Sketch pages, interviews, extras included" . + +### Manifestation Distribution +:distributor a owl:ObjectProperty ; + rdfs:domain :Manifestation ; + rdfs:range :Org ; + rdfs:comment "Distribution company (Diamond, Lunar, etc.)" . + +:restricted a owl:DatatypeProperty ; + rdfs:domain :Manifestation ; + rdfs:range xsd:boolean ; + rdfs:comment "Convention exclusive, limited distribution, etc." . + +################################################################# +# Product Properties +################################################################# + +### Product Identity +:productLine a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:string ; + rdfs:comment "Single Issues, Collected Editions, Archives, Essentials, etc." . + +:collectionTitle a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:string ; + rdfs:comment "Title of collected edition" . + +:collectionType a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:string ; + rdfs:comment "Trade Paperback, Hardcover, Omnibus, Absolute, Epic Collection, etc." . + +:volumeNumber a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:int ; + rdfs:comment "Volume number in series of collections" . + +### Product Contents +:collects a owl:ObjectProperty ; + rdfs:domain :Product ; + rdfs:range :StoryExpression ; + rdfs:comment "Issues collected in this product" . + +:collectsRange a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:string ; + rdfs:comment "Human-readable range (e.g., 'Issues #1-6')" . + +:includesExtras a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:boolean ; + rdfs:comment "Contains bonus material beyond collected issues" . + +:bonusMaterial a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:string ; + rdfs:comment "Description of extras (sketch pages, scripts, etc.)" . + +### Product Commercial +:originalPrice a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:decimal ; + rdfs:comment "Original retail price at launch" . + +:currentPrice a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:decimal ; + rdfs:comment "Current market price" . + +:inPrint a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether currently available for purchase" . + +### Product Meta +:productISBN a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:string ; + rdfs:comment "ISBN for this product" . + +:releaseDate a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:date ; + rdfs:comment "Product release date" . + +:productDescription a owl:DatatypeProperty ; + rdfs:domain :Product ; + rdfs:range xsd:string ; + rdfs:comment "Marketing description" . + +################################################################# +# NarrativeUnit Properties +################################################################# + +### NarrativeUnit Identity +:arcName a owl:DatatypeProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range xsd:string ; + rdfs:comment "Name of story arc" . + +:arcType a owl:DatatypeProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range xsd:string ; + rdfs:comment "Arc, Saga, Event, Crossover, etc." . + +:partNumber a owl:DatatypeProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range xsd:int ; + rdfs:comment "Part number within larger story" . + +:totalParts a owl:DatatypeProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range xsd:int ; + rdfs:comment "Total parts in complete arc" . + +### NarrativeUnit Content +:arcSummary a owl:DatatypeProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range xsd:string ; + rdfs:comment "Summary of story arc" . + +:spans a owl:ObjectProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range :StoryExpression ; + rdfs:comment "Issues that comprise this arc" . + +:featuredCharacters a owl:ObjectProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range :Character ; + rdfs:comment "Main characters in this arc" . + +### NarrativeUnit Context +:partOfEvent a owl:ObjectProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range :NarrativeUnit ; + rdfs:comment "Larger event this arc is part of" . + +:followedBy a owl:ObjectProperty ; + rdfs:domain :NarrativeUnit ; + rdfs:range :NarrativeUnit ; + rdfs:comment "Next arc in sequence" . + +################################################################# +# Universe Properties +################################################################# + +### Universe Identity +:universeName a owl:DatatypeProperty ; + rdfs:domain :Universe ; + rdfs:range xsd:string ; + rdfs:comment "Name of fictional universe" . + +:designation a owl:DatatypeProperty ; + rdfs:domain :Universe ; + rdfs:range xsd:string ; + rdfs:comment "Official designation (Earth-616, Prime Earth, etc.)" . + +:universeType a owl:DatatypeProperty ; + rdfs:domain :Universe ; + rdfs:range xsd:string ; + rdfs:comment "Main Continuity, Alternate, Elseworlds, What If, etc." . + +:canon a owl:DatatypeProperty ; + rdfs:domain :Universe ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether considered main canon" . + +### Universe Description +:universeDescription a owl:DatatypeProperty ; + rdfs:domain :Universe ; + rdfs:range xsd:string ; + rdfs:comment "Description of universe characteristics" . + +:keyDifferences a owl:DatatypeProperty ; + rdfs:domain :Universe ; + rdfs:range xsd:string ; + rdfs:comment "How this universe differs from main continuity" . + +### Universe Meta +:introducedIn a owl:ObjectProperty ; + rdfs:domain :Universe ; + rdfs:range :StoryExpression ; + rdfs:comment "Issue where universe first appeared" . + +:status a owl:DatatypeProperty ; + rdfs:domain :Universe ; + rdfs:range xsd:string ; + rdfs:comment "Active, Destroyed, Merged, Rebooted, etc." . + +:relatedUniverse a owl:ObjectProperty ; + rdfs:domain :Universe ; + rdfs:range :Universe ; + rdfs:comment "Parallel or related universes" . + +:partOfMultiverse a owl:ObjectProperty ; + rdfs:domain :Universe ; + rdfs:range :Universe ; + rdfs:comment "Larger multiverse this is part of" . + +################################################################# +# Group Properties +################################################################# + +### Group Identity +:groupName a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "Official name of team/organization" . + +:formerNames a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "Previous names" . + +:groupType a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "Hero Team, Villain Organization, Government Agency, etc." . + +:alignment a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "Good, Evil, Neutral, etc." . + +### Group Timeline +:formed a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "When group was founded (in-universe)" . + +:disbanded a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "When group disbanded (if applicable)" . + +:groupStatus a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "Active, Disbanded, Reformed, etc." . + +### Group Details +:purpose a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "Mission or purpose of group" . + +:headquarters a owl:DatatypeProperty ; + rdfs:domain :Group ; + rdfs:range xsd:string ; + rdfs:comment "Base of operations" . + +:leader a owl:ObjectProperty ; + rdfs:domain :Group ; + rdfs:range :Character ; + rdfs:comment "Current or historical leader" . + +:members a owl:ObjectProperty ; + rdfs:domain :Group ; + rdfs:range :Character ; + rdfs:comment "Members of the group" . + +:allies a owl:ObjectProperty ; + rdfs:domain :Group ; + rdfs:range :Group ; + rdfs:comment "Allied groups" . + +:enemies a owl:ObjectProperty ; + rdfs:domain :Group ; + rdfs:range :Group ; + rdfs:comment "Enemy groups" . + +################################################################# +# Franchise Properties +################################################################# + +### Franchise Identity +:franchiseName a owl:DatatypeProperty ; + rdfs:domain :Franchise ; + rdfs:range xsd:string ; + rdfs:comment "Name of franchise" . + +:franchiseType a owl:DatatypeProperty ; + rdfs:domain :Franchise ; + rdfs:range xsd:string ; + rdfs:comment "Comics, Film, TV, Gaming, Multimedia, etc." . + +:parentFranchise a owl:ObjectProperty ; + rdfs:domain :Franchise ; + rdfs:range :Franchise ; + rdfs:comment "Larger franchise this is part of (e.g., Batman → DC Comics)" . + +### Franchise Timeline +:launched a owl:DatatypeProperty ; + rdfs:domain :Franchise ; + rdfs:range xsd:int ; + rdfs:comment "Year franchise began" . + +:franchiseStatus a owl:DatatypeProperty ; + rdfs:domain :Franchise ; + rdfs:range xsd:string ; + rdfs:comment "Active, Dormant, Concluded, Rebooted, etc." . + +### Franchise Business +:owner a owl:ObjectProperty ; + rdfs:domain :Franchise ; + rdfs:range :Org ; + rdfs:comment "Company that owns franchise rights" . + +:licensedTo a owl:ObjectProperty ; + rdfs:domain :Franchise ; + rdfs:range :Org ; + rdfs:comment "Companies with licensing rights" . + +### Franchise Meta +:franchiseDescription a owl:DatatypeProperty ; + rdfs:domain :Franchise ; + rdfs:range xsd:string ; + rdfs:comment "Description of franchise" . + +:relatedFranchise a owl:ObjectProperty ; + rdfs:domain :Franchise ; + rdfs:range :Franchise ; + rdfs:comment "Related or spin-off franchises" . + +:primaryUniverse a owl:ObjectProperty ; + rdfs:domain :Franchise ; + rdfs:range :Universe ; + rdfs:comment "Main universe for franchise" . + +################################################################# +# Reified Relationships +################################################################# + +### WorkedWith +:WorkedWithRelationship a owl:Class ; rdfs:subClassOf :Relationship . +:hasWorkedWithRelationship a owl:ObjectProperty ; rdfs:domain :Person ; rdfs:range :WorkedWithRelationship . +:involvesPerson a owl:ObjectProperty ; rdfs:domain :WorkedWithRelationship ; rdfs:range :Person . +:projectCount a owl:DatatypeProperty ; rdfs:domain :WorkedWithRelationship ; rdfs:range xsd:int . +:collabStart a owl:DatatypeProperty ; rdfs:domain :WorkedWithRelationship ; rdfs:range xsd:date . +:collabEnd a owl:DatatypeProperty ; rdfs:domain :WorkedWithRelationship ; rdfs:range xsd:date . +:relationshipNotes a owl:DatatypeProperty ; rdfs:domain :WorkedWithRelationship ; rdfs:range xsd:string . + +### Credit +:CreditRelationship a owl:Class ; rdfs:subClassOf :Relationship . +:hasCreditRelationship a owl:ObjectProperty ; rdfs:domain :Person ; rdfs:range :CreditRelationship . +:creditsExpression a owl:ObjectProperty ; rdfs:domain :CreditRelationship ; rdfs:range :StoryExpression . +:creditRole a owl:ObjectProperty ; rdfs:domain :CreditRelationship ; rdfs:range :Role . +:creditedName a owl:DatatypeProperty ; rdfs:domain :CreditRelationship ; rdfs:range xsd:string . +:creditType a owl:DatatypeProperty ; rdfs:domain :CreditRelationship ; rdfs:range xsd:string . +:billingOrder a owl:DatatypeProperty ; rdfs:domain :CreditRelationship ; rdfs:range xsd:int . + +### Portrayal +:PortrayalRelationship a owl:Class ; rdfs:subClassOf :Relationship . +:hasPortrayalRelationship a owl:ObjectProperty ; rdfs:domain :Person ; rdfs:range :PortrayalRelationship . +:portraysCharacter a owl:ObjectProperty ; rdfs:domain :PortrayalRelationship ; rdfs:range :Character . +:portrayalMedium a owl:DatatypeProperty ; rdfs:domain :PortrayalRelationship ; rdfs:range xsd:string . +:portrayalStart a owl:DatatypeProperty ; rdfs:domain :PortrayalRelationship ; rdfs:range xsd:date . +:portrayalEnd a owl:DatatypeProperty ; rdfs:domain :PortrayalRelationship ; rdfs:range xsd:date . +:billing a owl:DatatypeProperty ; rdfs:domain :PortrayalRelationship ; rdfs:range xsd:string . + +### Character ↔ Character +:CharacterRelationship a owl:Class ; rdfs:subClassOf :Relationship . +:hasCharacterRelationship a owl:ObjectProperty ; rdfs:domain :Character ; rdfs:range :CharacterRelationship . +:involvesCharacter a owl:ObjectProperty ; rdfs:domain :CharacterRelationship ; rdfs:range :Character . +:relationshipType a owl:DatatypeProperty ; rdfs:domain :CharacterRelationship ; rdfs:range xsd:string . +:relationshipStatus a owl:DatatypeProperty ; rdfs:domain :CharacterRelationship ; rdfs:range xsd:string . +:relationshipStart a owl:DatatypeProperty ; rdfs:domain :CharacterRelationship ; rdfs:range xsd:date . +:relationshipEnd a owl:DatatypeProperty ; rdfs:domain :CharacterRelationship ; rdfs:range xsd:date . +:relationshipNotes a owl:DatatypeProperty ; rdfs:domain :CharacterRelationship ; rdfs:range xsd:string . + +################################################################# +# Character Relationship Subclasses (Retained Only) +################################################################# + +:FamilyRelationship a owl:Class ; rdfs:subClassOf :CharacterRelationship . +:FriendshipRelationship a owl:Class ; rdfs:subClassOf :CharacterRelationship . +:AllianceRelationship a owl:Class ; rdfs:subClassOf :CharacterRelationship . +:RivalryRelationship a owl:Class ; rdfs:subClassOf :CharacterRelationship . +:SupernaturalRelationship a owl:Class ; rdfs:subClassOf :CharacterRelationship . + +# Examples +:ParentChild a owl:Class ; rdfs:subClassOf :FamilyRelationship . +:Rivals a owl:Class ; rdfs:subClassOf :RivalryRelationship . +:AlternateSelf a owl:Class ; rdfs:subClassOf :SupernaturalRelationship . +:PoliticalAllies a owl:Class ; rdfs:subClassOf :AllianceRelationship . + +################################################################# +# Relationship Subclass Properties +################################################################# + +### CreditRelationship-specific Properties +:contractType a owl:DatatypeProperty ; + rdfs:domain :CreditRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Work-for-hire, Creator-owned, etc." . + +:uncredited a owl:DatatypeProperty ; + rdfs:domain :CreditRelationship ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether contribution was uncredited" . + +### PortrayalRelationship-specific Properties +:castingType a owl:DatatypeProperty ; + rdfs:domain :PortrayalRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Lead, Supporting, Cameo, Voice-only, etc." . + +:awardNominations a owl:DatatypeProperty ; + rdfs:domain :PortrayalRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Awards won or nominated for this role" . + +### FamilyRelationship-specific Properties +:biologicalRelation a owl:DatatypeProperty ; + rdfs:domain :FamilyRelationship ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether biological or adoptive/found family" . + +:familyRole a owl:DatatypeProperty ; + rdfs:domain :FamilyRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Parent, Child, Sibling, Spouse, etc." . + +### RivalryRelationship-specific Properties +:rivalryIntensity a owl:DatatypeProperty ; + rdfs:domain :RivalryRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Friendly Competition, Arch-enemies, Mortal Enemies, etc." . + +:causedBy a owl:DatatypeProperty ; + rdfs:domain :RivalryRelationship ; + rdfs:range xsd:string ; + rdfs:comment "What caused the rivalry" . + +################################################################# +# Item Properties (Collection Management) +################################################################# + +### Ownership & Identity +:owner a owl:ObjectProperty ; + rdfs:domain :Item ; + rdfs:range [ owl:unionOf (:Person :Org) ] ; + rdfs:comment "Owner of this specific copy (person or organization)" . + +:barcode a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "Library barcode or collection tracking number" . + +### Condition & Grading +:condition a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "Condition description (CGC scale: Poor, Good, Fine, VF, NM, Mint)" . + +:cgcGraded a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether item is professionally graded by CGC/CBCS" . + +:cgcGrade a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Numeric grade (0.5 to 10.0) if CGC graded" . + +:certificationNumber a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "CGC/CBCS certification number" . + +### Signatures & Provenance +:signed a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether the item is signed" . + +:signedBy a owl:ObjectProperty ; + rdfs:domain :Item ; + rdfs:range :Person ; + rdfs:comment "Person(s) who signed this copy" . + +:signatureLocation a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "Where signature appears (cover, interior, etc.)" . + +:authenticated a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether signature is authenticated" . + +### Acquisition & Valuation +:acquisitionDate a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:date ; + rdfs:comment "Date item was acquired" . + +:acquisitionPrice a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Purchase price when acquired" . + +:currentValue a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Current estimated market value of this specific copy" . + +:currentMarketPrice a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Current market price for this condition/grade" . + +:msrp a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Manufacturer's Suggested Retail Price (original cover price)" . + +:valuationDate a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:date ; + rdfs:comment "Date of most recent valuation" . + +### Location & Storage +:location a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "Physical location (shelf, box, row, etc.)" . + +:storageType a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "How stored (long box, short box, bag+board, slab, etc.)" . + +### Library/Circulation Properties +:circulationStatus a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "Available, Checked Out, Reference Only, Lost, Damaged, etc." . + +:checkedOutTo a owl:ObjectProperty ; + rdfs:domain :Item ; + rdfs:range :Person ; + rdfs:comment "Person who currently has item checked out" . + +:dueDate a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:date ; + rdfs:comment "Due date for return if checked out" . + +### Notes & Defects +:itemNotes a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "Free-form notes about this specific copy" . + +:defects a owl:DatatypeProperty ; + rdfs:domain :Item ; + rdfs:range xsd:string ; + rdfs:comment "Specific defects (spine stress, corner crease, water damage, etc.)" . \ No newline at end of file diff --git a/infra/qlever/data/ttl/01-core-ontology.ttl b/infra/qlever/data/ttl/01-core-ontology.ttl new file mode 100644 index 0000000..35c1892 --- /dev/null +++ b/infra/qlever/data/ttl/01-core-ontology.ttl @@ -0,0 +1,404 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix dc: . +@prefix foaf: . +@prefix : . + +# Core Narrative Concepts (Schema/Ontology Prefixes) +@prefix narrative: . +@prefix character: . +@prefix creator: . +@prefix work: . +@prefix universe: . +@prefix product: . + +# Instance Data (Resource Prefixes) +@prefix data: . + +################################################################# +# Ontology Header +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Narrative Graph Ontology" ; + dc:description """ + Core ontology for PopModern platform spanning comics, manga, anime, films, TV, + novels, games, and music. Supports discovery, recommendations, collection management, + creator analytics, publisher insights, and retail operations. + + Architecture: + - Neptune: Catalog data, relationships, metadata (this ontology) + - Supabase: Transactional data, real-time events, analytics + + Version: 1.0 + Date: 2025-11-30 + """ ; + dc:creator "PopModern" ; + owl:versionInfo "1.0" . + +################################################################# +# Core Entity Classes +################################################################# + +narrative:Person a owl:Class ; + rdfs:label "Person" ; + rdfs:comment "Real person - creator, performer, or industry professional" . + +narrative:Org a owl:Class ; + rdfs:label "Organization" ; + rdfs:comment "Company, publisher, studio, distributor, or retail establishment" . + +narrative:Character a owl:Class ; + rdfs:label "Character" ; + rdfs:comment "Fictional character appearing in narrative works across any medium" . + +narrative:Franchise a owl:Class ; + rdfs:label "Franchise" ; + rdfs:comment "Media franchise spanning multiple works and mediums" . + +narrative:Universe a owl:Class ; + rdfs:label "Universe" ; + rdfs:comment "Fictional universe or continuity (e.g., Earth-616, MCU, One Piece World)" . + +narrative:Group a owl:Class ; + rdfs:label "Group" ; + rdfs:comment "Team, organization, or collective of characters within fictional universe" . + +################################################################# +# Story Structure Classes +################################################################# + +narrative:StoryWork a owl:Class ; + rdfs:label "Story Work" ; + rdfs:comment "Abstract story work - the conceptual series/title (e.g., 'Amazing Spider-Man')" . + +narrative:StoryExpression a owl:Class ; + rdfs:label "Story Expression" ; + rdfs:comment "Specific realization of a work - individual issue, episode, chapter" . + +narrative:NarrativeUnit a owl:Class ; + rdfs:label "Narrative Unit" ; + rdfs:comment "Atomic narrative unit - single issue, episode, chapter, or track" . + +narrative:Arc a owl:Class ; + rdfs:label "Story Arc" ; + rdfs:comment "Multi-issue story arc spanning multiple narrative units" . + +narrative:Event a owl:Class ; + rdfs:label "Event" ; + rdfs:comment "Crossover event spanning multiple series" . + +narrative:Season a owl:Class ; + rdfs:label "Season" ; + rdfs:comment "Season of TV series, anime, or podcast" . + +narrative:Series a owl:Class ; + rdfs:label "Series" ; + rdfs:comment "Ongoing series containing multiple seasons" . + +narrative:Collection a owl:Class ; + rdfs:label "Collection" ; + rdfs:comment "Curated collection (trade paperback, box set, anthology)" . + +narrative:Page a owl:Class ; + rdfs:label "Page" ; + rdfs:comment "Individual page within a narrative unit (for page-level tracking)" . + +################################################################# +# Product Classes +################################################################# + +narrative:Product a owl:Class ; + rdfs:label "Product" ; + rdfs:comment "Abstract product - the conceptual edition (hardcover vs paperback)" . + +narrative:Manifestation a owl:Class ; + rdfs:label "Manifestation" ; + rdfs:comment "Physical/digital manifestation - specific printing, release, variant" . + +narrative:Item a owl:Class ; + rdfs:label "Item" ; + rdfs:comment "Individual copy - specific physical or digital instance owned by someone" . + +################################################################# +# Role Hierarchy +################################################################# + +narrative:Role a owl:Class ; + rdfs:label "Role" ; + rdfs:comment "Creative or professional role in content production" . + +# Performance Roles +narrative:Performer a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Performer" . + +narrative:Actor a owl:Class ; + rdfs:subClassOf narrative:Performer ; + rdfs:label "Actor" . + +narrative:VoiceActor a owl:Class ; + rdfs:subClassOf narrative:Performer ; + rdfs:label "Voice Actor" . + +narrative:Singer a owl:Class ; + rdfs:subClassOf narrative:Performer ; + rdfs:label "Singer" . + +narrative:Dancer a owl:Class ; + rdfs:subClassOf narrative:Performer ; + rdfs:label "Dancer" . + +narrative:Musician a owl:Class ; + rdfs:subClassOf narrative:Performer ; + rdfs:label "Musician" . + +# Writing Roles +narrative:Writer a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Writer" . + +narrative:Screenwriter a owl:Class ; + rdfs:subClassOf narrative:Writer ; + rdfs:label "Screenwriter" . + +narrative:Novelist a owl:Class ; + rdfs:subClassOf narrative:Writer ; + rdfs:label "Novelist" . + +narrative:Playwright a owl:Class ; + rdfs:subClassOf narrative:Writer ; + rdfs:label "Playwright" . + +# Visual Art Roles +narrative:Artist a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Artist" . + +narrative:Penciller a owl:Class ; + rdfs:subClassOf narrative:Artist ; + rdfs:label "Penciller" . + +narrative:Inker a owl:Class ; + rdfs:subClassOf narrative:Artist ; + rdfs:label "Inker" . + +narrative:Colorist a owl:Class ; + rdfs:subClassOf narrative:Artist ; + rdfs:label "Colorist" . + +narrative:Letterer a owl:Class ; + rdfs:subClassOf narrative:Artist ; + rdfs:label "Letterer" . + +narrative:CoverArtist a owl:Class ; + rdfs:subClassOf narrative:Artist ; + rdfs:label "Cover Artist" . + +narrative:ConceptArtist a owl:Class ; + rdfs:subClassOf narrative:Artist ; + rdfs:label "Concept Artist" . + +narrative:CharacterDesigner a owl:Class ; + rdfs:subClassOf narrative:Artist ; + rdfs:label "Character Designer" . + +narrative:Animator a owl:Class ; + rdfs:subClassOf narrative:Artist ; + rdfs:label "Animator" . + +# Production Roles +narrative:Director a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Director" . + +narrative:Producer a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Producer" . + +narrative:Editor a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Editor" . + +narrative:Compositor a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Compositor" ; + rdfs:comment "Music composer" . + +narrative:SoundDesigner a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Sound Designer" . + +narrative:Cinematographer a owl:Class ; + rdfs:subClassOf narrative:Role ; + rdfs:label "Cinematographer" . + +################################################################# +# Base Relationship Class +################################################################# + +narrative:Relationship a owl:Class ; + rdfs:label "Relationship" ; + rdfs:comment "Base class for all reified relationships with metadata" . + +################################################################# +# Extended Role hierarchy for music, games, streaming, esports +################################################################# + +### Music & audio roles ######################################################### + +narrative:Composer + a owl:Class ; + rdfs:label "Composer" ; + rdfs:comment """ + A Role representing someone who composes music (scores, themes, songs) + for works such as films, series, games, albums, or soundtracks. + """ ; + rdfs:subClassOf narrative:Role +. + +narrative:Lyricist + a owl:Class ; + rdfs:label "Lyricist" ; + rdfs:comment "A Role representing someone who writes song lyrics." ; + rdfs:subClassOf narrative:Role +. + +narrative:Arranger + a owl:Class ; + rdfs:label "Arranger" ; + rdfs:comment "A Role representing someone who arranges existing musical material." ; + rdfs:subClassOf narrative:Role +. + +narrative:MusicProducer + a owl:Class ; + rdfs:label "Music Producer" ; + rdfs:comment """ + A Role representing a music producer responsible for the overall sound, + recording process, and production of music works. + """ ; + rdfs:subClassOf narrative:Role +. + +narrative:Performer + a owl:Class ; + rdfs:label "Performer" ; + rdfs:comment """ + A Role for someone who performs music or audio content: + instrumentalist, vocalist, band member, solo artist, etc. + """ ; + rdfs:subClassOf narrative:Role +. + +narrative:Vocalist + a owl:Class ; + rdfs:label "Vocalist" ; + rdfs:comment "A Performer who primarily contributes vocals." ; + rdfs:subClassOf narrative:Performer +. + +narrative:BandMember + a owl:Class ; + rdfs:label "Band Member" ; + rdfs:comment "A Performer who is a member of a musical group or band." ; + rdfs:subClassOf narrative:Performer +. + +### Game / interactive media roles ############################################# + +narrative:GameDesigner + a owl:Class ; + rdfs:label "Game Designer" ; + rdfs:comment """ + A Role representing someone who designs game systems, mechanics, + levels, rules, and overall player experience. + """ ; + rdfs:subClassOf narrative:Role +. + +narrative:LevelDesigner + a owl:Class ; + rdfs:label "Level Designer" ; + rdfs:comment "A Role representing someone who designs levels, maps, or stages in a game." ; + rdfs:subClassOf narrative:GameDesigner +. + +narrative:GameProgrammer + a owl:Class ; + rdfs:label "Game Programmer" ; + rdfs:comment "A Role representing someone who implements game systems, tools, or engine code." ; + rdfs:subClassOf narrative:Role +. + +narrative:GameDirector + a owl:Class ; + rdfs:label "Game Director" ; + rdfs:comment "A Role representing someone who directs the overall creative vision for a game." ; + rdfs:subClassOf narrative:Role +. + +narrative:VoiceActor + a owl:Class ; + rdfs:label "Voice Actor" ; + rdfs:comment """ + A Role for someone who provides voice performances for characters + in games, animation, or other media. + """ ; + rdfs:subClassOf narrative:Role +. + +narrative:LocalizationWriter + a owl:Class ; + rdfs:label "Localization Writer" ; + rdfs:comment """ + A Role representing someone who adapts scripts, dialogue, and UI text + into another language/locale while preserving meaning and tone. + """ ; + rdfs:subClassOf narrative:Role +. + +### Streaming / esports / event roles ########################################### + +narrative:Streamer + a owl:Class ; + rdfs:label "Streamer" ; + rdfs:comment """ + A Role for someone who regularly streams games or pop culture content + on live platforms (e.g., Twitch, YouTube, etc.). + """ ; + rdfs:subClassOf narrative:Role +. + +narrative:EsportsPlayer + a owl:Class ; + rdfs:label "Esports Player" ; + rdfs:comment """ + A Role representing a competitive player in organized esports events + and tournaments. + """ ; + rdfs:subClassOf narrative:Role +. + +narrative:Shoutcaster + a owl:Class ; + rdfs:label "Shoutcaster" ; + rdfs:comment """ + A Role representing a live commentator for competitive events, + especially in esports. + """ ; + rdfs:subClassOf narrative:Role +. + +narrative:Host + a owl:Class ; + rdfs:label "Host" ; + rdfs:comment """ + A Role representing a presenter or host for shows, panels, streams, + or live events. + """ ; + rdfs:subClassOf narrative:Role +. \ No newline at end of file diff --git a/infra/qlever/data/ttl/02-person.ttl b/infra/qlever/data/ttl/02-person.ttl new file mode 100644 index 0000000..00fcb8f --- /dev/null +++ b/infra/qlever/data/ttl/02-person.ttl @@ -0,0 +1,265 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Person Module +# Properties and relationships for real people (creators, performers) +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Person Module" ; + rdfs:comment "Properties and relationships for creators, performers, and industry professionals" ; + owl:imports . + +################################################################# +# Person Identity Properties +################################################################# + +narrative:birthName a owl:DatatypeProperty ; + rdfs:label "birth name" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Full legal birth name" . + +narrative:knownAs a owl:DatatypeProperty ; + rdfs:label "known as" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Common name or professional name" . + +narrative:alias a owl:DatatypeProperty ; + rdfs:label "alias" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Pen names, pseudonyms, stage names (repeatable)" . + +narrative:bio a owl:DatatypeProperty ; + rdfs:label "biography" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Biographical summary" . + +narrative:image a owl:DatatypeProperty ; + rdfs:label "image" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:anyURI ; + rdfs:comment "Profile photo or portrait URL" . + +################################################################# +# Person Biographical Properties +################################################################# + +narrative:birthDate a owl:DatatypeProperty ; + rdfs:label "birth date" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:date ; + rdfs:comment "Date of birth" . + +narrative:deathDate a owl:DatatypeProperty ; + rdfs:label "death date" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:date ; + rdfs:comment "Date of death (if deceased)" . + +narrative:birthPlace a owl:DatatypeProperty ; + rdfs:label "birth place" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "City, state/province, country of birth" . + +narrative:nationality a owl:DatatypeProperty ; + rdfs:label "nationality" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Country of citizenship (ISO 3166 code)" . + +narrative:gender a owl:DatatypeProperty ; + rdfs:label "gender" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Gender identity" . + +narrative:ethnicity a owl:DatatypeProperty ; + rdfs:label "ethnicity" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Ethnic background" . + +################################################################# +# Person Professional Properties +################################################################# + +narrative:primaryRole a owl:ObjectProperty ; + rdfs:label "primary role" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:Role ; + rdfs:comment "Primary creative role (writer, artist, director, etc.)" . + +narrative:activeYears a owl:DatatypeProperty ; + rdfs:label "active years" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Years active in industry (e.g., '1985-present')" . + +narrative:activeFrom a owl:DatatypeProperty ; + rdfs:label "active from" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:int ; + rdfs:comment "Year started in industry" . + +narrative:activeTo a owl:DatatypeProperty ; + rdfs:label "active to" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:int ; + rdfs:comment "Year ended/retired (if applicable)" . + +narrative:awards a owl:DatatypeProperty ; + rdfs:label "awards" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Awards and honors received (repeatable)" . + +narrative:education a owl:DatatypeProperty ; + rdfs:label "education" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Educational background" . + +narrative:influences a owl:DatatypeProperty ; + rdfs:label "influences" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Artistic or creative influences (repeatable)" . + +################################################################# +# Role-Specific Properties +################################################################# + +### Writer Properties +narrative:writingStyle a owl:DatatypeProperty ; + rdfs:label "writing style" ; + rdfs:domain narrative:Writer ; + rdfs:range xsd:string ; + rdfs:comment "Writing style or specialty" . + +narrative:notableStories a owl:DatatypeProperty ; + rdfs:label "notable stories" ; + rdfs:domain narrative:Writer ; + rdfs:range xsd:string ; + rdfs:comment "Famous stories written (repeatable)" . + +### Artist Properties +narrative:artStyle a owl:DatatypeProperty ; + rdfs:label "art style" ; + rdfs:domain narrative:Artist ; + rdfs:range xsd:string ; + rdfs:comment "Art style or technique" . + +narrative:primaryMedium a owl:DatatypeProperty ; + rdfs:label "primary medium" ; + rdfs:domain narrative:Artist ; + rdfs:range xsd:string ; + rdfs:comment "Traditional, Digital, Mixed Media, etc." . + +### Performer Properties +narrative:performanceStyle a owl:DatatypeProperty ; + rdfs:label "performance style" ; + rdfs:domain narrative:Performer ; + rdfs:range xsd:string ; + rdfs:comment "Acting or performance style" . + +narrative:voiceRange a owl:DatatypeProperty ; + rdfs:label "voice range" ; + rdfs:domain narrative:VoiceActor ; + rdfs:range xsd:string ; + rdfs:comment "Vocal range or type" . + +################################################################# +# Person Contact & Social Properties +################################################################# + +narrative:website a owl:DatatypeProperty ; + rdfs:label "website" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:anyURI ; + rdfs:comment "Official website URL" . + +narrative:socialMedia a owl:DatatypeProperty ; + rdfs:label "social media" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:anyURI ; + rdfs:comment "Social media profiles (repeatable)" . + +narrative:email a owl:DatatypeProperty ; + rdfs:label "email" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Contact email" . + +narrative:twitter a owl:DatatypeProperty ; + rdfs:label "twitter" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Twitter/X handle" . + +narrative:instagram a owl:DatatypeProperty ; + rdfs:label "instagram" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:string ; + rdfs:comment "Instagram handle" . + +narrative:portfolio a owl:DatatypeProperty ; + rdfs:label "portfolio" ; + rdfs:domain narrative:Person ; + rdfs:range xsd:anyURI ; + rdfs:comment "Portfolio website or gallery URL" . + +################################################################# +# Person-Organization Relationships +################################################################# + +narrative:worksFor a owl:ObjectProperty ; + rdfs:label "works for" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:employs ; + rdfs:comment "Employment relationship" . + +narrative:memberOf a owl:ObjectProperty ; + rdfs:label "member of" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:hasMember ; + rdfs:comment "Membership in organization or studio" . + +narrative:founded a owl:ObjectProperty ; + rdfs:label "founded" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:foundedBy ; + rdfs:comment "Organization founded by this person" . + +################################################################# +# Person-Character Relationships +################################################################# + +narrative:created a owl:ObjectProperty ; + rdfs:label "created" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:createdBy ; + rdfs:comment "Character created by this person" . + +################################################################# +# Person-Work Relationships +################################################################# + +narrative:contributed a owl:ObjectProperty ; + rdfs:label "contributed" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:StoryExpression ; + rdfs:comment "General contribution to a work (use CreditRelationship for detailed credits)" . diff --git a/infra/qlever/data/ttl/03-organization.ttl b/infra/qlever/data/ttl/03-organization.ttl new file mode 100644 index 0000000..e0b74c7 --- /dev/null +++ b/infra/qlever/data/ttl/03-organization.ttl @@ -0,0 +1,358 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Organization Module +# Properties and relationships for publishers, studios, distributors, retailers +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Organization Module" ; + rdfs:comment "Properties and relationships for companies, publishers, studios, distributors" ; + owl:imports . + +################################################################# +# Organization Subclasses +################################################################# + +narrative:Publisher a owl:Class ; + rdfs:subClassOf narrative:Org ; + rdfs:label "Publisher" ; + rdfs:comment "Publisher of books, comics, manga, or other printed works" . + +narrative:Imprint a owl:Class ; + rdfs:subClassOf narrative:Publisher ; + rdfs:label "Imprint" ; + rdfs:comment "Publishing imprint or label (e.g., Vertigo, MAX, Black Label)" . + +narrative:Studio a owl:Class ; + rdfs:subClassOf narrative:Org ; + rdfs:label "Studio" ; + rdfs:comment "Animation studio, film studio, or game studio" . + +narrative:ProductionCompany a owl:Class ; + rdfs:subClassOf narrative:Org ; + rdfs:label "Production Company" ; + rdfs:comment "Film or TV production company" . + +narrative:Distributor a owl:Class ; + rdfs:subClassOf narrative:Org ; + rdfs:label "Distributor" ; + rdfs:comment "Distribution company" . + +narrative:Printer a owl:Class ; + rdfs:subClassOf narrative:Org ; + rdfs:label "Printer" ; + rdfs:comment "Printing company" . + +narrative:LCS a owl:Class ; + rdfs:subClassOf narrative:Org ; + rdfs:label "Local Comic Shop" ; + rdfs:comment "Local comic shop / retail store" . + +narrative:StreamingService a owl:Class ; + rdfs:subClassOf narrative:Org ; + rdfs:label "Streaming Service" ; + rdfs:comment "Digital streaming platform" . + +narrative:RecordLabel a owl:Class ; + rdfs:subClassOf narrative:Org ; + rdfs:label "Record Label" ; + rdfs:comment "Music record label" . + +narrative:GamePublisher a owl:Class ; + rdfs:subClassOf narrative:Publisher ; + rdfs:label "Game Publisher" ; + rdfs:comment "Video game publisher" . + +################################################################# +# Organization Identity Properties +################################################################# + +narrative:orgName a owl:DatatypeProperty ; + rdfs:label "organization name" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Primary organization name" . + +narrative:legalName a owl:DatatypeProperty ; + rdfs:label "legal name" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Legal registered name of organization" . + +narrative:shortName a owl:DatatypeProperty ; + rdfs:label "short name" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Abbreviated name (e.g., 'DC' for 'DC Comics')" . + +narrative:orgType a owl:DatatypeProperty ; + rdfs:label "organization type" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Publisher, Studio, Distributor, Retailer, etc." . + +narrative:bio a owl:DatatypeProperty ; + rdfs:label "organization bio" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Organization description and history" . + +narrative:logo a owl:DatatypeProperty ; + rdfs:label "logo" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:anyURI ; + rdfs:comment "Organization logo URL" . + +################################################################# +# Organization Timeline Properties +################################################################# + +narrative:foundedDate a owl:DatatypeProperty ; + rdfs:label "founded date" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:date ; + rdfs:comment "Date organization was founded" . + +narrative:dissolvedDate a owl:DatatypeProperty ; + rdfs:label "dissolved date" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:date ; + rdfs:comment "Date organization ceased operations" . + +narrative:status a owl:DatatypeProperty ; + rdfs:label "status" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Active, Defunct, Acquired, Merged, etc." . + +################################################################# +# Organization Location Properties +################################################################# + +narrative:headquarters a owl:DatatypeProperty ; + rdfs:label "headquarters" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Location of headquarters" . + +narrative:country a owl:DatatypeProperty ; + rdfs:label "country" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Country of operation (ISO 3166 code)" . + +narrative:countryOfOrigin a owl:DatatypeProperty ; + rdfs:label "country of origin" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Country where organization originated (ISO 3166 code)" . + +narrative:city a owl:DatatypeProperty ; + rdfs:label "city" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "City location" . + +narrative:state a owl:DatatypeProperty ; + rdfs:label "state" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "State or province" . + +narrative:address a owl:DatatypeProperty ; + rdfs:label "address" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Physical address" . + +################################################################# +# Organization Business Properties +################################################################# + +narrative:industry a owl:DatatypeProperty ; + rdfs:label "industry" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Industry sector (Comics, Animation, Film, Gaming, Music, etc.)" . + +narrative:revenue a owl:DatatypeProperty ; + rdfs:label "revenue" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:decimal ; + rdfs:comment "Annual revenue" . + +narrative:employeeCount a owl:DatatypeProperty ; + rdfs:label "employee count" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:int ; + rdfs:comment "Number of employees" . + +narrative:stockSymbol a owl:DatatypeProperty ; + rdfs:label "stock symbol" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Stock ticker symbol (if publicly traded)" . + +################################################################# +# Organization Contact Properties +################################################################# + +narrative:website a owl:DatatypeProperty ; + rdfs:label "website" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:anyURI ; + rdfs:comment "Official website URL" . + +narrative:email a owl:DatatypeProperty ; + rdfs:label "email" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Contact email" . + +narrative:phone a owl:DatatypeProperty ; + rdfs:label "phone" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:string ; + rdfs:comment "Contact phone number" . + +narrative:socialMedia a owl:DatatypeProperty ; + rdfs:label "social media" ; + rdfs:domain narrative:Org ; + rdfs:range xsd:anyURI ; + rdfs:comment "Social media profiles (repeatable)" . + +################################################################# +# Organization Hierarchy Relationships +################################################################# + +narrative:parentOrg a owl:ObjectProperty ; + rdfs:label "parent organization" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:subsidiary ; + rdfs:comment "Parent company (e.g., DC is owned by Warner Bros)" . + +narrative:subsidiary a owl:ObjectProperty ; + rdfs:label "subsidiary" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:parentOrg ; + rdfs:comment "Subsidiary organizations" . + +narrative:division a owl:ObjectProperty ; + rdfs:label "division" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Org ; + rdfs:comment "Division or department of organization" . + +################################################################# +# Organization-Person Relationships +################################################################# + +narrative:employs a owl:ObjectProperty ; + rdfs:label "employs" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Person ; + owl:inverseOf narrative:worksFor ; + rdfs:comment "Employment relationship" . + +narrative:hasMember a owl:ObjectProperty ; + rdfs:label "has member" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Person ; + owl:inverseOf narrative:memberOf ; + rdfs:comment "Membership in organization" . + +narrative:foundedBy a owl:ObjectProperty ; + rdfs:label "founded by" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Person ; + owl:inverseOf narrative:founded ; + rdfs:comment "Person who founded this organization" . + +narrative:ceo a owl:ObjectProperty ; + rdfs:label "CEO" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Person ; + rdfs:comment "Chief Executive Officer" . + +narrative:president a owl:ObjectProperty ; + rdfs:label "president" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Person ; + rdfs:comment "President of organization" . + +narrative:editorInChief a owl:ObjectProperty ; + rdfs:label "editor in chief" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Person ; + rdfs:comment "Editor-in-chief or editorial director" . + +################################################################# +# Organization-Work Relationships +################################################################# + +narrative:publishes a owl:ObjectProperty ; + rdfs:label "publishes" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:StoryWork ; + owl:inverseOf narrative:publishedBy ; + rdfs:comment "Works published by this organization" . + +narrative:produces a owl:ObjectProperty ; + rdfs:label "produces" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:StoryWork ; + owl:inverseOf narrative:producedBy ; + rdfs:comment "Works produced by this organization" . + +narrative:distributes a owl:ObjectProperty ; + rdfs:label "distributes" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Product ; + owl:inverseOf narrative:distributedBy ; + rdfs:comment "Products distributed by this organization" . + +################################################################# +# Publisher-Specific Properties +################################################################# + +narrative:publisherType a owl:DatatypeProperty ; + rdfs:label "publisher type" ; + rdfs:domain narrative:Publisher ; + rdfs:range xsd:string ; + rdfs:comment "Major, Independent, Self-Published, etc." . + +narrative:publishingFocus a owl:DatatypeProperty ; + rdfs:label "publishing focus" ; + rdfs:domain narrative:Publisher ; + rdfs:range xsd:string ; + rdfs:comment "Genre or content focus (Superhero, Horror, Manga, Literary, etc.)" . + +################################################################# +# LCS-Specific Properties +################################################################# + +narrative:storeHours a owl:DatatypeProperty ; + rdfs:label "store hours" ; + rdfs:domain narrative:LCS ; + rdfs:range xsd:string ; + rdfs:comment "Operating hours" . + +narrative:specializations a owl:DatatypeProperty ; + rdfs:label "specializations" ; + rdfs:domain narrative:LCS ; + rdfs:range xsd:string ; + rdfs:comment "Store specializations (vintage comics, manga, gaming, etc.)" . + +narrative:diamondAccountNumber a owl:DatatypeProperty ; + rdfs:label "Diamond account number" ; + rdfs:domain narrative:LCS ; + rdfs:range xsd:string ; + rdfs:comment "Diamond distributor account number" . diff --git a/infra/qlever/data/ttl/04-character.ttl b/infra/qlever/data/ttl/04-character.ttl new file mode 100644 index 0000000..ad9203c --- /dev/null +++ b/infra/qlever/data/ttl/04-character.ttl @@ -0,0 +1,353 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Character Module +# Properties and relationships for fictional characters +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Character Module" ; + rdfs:comment "Properties and relationships for fictional characters across all media" ; + owl:imports . + +################################################################# +# Character Identity Properties +################################################################# + +narrative:characterName a owl:DatatypeProperty ; + rdfs:label "character name" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Primary character name" . + +narrative:realName a owl:DatatypeProperty ; + rdfs:label "real name" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Secret identity or civilian name" . + +narrative:aliases a owl:DatatypeProperty ; + rdfs:label "aliases" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Alternate names, codenames, nicknames (repeatable)" . + +narrative:mantleName a owl:DatatypeProperty ; + rdfs:label "mantle name" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Heroic or villainous identity mantle (Robin, Flash, Captain America)" . + +narrative:bio a owl:DatatypeProperty ; + rdfs:label "bio" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Character biography and description" . + +narrative:image a owl:DatatypeProperty ; + rdfs:label "image" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:anyURI ; + rdfs:comment "Primary character image or portrait URL" . + +################################################################# +# Character Classification Properties +################################################################# + +narrative:characterType a owl:DatatypeProperty ; + rdfs:label "character type" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Hero, Villain, Anti-Hero, Supporting, Civilian, etc." . + +narrative:species a owl:DatatypeProperty ; + rdfs:label "species" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Character species (Human, Kryptonian, Mutant, Android, Demon, etc.)" . + +narrative:gender a owl:DatatypeProperty ; + rdfs:label "gender" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Gender identity" . + +narrative:occupation a owl:DatatypeProperty ; + rdfs:label "occupation" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Character's job or role (repeatable)" . + +narrative:affiliation a owl:DatatypeProperty ; + rdfs:label "affiliation" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Groups, teams, or organizations affiliated with (repeatable)" . + +################################################################# +# Character Powers & Abilities +################################################################# + +narrative:powers a owl:DatatypeProperty ; + rdfs:label "powers" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Superpowers or special abilities (repeatable)" . + +narrative:abilities a owl:DatatypeProperty ; + rdfs:label "abilities" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Skills and talents (repeatable)" . + +narrative:weapons a owl:DatatypeProperty ; + rdfs:label "weapons" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Signature weapons or equipment (repeatable)" . + +narrative:powerLevel a owl:DatatypeProperty ; + rdfs:label "power level" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Street-level, Planetary, Cosmic, etc." . + +################################################################# +# Character Physical Properties +################################################################# + +narrative:height a owl:DatatypeProperty ; + rdfs:label "height" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Character height" . + +narrative:weight a owl:DatatypeProperty ; + rdfs:label "weight" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Character weight" . + +narrative:eyeColor a owl:DatatypeProperty ; + rdfs:label "eye color" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Eye color" . + +narrative:hairColor a owl:DatatypeProperty ; + rdfs:label "hair color" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Hair color" . + +narrative:physicalDescription a owl:DatatypeProperty ; + rdfs:label "physical description" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "General physical description" . + +################################################################# +# Character Origin Properties +################################################################# + +narrative:origin a owl:DatatypeProperty ; + rdfs:label "origin" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Origin story summary" . + +narrative:birthPlace a owl:DatatypeProperty ; + rdfs:label "birth place" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Place of birth or origin" . + +narrative:firstAppearanceDate a owl:DatatypeProperty ; + rdfs:label "first appearance date" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:date ; + rdfs:comment "Publication date of first appearance" . + +narrative:deathStatus a owl:DatatypeProperty ; + rdfs:label "death status" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Alive, Deceased, Resurrected, Unknown" . + +################################################################# +# Character Personality & Traits +################################################################# + +narrative:personality a owl:DatatypeProperty ; + rdfs:label "personality" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Personality traits and characteristics" . + +narrative:alignment a owl:DatatypeProperty ; + rdfs:label "alignment" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Moral alignment (Good, Evil, Neutral, Chaotic Good, etc.)" . + +narrative:motivations a owl:DatatypeProperty ; + rdfs:label "motivations" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Character motivations and goals" . + +################################################################# +# Character-Universe Relationships +################################################################# + +narrative:existsInUniverse a owl:ObjectProperty ; + rdfs:label "exists in universe" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Universe ; + owl:inverseOf narrative:containsCharacter ; + rdfs:comment "Universe or continuity this character exists in" . + +narrative:belongsToFranchise a owl:ObjectProperty ; + rdfs:label "belongs to franchise" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Franchise ; + owl:inverseOf narrative:includesCharacter ; + rdfs:comment "Franchise this character belongs to" . + +################################################################# +# Character-Creator Relationships +################################################################# + +narrative:createdBy a owl:ObjectProperty ; + rdfs:label "created by" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Person ; + owl:inverseOf narrative:created ; + rdfs:comment "Person (writer/artist) who created this character" . + +narrative:designedBy a owl:ObjectProperty ; + rdfs:label "designed by" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Person ; + rdfs:comment "Artist who designed the character's visual appearance" . + +################################################################# +# Character-Team Relationships +################################################################# + +narrative:characterMemberOf a owl:ObjectProperty ; + rdfs:label "character member of" ; + rdfs:subPropertyOf narrative:memberOf ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Group ; + owl:inverseOf narrative:hasCharacterMember ; + rdfs:comment "Team or group this character belongs to" . + +narrative:characterLeaderOf a owl:ObjectProperty ; + rdfs:label "character leader of" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Group ; + owl:inverseOf narrative:ledBy ; + rdfs:comment "Team or group this character leads" . + +narrative:characterFounderOf a owl:ObjectProperty ; + rdfs:label "character founder of" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Group ; + owl:inverseOf narrative:foundedByCharacter ; + rdfs:comment "Team or group this character founded" . + +################################################################# +# Character Variant Relationships +################################################################# + +narrative:variantOf a owl:ObjectProperty ; + rdfs:label "variant of" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:hasVariant ; + rdfs:comment "This character is a variant/alternate version of another character" . + +narrative:hasVariant a owl:ObjectProperty ; + rdfs:label "has variant" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:variantOf ; + rdfs:comment "Character has alternate universe variants" . + +narrative:primaryVersion a owl:ObjectProperty ; + rdfs:label "primary version" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Character ; + rdfs:comment "Canonical or primary version of this character (typically main continuity)" . + +narrative:alternateVersion a owl:ObjectProperty ; + rdfs:label "alternate version" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Character ; + rdfs:comment "Alternate version of character (different universe, timeline, etc.)" . + +################################################################# +# Character Appearance Tracking +################################################################# + +narrative:appearsIn a owl:ObjectProperty ; + rdfs:label "appears in" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:StoryExpression ; + owl:inverseOf narrative:features ; + rdfs:comment "Story/issue this character appears in" . + +narrative:prominentIn a owl:ObjectProperty ; + rdfs:label "prominent in" ; + rdfs:subPropertyOf narrative:appearsIn ; + rdfs:domain narrative:Character ; + rdfs:range narrative:StoryExpression ; + rdfs:comment "Story where character plays a major/starring role (not just cameo)" . + +narrative:firstAppearance a owl:ObjectProperty ; + rdfs:label "first appearance" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:StoryExpression ; + rdfs:comment "Issue/episode of character's first appearance" . + +narrative:deathIssue a owl:ObjectProperty ; + rdfs:label "death issue" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:StoryExpression ; + rdfs:comment "Issue where character died" . + +narrative:resurrectionIssue a owl:ObjectProperty ; + rdfs:label "resurrection issue" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:StoryExpression ; + rdfs:comment "Issue where character was resurrected" . + +################################################################# +# Character Mantle Relationships +################################################################# + +narrative:inheritedMantleFrom a owl:ObjectProperty ; + rdfs:label "inherited mantle from" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:passedMantleTo ; + rdfs:comment "Character who previously held this mantle" . + +narrative:passedMantleTo a owl:ObjectProperty ; + rdfs:label "passed mantle to" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:inheritedMantleFrom ; + rdfs:comment "Character who inherited this mantle" . + +narrative:currentlyHolds a owl:DatatypeProperty ; + rdfs:label "currently holds" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether character currently holds the mantle (true/false)" . diff --git a/infra/qlever/data/ttl/05-group-universe.ttl b/infra/qlever/data/ttl/05-group-universe.ttl new file mode 100644 index 0000000..ac863e8 --- /dev/null +++ b/infra/qlever/data/ttl/05-group-universe.ttl @@ -0,0 +1,384 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Group and Universe Module +# Teams, fictional universes, and franchises +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Group and Universe Module" ; + rdfs:comment "Properties and relationships for teams, groups, universes, and franchises" ; + owl:imports . + +################################################################# +# Group Subclasses +################################################################# + +narrative:SuperheroTeam a owl:Class ; + rdfs:subClassOf narrative:Group ; + rdfs:label "Superhero Team" ; + rdfs:comment "Team of superheroes working together (e.g., Avengers, X-Men, Justice League)" . + +narrative:VillainGroup a owl:Class ; + rdfs:subClassOf narrative:Group ; + rdfs:label "Villain Group" ; + rdfs:comment "Organization or team of antagonists (e.g., Sinister Six, Brotherhood of Evil Mutants)" . + +narrative:GovernmentAgency a owl:Class ; + rdfs:subClassOf narrative:Group ; + rdfs:label "Government Agency" ; + rdfs:comment "Governmental organization within fictional universe (e.g., SHIELD, Checkmate, ARGUS)" . + +narrative:CriminalOrganization a owl:Class ; + rdfs:subClassOf narrative:Group ; + rdfs:label "Criminal Organization" ; + rdfs:comment "Criminal syndicate or illegal organization (e.g., Hydra, League of Assassins)" . + +narrative:MilitaryUnit a owl:Class ; + rdfs:subClassOf narrative:Group ; + rdfs:label "Military Unit" ; + rdfs:comment "Military force or unit within fictional universe" . + +narrative:CorporateEntity a owl:Class ; + rdfs:subClassOf narrative:Group ; + rdfs:label "Corporate Entity" ; + rdfs:comment "Fictional corporation or business (e.g., Wayne Enterprises, Stark Industries)" . + +narrative:ReligiousOrder a owl:Class ; + rdfs:subClassOf narrative:Group ; + rdfs:label "Religious Order" ; + rdfs:comment "Religious organization or order within fictional universe" . + +narrative:AlienRace a owl:Class ; + rdfs:subClassOf narrative:Group ; + rdfs:label "Alien Race" ; + rdfs:comment "Species or race of extraterrestrial beings" . + +################################################################# +# Group Properties +################################################################# + +narrative:groupName a owl:DatatypeProperty ; + rdfs:label "group name" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:string ; + rdfs:comment "Primary name of the team, organization, or collective" . + +narrative:groupType a owl:DatatypeProperty ; + rdfs:label "group type" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:string ; + rdfs:comment "Type of group: Superhero Team, Villain Group, Government Agency, etc." . + +narrative:bio a owl:DatatypeProperty ; + rdfs:label "group bio" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:string ; + rdfs:comment "Group description and history" . + +narrative:image a owl:DatatypeProperty ; + rdfs:label "group image" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:anyURI ; + rdfs:comment "Group logo or emblem URL" . + +narrative:motto a owl:DatatypeProperty ; + rdfs:label "motto" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:string ; + rdfs:comment "Group motto or slogan" . + +narrative:headquarters a owl:DatatypeProperty ; + rdfs:label "headquarters" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:string ; + rdfs:comment "Location of group's base or headquarters" . + +narrative:foundedDate a owl:DatatypeProperty ; + rdfs:label "founded date" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:date ; + rdfs:comment "Date group was founded (in-universe)" . + +narrative:disbandedDate a owl:DatatypeProperty ; + rdfs:label "disbanded date" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:date ; + rdfs:comment "Date group disbanded (in-universe)" . + +narrative:status a owl:DatatypeProperty ; + rdfs:label "status" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:string ; + rdfs:comment "Active, Disbanded, Reformed, Destroyed, etc." . + +narrative:memberCount a owl:DatatypeProperty ; + rdfs:label "member count" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:int ; + rdfs:comment "Approximate number of members" . + +narrative:objectives a owl:DatatypeProperty ; + rdfs:label "objectives" ; + rdfs:domain narrative:Group ; + rdfs:range xsd:string ; + rdfs:comment "Group goals and objectives" . + +################################################################# +# Group-Character Relationships +################################################################# + +narrative:hasCharacterMember a owl:ObjectProperty ; + rdfs:label "has character member" ; + rdfs:domain narrative:Group ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:characterMemberOf ; + rdfs:comment "Character member of this team" . + +narrative:ledBy a owl:ObjectProperty ; + rdfs:label "led by" ; + rdfs:domain narrative:Group ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:characterLeaderOf ; + rdfs:comment "Character who leads this group" . + +narrative:foundedByCharacter a owl:ObjectProperty ; + rdfs:label "founded by character" ; + rdfs:domain narrative:Group ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:characterFounderOf ; + rdfs:comment "Character who founded this group" . + +################################################################# +# Group-Universe Relationships +################################################################# + +narrative:existsInUniverse a owl:ObjectProperty ; + rdfs:label "exists in universe" ; + rdfs:domain narrative:Group ; + rdfs:range narrative:Universe ; + owl:inverseOf narrative:containsGroup ; + rdfs:comment "Universe this group exists in" . + +################################################################# +# Group-Group Relationships +################################################################# + +narrative:alliedWith a owl:ObjectProperty ; + rdfs:label "allied with" ; + rdfs:domain narrative:Group ; + rdfs:range narrative:Group ; + rdfs:comment "Groups allied with this group" . + +narrative:rivalOf a owl:ObjectProperty ; + rdfs:label "rival of" ; + rdfs:domain narrative:Group ; + rdfs:range narrative:Group ; + rdfs:comment "Rival or enemy groups" . + +narrative:spinoffOf a owl:ObjectProperty ; + rdfs:label "spinoff of" ; + rdfs:domain narrative:Group ; + rdfs:range narrative:Group ; + rdfs:comment "Parent group this group spun off from" . + +################################################################# +# Universe Properties +################################################################# + +narrative:universeName a owl:DatatypeProperty ; + rdfs:label "universe name" ; + rdfs:domain narrative:Universe ; + rdfs:range xsd:string ; + rdfs:comment "Name of the fictional universe or continuity" . + +narrative:universeDesignation a owl:DatatypeProperty ; + rdfs:label "universe designation" ; + rdfs:domain narrative:Universe ; + rdfs:range xsd:string ; + rdfs:comment "Official designation code (e.g., Earth-616, Prime Earth, MCU)" . + +narrative:bio a owl:DatatypeProperty ; + rdfs:label "universe bio" ; + rdfs:domain narrative:Universe ; + rdfs:range xsd:string ; + rdfs:comment "Universe description and key characteristics" . + +narrative:image a owl:DatatypeProperty ; + rdfs:label "universe image" ; + rdfs:domain narrative:Universe ; + rdfs:range xsd:anyURI ; + rdfs:comment "Representative image for this universe" . + +narrative:continuityType a owl:DatatypeProperty ; + rdfs:label "continuity type" ; + rdfs:domain narrative:Universe ; + rdfs:range xsd:string ; + rdfs:comment "Main Continuity, Alternate Universe, Elseworlds, What If, etc." . + +narrative:timelineStart a owl:DatatypeProperty ; + rdfs:label "timeline start" ; + rdfs:domain narrative:Universe ; + rdfs:range xsd:string ; + rdfs:comment "When this universe's timeline begins (in-universe)" . + +narrative:realWorldStart a owl:DatatypeProperty ; + rdfs:label "real world start" ; + rdfs:domain narrative:Universe ; + rdfs:range xsd:date ; + rdfs:comment "When this universe was created (real publication date)" . + +narrative:status a owl:DatatypeProperty ; + rdfs:label "status" ; + rdfs:domain narrative:Universe ; + rdfs:range xsd:string ; + rdfs:comment "Active, Rebooted, Merged, Destroyed, etc." . + +################################################################# +# Universe-Organization Relationships +################################################################# + +narrative:publisherUniverse a owl:ObjectProperty ; + rdfs:label "publisher universe" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:ownsUniverse ; + rdfs:comment "Publisher that owns/maintains this fictional universe" . + +################################################################# +# Universe-Character/Group Relationships +################################################################# + +narrative:containsCharacter a owl:ObjectProperty ; + rdfs:label "contains character" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:existsInUniverse ; + rdfs:comment "Characters existing in this universe" . + +narrative:containsGroup a owl:ObjectProperty ; + rdfs:label "contains group" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:Group ; + owl:inverseOf narrative:existsInUniverse ; + rdfs:comment "Groups existing in this universe" . + +################################################################# +# Universe-Work Relationships +################################################################# + +narrative:containsWork a owl:ObjectProperty ; + rdfs:label "contains work" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:StoryWork ; + owl:inverseOf narrative:setInUniverse ; + rdfs:comment "Works set in this universe" . + +################################################################# +# Universe-Universe Relationships +################################################################# + +narrative:parallelTo a owl:ObjectProperty ; + rdfs:label "parallel to" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:Universe ; + rdfs:comment "Parallel or alternate universe" . + +narrative:mergedInto a owl:ObjectProperty ; + rdfs:label "merged into" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:Universe ; + owl:inverseOf narrative:mergedFrom ; + rdfs:comment "Universe this was merged into (for reboots/crises)" . + +narrative:mergedFrom a owl:ObjectProperty ; + rdfs:label "merged from" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:Universe ; + owl:inverseOf narrative:mergedInto ; + rdfs:comment "Universes that were merged to create this one" . + +narrative:rebootOf a owl:ObjectProperty ; + rdfs:label "reboot of" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:Universe ; + owl:inverseOf narrative:rebootedAs ; + rdfs:comment "Previous universe that this is a reboot of" . + +narrative:rebootedAs a owl:ObjectProperty ; + rdfs:label "rebooted as" ; + rdfs:domain narrative:Universe ; + rdfs:range narrative:Universe ; + owl:inverseOf narrative:rebootOf ; + rdfs:comment "New universe this was rebooted as" . + +################################################################# +# Franchise Properties +################################################################# + +narrative:franchiseName a owl:DatatypeProperty ; + rdfs:label "franchise name" ; + rdfs:domain narrative:Franchise ; + rdfs:range xsd:string ; + rdfs:comment "Name of the media franchise" . + +narrative:bio a owl:DatatypeProperty ; + rdfs:label "franchise bio" ; + rdfs:domain narrative:Franchise ; + rdfs:range xsd:string ; + rdfs:comment "Franchise description and overview" . + +narrative:logo a owl:DatatypeProperty ; + rdfs:label "franchise logo" ; + rdfs:domain narrative:Franchise ; + rdfs:range xsd:anyURI ; + rdfs:comment "Franchise logo URL" . + +narrative:launchDate a owl:DatatypeProperty ; + rdfs:label "launch date" ; + rdfs:domain narrative:Franchise ; + rdfs:range xsd:date ; + rdfs:comment "Date franchise launched" . + +narrative:mediaTypes a owl:DatatypeProperty ; + rdfs:label "media types" ; + rdfs:domain narrative:Franchise ; + rdfs:range xsd:string ; + rdfs:comment "Types of media in franchise (Comics, Films, TV, Games, etc.)" . + +################################################################# +# Franchise Relationships +################################################################# + +narrative:ownedBy a owl:ObjectProperty ; + rdfs:label "owned by" ; + rdfs:domain narrative:Franchise ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:ownsFranchise ; + rdfs:comment "Organization that owns this franchise" . + +narrative:includesCharacter a owl:ObjectProperty ; + rdfs:label "includes character" ; + rdfs:domain narrative:Franchise ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:belongsToFranchise ; + rdfs:comment "Character belonging to this franchise" . + +narrative:includesWork a owl:ObjectProperty ; + rdfs:label "includes work" ; + rdfs:domain narrative:Franchise ; + rdfs:range narrative:StoryWork ; + owl:inverseOf narrative:partOfFranchise ; + rdfs:comment "Work that is part of this franchise" . + +narrative:includesUniverse a owl:ObjectProperty ; + rdfs:label "includes universe" ; + rdfs:domain narrative:Franchise ; + rdfs:range narrative:Universe ; + owl:inverseOf narrative:belongsToFranchise ; + rdfs:comment "Universe within this franchise" . diff --git a/infra/qlever/data/ttl/06-story-structure.ttl b/infra/qlever/data/ttl/06-story-structure.ttl new file mode 100644 index 0000000..06aabd2 --- /dev/null +++ b/infra/qlever/data/ttl/06-story-structure.ttl @@ -0,0 +1,1066 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Story Structure Module +# StoryWork, StoryExpression, NarrativeUnit, Arcs, Events, Seasons +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Story Structure Module" ; + rdfs:comment "Properties and relationships for story works, expressions, and narrative units" ; + owl:imports . + +################################################################# +# StoryWork Properties +################################################################# + +narrative:seriesName a owl:DatatypeProperty ; + rdfs:label "series name" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Name of the series" . + +narrative:sortName a owl:DatatypeProperty ; + rdfs:label "sort name" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Name for alphabetical sorting (without 'The', etc.)" . + +narrative:subtitle a owl:DatatypeProperty ; + rdfs:label "subtitle" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Series subtitle" . + +narrative:volume a owl:DatatypeProperty ; + rdfs:label "volume" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Volume number (for series with multiple volumes)" . + +narrative:synopsis a owl:DatatypeProperty ; + rdfs:label "synopsis" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Series description/premise" . + +narrative:coverImage a owl:DatatypeProperty ; + rdfs:label "cover image" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:anyURI ; + rdfs:comment "Representative cover image for series" . + +################################################################# +# StoryWork Timeline Properties +################################################################# + +narrative:yearBegan a owl:DatatypeProperty ; + rdfs:label "year began" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Year series started" . + +narrative:yearEnded a owl:DatatypeProperty ; + rdfs:label "year ended" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Year series ended (if concluded)" . + +narrative:publicationStatus a owl:DatatypeProperty ; + rdfs:label "publication status" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Ongoing, Completed, Cancelled, Hiatus" . + +narrative:issueCount a owl:DatatypeProperty ; + rdfs:label "issue count" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Total number of issues published" . + +narrative:episodeCount a owl:DatatypeProperty ; + rdfs:label "episode count" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Total number of episodes (for TV/anime)" . + +narrative:chapterCount a owl:DatatypeProperty ; + rdfs:label "chapter count" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Total number of chapters (for manga/webtoons)" . + +################################################################# +# StoryWork Classification Properties +################################################################# + +narrative:seriesType a owl:DatatypeProperty ; + rdfs:label "series type" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Ongoing Series, Limited Series, Mini-Series, One-Shot, Graphic Novel, etc." . + +narrative:genre a owl:DatatypeProperty ; + rdfs:label "genre" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Genre classification (repeatable)" . + +narrative:ageRating a owl:DatatypeProperty ; + rdfs:label "age rating" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "All Ages, Teen, Mature Readers, 18+, etc." . + +narrative:contentRating a owl:DatatypeProperty ; + rdfs:label "content rating" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "MPAA, TV-rating, ESRB, CERO, etc." . + +narrative:demographic a owl:DatatypeProperty ; + rdfs:label "demographic" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Target demographic: Shonen, Seinen, Shoujo, Josei, Kids, etc." . + +narrative:continuity a owl:DatatypeProperty ; + rdfs:label "continuity" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Continuity designation (Earth-616, New 52, etc.)" . + +################################################################# +# StoryWork Medium Properties +################################################################# + +narrative:medium a owl:DatatypeProperty ; + rdfs:label "medium" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Comic, Manga, Anime, Film, TV Series, Novel, Game, Music Album, etc." . + +narrative:format a owl:DatatypeProperty ; + rdfs:label "format" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Print, Digital, Web, Broadcast, Streaming, etc." . + +narrative:language a owl:DatatypeProperty ; + rdfs:label "language" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment "Original language (ISO 639 code)" . + +################################################################# +# StoryWork Relationships +################################################################# + +narrative:publishedBy a owl:ObjectProperty ; + rdfs:label "published by" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:publishes ; + rdfs:comment "Publisher of the series" . + +narrative:producedBy a owl:ObjectProperty ; + rdfs:label "produced by" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:produces ; + rdfs:comment "Production company or studio" . + +narrative:imprint a owl:ObjectProperty ; + rdfs:label "imprint" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Org ; + rdfs:comment "Imprint line (Vertigo, MAX, Black Label, etc.)" . + +narrative:setInUniverse a owl:ObjectProperty ; + rdfs:label "set in universe" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Universe ; + owl:inverseOf narrative:containsWork ; + rdfs:comment "Universe or continuity this work is set in" . + +narrative:partOfFranchise a owl:ObjectProperty ; + rdfs:label "part of franchise" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Franchise ; + owl:inverseOf narrative:includesWork ; + rdfs:comment "Franchise this work belongs to" . + +narrative:hasExpression a owl:ObjectProperty ; + rdfs:label "has expression" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryExpression ; + owl:inverseOf narrative:expressionOf ; + rdfs:comment "Specific issue/episode/chapter of this work" . + +narrative:spinoffOf a owl:ObjectProperty ; + rdfs:label "spinoff of" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork ; + rdfs:comment "Parent series this is a spinoff of" . + +narrative:sequelTo a owl:ObjectProperty ; + rdfs:label "sequel to" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork ; + owl:inverseOf narrative:hasSequel ; + rdfs:comment "Previous work in sequence" . + +narrative:prequelTo a owl:ObjectProperty ; + rdfs:label "prequel to" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork ; + owl:inverseOf narrative:hasPrequel ; + rdfs:comment "Later work in sequence" . + +################################################################# +# StoryExpression Properties +################################################################# + +narrative:issueNumber a owl:DatatypeProperty ; + rdfs:label "issue number" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Issue number (can be string for special issues like '0', 'Annual')" . + +narrative:episodeNumber a owl:DatatypeProperty ; + rdfs:label "episode number" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Episode number" . + +narrative:chapterNumber a owl:DatatypeProperty ; + rdfs:label "chapter number" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Chapter number" . + +narrative:trackNumber a owl:DatatypeProperty ; + rdfs:label "track number" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:int ; + rdfs:comment "Track number (for music)" . + +narrative:issueTitle a owl:DatatypeProperty ; + rdfs:label "issue title" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Title of this specific issue/episode/chapter" . + +narrative:subtitle a owl:DatatypeProperty ; + rdfs:label "subtitle" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Issue subtitle or chapter title" . + +narrative:altNumber a owl:DatatypeProperty ; + rdfs:label "alternate number" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Alternate numbering (legacy numbering, etc.)" . + +narrative:description a owl:DatatypeProperty ; + rdfs:label "description" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Issue description/solicitation text" . + +narrative:coverImage a owl:DatatypeProperty ; + rdfs:label "cover image" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:anyURI ; + rdfs:comment "URL to cover image" . + +################################################################# +# StoryExpression Date Properties +################################################################# + +narrative:coverDate a owl:DatatypeProperty ; + rdfs:label "cover date" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:date ; + rdfs:comment "Cover date (month/year on cover)" . + +narrative:storeDate a owl:DatatypeProperty ; + rdfs:label "store date" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:date ; + rdfs:comment "Actual release date to stores" . + +narrative:digitalReleaseDate a owl:DatatypeProperty ; + rdfs:label "digital release date" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:date ; + rdfs:comment "Digital release date" . + +narrative:airDate a owl:DatatypeProperty ; + rdfs:label "air date" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:date ; + rdfs:comment "Original broadcast/air date" . + +narrative:releaseDate a owl:DatatypeProperty ; + rdfs:label "release date" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:date ; + rdfs:comment "General release date" . + +################################################################# +# StoryExpression Content Properties +################################################################# + +narrative:pageCount a owl:DatatypeProperty ; + rdfs:label "page count" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:int ; + rdfs:comment "Total number of pages" . + +narrative:storyPageCount a owl:DatatypeProperty ; + rdfs:label "story page count" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:int ; + rdfs:comment "Story pages (excluding ads)" . + +narrative:runtime a owl:DatatypeProperty ; + rdfs:label "runtime" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:int ; + rdfs:comment "Runtime in minutes (for TV/film)" . + +narrative:duration a owl:DatatypeProperty ; + rdfs:label "duration" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Duration (flexible format, e.g., '2:24:15' for music)" . + +narrative:hasBackupStory a owl:DatatypeProperty ; + rdfs:label "has backup story" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether issue contains backup/second story" . + +################################################################# +# StoryExpression Format Properties +################################################################# + +narrative:readingDirection a owl:DatatypeProperty ; + rdfs:label "reading direction" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Reading direction: left-to-right, right-to-left, vertical-scroll" . + +narrative:colorType a owl:DatatypeProperty ; + rdfs:label "color type" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Color format: full-color, black-and-white, spot-color, greyscale" . + +################################################################# +# StoryExpression Significance Properties +################################################################# + +narrative:isKeyIssue a owl:DatatypeProperty ; + rdfs:label "is key issue" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether considered a key/significant issue" . + +narrative:significantEvent a owl:DatatypeProperty ; + rdfs:label "significant event" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Major story events (death of X, origin story, etc.)" . + +narrative:crossover a owl:DatatypeProperty ; + rdfs:label "crossover" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string ; + rdfs:comment "Name of crossover event (if applicable)" . + +narrative:collectedIn a owl:ObjectProperty ; + rdfs:label "collected in" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range narrative:Collection ; + owl:inverseOf narrative:collects ; + rdfs:comment "Collection (trade paperback, omnibus) this is collected in" . + +################################################################# +# StoryExpression-Character Relationships +################################################################# + +narrative:features a owl:ObjectProperty ; + rdfs:label "features" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range narrative:Character ; + owl:inverseOf narrative:appearsIn ; + rdfs:comment "Character featured in this story/issue" . + +narrative:firstAppearance a owl:ObjectProperty ; + rdfs:label "first appearance" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range narrative:Character ; + rdfs:comment "Characters making first appearance" . + +################################################################# +# StoryExpression Relationships +################################################################# + +narrative:expressionOf a owl:ObjectProperty ; + rdfs:label "expression of" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range narrative:StoryWork ; + owl:inverseOf narrative:hasExpression ; + rdfs:comment "The StoryWork this is an expression of" . + +narrative:hasNarrativeUnit a owl:ObjectProperty ; + rdfs:label "has narrative unit" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range narrative:NarrativeUnit ; + owl:inverseOf narrative:narrativeUnitOf ; + rdfs:comment "Narrative units (stories) within this expression" . + +narrative:partOfArc a owl:ObjectProperty ; + rdfs:label "part of arc" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range narrative:Arc ; + owl:inverseOf narrative:includesIssue ; + rdfs:comment "Story arc this issue is part of" . + +narrative:partOfEvent a owl:ObjectProperty ; + rdfs:label "part of event" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range narrative:Event ; + owl:inverseOf narrative:includesIssue ; + rdfs:comment "Crossover event this issue is part of" . + +narrative:partOfSeason a owl:ObjectProperty ; + rdfs:label "part of season" ; + rdfs:domain narrative:StoryExpression ; + rdfs:range narrative:Season ; + owl:inverseOf narrative:includesEpisode ; + rdfs:comment "Season this episode is part of" . + +################################################################# +# NarrativeUnit Properties +################################################################# + +narrative:unitType a owl:DatatypeProperty ; + rdfs:label "unit type" ; + rdfs:domain narrative:NarrativeUnit ; + rdfs:range xsd:string ; + rdfs:comment "Type of narrative unit: issue, chapter, episode, film, track, quest" . + +################################################################# +# Arc Properties +################################################################# + +narrative:arcName a owl:DatatypeProperty ; + rdfs:label "arc name" ; + rdfs:domain narrative:Arc ; + rdfs:range xsd:string ; + rdfs:comment "Name of the story arc" . + +narrative:arcNumber a owl:DatatypeProperty ; + rdfs:label "arc number" ; + rdfs:domain narrative:Arc ; + rdfs:range xsd:int ; + rdfs:comment "Arc number in series" . + +narrative:issueCount a owl:DatatypeProperty ; + rdfs:label "issue count" ; + rdfs:domain narrative:Arc ; + rdfs:range xsd:int ; + rdfs:comment "Number of issues in arc" . + +narrative:description a owl:DatatypeProperty ; + rdfs:label "description" ; + rdfs:domain narrative:Arc ; + rdfs:range xsd:string ; + rdfs:comment "Arc description" . + +narrative:arcStartDate a owl:DatatypeProperty ; + rdfs:label "arc start date" ; + rdfs:domain narrative:Arc ; + rdfs:range xsd:date ; + rdfs:comment "Date when arc began publication" . + +narrative:arcEndDate a owl:DatatypeProperty ; + rdfs:label "arc end date" ; + rdfs:domain narrative:Arc ; + rdfs:range xsd:date ; + rdfs:comment "Date when arc concluded publication" . + +narrative:includesIssue a owl:ObjectProperty ; + rdfs:label "includes issue" ; + rdfs:domain narrative:Arc ; + rdfs:range narrative:StoryExpression ; + owl:inverseOf narrative:partOfArc ; + rdfs:comment "Issues that are part of this arc" . + +narrative:arcOf a owl:ObjectProperty ; + rdfs:label "arc of" ; + rdfs:domain narrative:Arc ; + rdfs:range narrative:StoryWork ; + rdfs:comment "Series this arc belongs to" . + +################################################################# +# Event Properties +################################################################# + +narrative:eventName a owl:DatatypeProperty ; + rdfs:label "event name" ; + rdfs:domain narrative:Event ; + rdfs:range xsd:string ; + rdfs:comment "Name of the crossover event" . + +narrative:yearOccurred a owl:DatatypeProperty ; + rdfs:label "year occurred" ; + rdfs:domain narrative:Event ; + rdfs:range xsd:int ; + rdfs:comment "Year event took place" . + +narrative:description a owl:DatatypeProperty ; + rdfs:label "description" ; + rdfs:domain narrative:Event ; + rdfs:range xsd:string ; + rdfs:comment "Event description" . + +narrative:includesIssue a owl:ObjectProperty ; + rdfs:label "includes issue" ; + rdfs:domain narrative:Event ; + rdfs:range narrative:StoryExpression ; + owl:inverseOf narrative:partOfEvent ; + rdfs:comment "Issues that are part of this event" . + +narrative:affectsSeries a owl:ObjectProperty ; + rdfs:label "affects series" ; + rdfs:domain narrative:Event ; + rdfs:range narrative:StoryWork ; + rdfs:comment "Series affected by this event" . + +################################################################# +# Season Properties +################################################################# + +narrative:seasonName a owl:DatatypeProperty ; + rdfs:label "season name" ; + rdfs:domain narrative:Season ; + rdfs:range xsd:string ; + rdfs:comment "Name of the season" . + +narrative:seasonNumber a owl:DatatypeProperty ; + rdfs:label "season number" ; + rdfs:domain narrative:Season ; + rdfs:range xsd:int ; + rdfs:comment "Season number" . + +narrative:episodeCount a owl:DatatypeProperty ; + rdfs:label "episode count" ; + rdfs:domain narrative:Season ; + rdfs:range xsd:int ; + rdfs:comment "Number of episodes in season" . + +narrative:airDateStart a owl:DatatypeProperty ; + rdfs:label "air date start" ; + rdfs:domain narrative:Season ; + rdfs:range xsd:date ; + rdfs:comment "Season premiere date" . + +narrative:airDateEnd a owl:DatatypeProperty ; + rdfs:label "air date end" ; + rdfs:domain narrative:Season ; + rdfs:range xsd:date ; + rdfs:comment "Season finale date" . + +narrative:includesEpisode a owl:ObjectProperty ; + rdfs:label "includes episode" ; + rdfs:domain narrative:Season ; + rdfs:range narrative:StoryExpression ; + owl:inverseOf narrative:partOfSeason ; + rdfs:comment "Episodes in this season" . + +narrative:seasonOf a owl:ObjectProperty ; + rdfs:label "season of" ; + rdfs:domain narrative:Season ; + rdfs:range narrative:Series ; + owl:inverseOf narrative:hasSeason ; + rdfs:comment "Series this season belongs to" . + +################################################################# +# Series Properties (for multi-season shows) +################################################################# + +narrative:seriesName a owl:DatatypeProperty ; + rdfs:label "series name" ; + rdfs:domain narrative:Series ; + rdfs:range xsd:string ; + rdfs:comment "Name of the TV/anime series" . + +narrative:hasSeason a owl:ObjectProperty ; + rdfs:label "has season" ; + rdfs:domain narrative:Series ; + rdfs:range narrative:Season ; + owl:inverseOf narrative:seasonOf ; + rdfs:comment "Seasons of this series" . + +################################################################# +# Collection Properties +################################################################# + +narrative:collectionTitle a owl:DatatypeProperty ; + rdfs:label "collection title" ; + rdfs:domain narrative:Collection ; + rdfs:range xsd:string ; + rdfs:comment "Title of the collection (trade paperback, box set, etc.)" . + +narrative:collectionType a owl:DatatypeProperty ; + rdfs:label "collection type" ; + rdfs:domain narrative:Collection ; + rdfs:range xsd:string ; + rdfs:comment "Trade Paperback, Hardcover, Omnibus, Box Set, etc." . + +narrative:collects a owl:ObjectProperty ; + rdfs:label "collects" ; + rdfs:domain narrative:Collection ; + rdfs:range narrative:StoryExpression ; + owl:inverseOf narrative:collectedIn ; + rdfs:comment "Issues/episodes collected in this collection" . + +################################################################# +# Page Properties (for page-level tracking) +################################################################# + +narrative:pageNumber a owl:DatatypeProperty ; + rdfs:label "page number" ; + rdfs:domain narrative:Page ; + rdfs:range xsd:int ; + rdfs:comment "Page number within issue" . + +narrative:pageType a owl:DatatypeProperty ; + rdfs:label "page type" ; + rdfs:domain narrative:Page ; + rdfs:range xsd:string ; + rdfs:comment "Story, Cover, Ad, Editorial, Letters, Pinup, etc." . + +narrative:imageUrl a owl:DatatypeProperty ; + rdfs:label "image URL" ; + rdfs:domain narrative:Page ; + rdfs:range xsd:anyURI ; + rdfs:comment "URL to page image" . + +narrative:pageOf a owl:ObjectProperty ; + rdfs:label "page of" ; + rdfs:domain narrative:Page ; + rdfs:range narrative:StoryExpression ; + rdfs:comment "Issue this page belongs to" . + +################################################################# +# Interactive Experiences (games, visual novels, VR, etc.) +################################################################# + +narrative:InteractiveExperience + a owl:Class ; + rdfs:label "Interactive Experience" ; + rdfs:comment """ + A specific interactive realization of a story, such as a video game, + visual novel, interactive film, VR experience, or interactive episode. + This is a specialization of StoryExpression for interactive media. + """ ; + rdfs:subClassOf narrative:StoryExpression +. + +narrative:Platform + a owl:Class ; + rdfs:label "Platform" ; + rdfs:comment """ + Hardware or software environment where an InteractiveExperience can be played + or accessed (e.g., PC, PS5, Nintendo Switch, iOS, Android, Web, VR headset). + """ +. + +### Datatype properties for InteractiveExperience ################################ + +narrative:interactionMode + a owl:DatatypeProperty ; + rdfs:label "interaction mode" ; + rdfs:comment """ + High-level play mode of the interactive experience, e.g.: + 'single-player', 'local-coop', 'online-coop', 'mmo', 'pvp', 'party-game'. + """ ; + rdfs:domain narrative:InteractiveExperience ; + rdfs:range xsd:string +. + +narrative:supportedInputType + a owl:DatatypeProperty ; + rdfs:label "supported input type" ; + rdfs:comment """ + Input modalities supported by this interactive experience, e.g.: + 'controller', 'keyboard-mouse', 'touch', 'motion', 'vr-controller'. + May be repeated multiple times for a single experience. + """ ; + rdfs:domain narrative:InteractiveExperience ; + rdfs:range xsd:string +. + +narrative:onlineRequirement + a owl:DatatypeProperty ; + rdfs:label "online requirement" ; + rdfs:comment """ + Requirement for network connectivity, e.g.: + 'offline', 'optional-online', 'online-required'. + """ ; + rdfs:domain narrative:InteractiveExperience ; + rdfs:range xsd:string +. + +narrative:averageSessionLengthMinutes + a owl:DatatypeProperty ; + rdfs:label "average session length (minutes)" ; + rdfs:comment """ + Typical length of a single play session, in minutes. + Useful for discovery ('short cozy game' vs 'long epic'). + """ ; + rdfs:domain narrative:InteractiveExperience ; + rdfs:range xsd:integer +. + +narrative:branchingStructure + a owl:DatatypeProperty ; + rdfs:label "branching structure" ; + rdfs:comment """ + Overall structure of the interactive narrative, e.g.: + 'linear', 'branching', 'sandbox', 'roguelike-run'. + """ ; + rdfs:domain narrative:InteractiveExperience ; + rdfs:range xsd:string +. + +### Object properties for InteractiveExperience ################################## + +narrative:supportsPlatform + a owl:ObjectProperty ; + rdfs:label "supports platform" ; + rdfs:comment """ + Indicates that an InteractiveExperience is available on a given Platform + (e.g., PC, PS5, Nintendo Switch, iOS). + """ ; + rdfs:domain narrative:InteractiveExperience ; + rdfs:range narrative:Platform +. + +################################################################# +# Audio / Music / Podcast refinements (optional, light) +################################################################# + +narrative:AudioExpression + a owl:Class ; + rdfs:label "Audio Expression" ; + rdfs:comment """ + A StoryExpression that primarily consists of audio content, + such as an album, soundtrack, single, EP, or podcast series. + """ ; + rdfs:subClassOf narrative:StoryExpression +. + +narrative:AudioUnit + a owl:Class ; + rdfs:label "Audio Unit" ; + rdfs:comment """ + A NarrativeUnit that represents a track or audio episode + (e.g., music track, podcast episode). + """ ; + rdfs:subClassOf narrative:NarrativeUnit +. + +narrative:expressionForm + a owl:DatatypeProperty ; + rdfs:label "expression form" ; + rdfs:comment """ + Refinement of a StoryExpression's form, e.g.: + 'album', 'single', 'ep', 'soundtrack', 'compilation', 'podcast-series', + 'tv-season', 'film', etc. + """ ; + rdfs:domain narrative:StoryExpression ; + rdfs:range xsd:string +. + +################################################################# +# Live Events (concerts, conventions, signings, esports, etc.) +################################################################# + +narrative:LiveEvent + a owl:Class ; + rdfs:label "Live Event" ; + rdfs:comment """ + A real-world event where fans consume, celebrate, or interact with + pop culture in time and space: concerts, conventions, signings, premieres, + screenings, festivals, esports tournaments, fan meets, etc. + """ +. + +narrative:Concert + a owl:Class ; + rdfs:label "Concert" ; + rdfs:comment "A LiveEvent focused on live music performance." ; + rdfs:subClassOf narrative:LiveEvent +. + +narrative:Convention + a owl:Class ; + rdfs:label "Convention" ; + rdfs:comment "A LiveEvent such as a comic, pop culture, or gaming convention." ; + rdfs:subClassOf narrative:LiveEvent +. + +narrative:SigningEvent + a owl:Class ; + rdfs:label "Signing Event" ; + rdfs:comment "A LiveEvent where creators, performers, or guests sign items for fans." ; + rdfs:subClassOf narrative:LiveEvent +. + +narrative:PremiereEvent + a owl:Class ; + rdfs:label "Premiere Event" ; + rdfs:comment "A LiveEvent for the premiere or first screening of a film, episode, or game." ; + rdfs:subClassOf narrative:LiveEvent +. + +narrative:EsportsTournament + a owl:Class ; + rdfs:label "Esports Tournament" ; + rdfs:comment "A LiveEvent representing an esports or competitive gaming tournament." ; + rdfs:subClassOf narrative:LiveEvent +. + +narrative:TourOrSeries + a owl:Class ; + rdfs:label "Tour or Event Series" ; + rdfs:comment """ + A grouping of LiveEvents that are part of a tour, festival series, + convention series, or esports league season. + """ +. + +### Datatype properties for LiveEvent ########################################### + +narrative:liveEventName + a owl:DatatypeProperty ; + rdfs:label "live event name" ; + rdfs:comment "Human-readable name of the live event (e.g., 'NYCC 2025', 'World Tour 2026 – Toronto')." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:string +. + +narrative:liveEventType + a owl:DatatypeProperty ; + rdfs:label "live event type" ; + rdfs:comment """ + High-level event type for filtering and analytics, e.g.: + 'concert', 'convention', 'signing', 'premiere', 'screening', + 'festival', 'esports-tournament', 'fan-meet'. + """ ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:string +. + +narrative:startDateTime + a owl:DatatypeProperty ; + rdfs:label "start date/time" ; + rdfs:comment "Start date and time of the live event (ISO 8601)." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:dateTime +. + +narrative:endDateTime + a owl:DatatypeProperty ; + rdfs:label "end date/time" ; + rdfs:comment "End date and time of the live event (ISO 8601)." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:dateTime +. + +narrative:venueName + a owl:DatatypeProperty ; + rdfs:label "venue name" ; + rdfs:comment "Name of the venue where the live event takes place." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:string +. + +narrative:eventCity + a owl:DatatypeProperty ; + rdfs:label "event city" ; + rdfs:comment "City where the live event takes place." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:string +. + +narrative:eventCountry + a owl:DatatypeProperty ; + rdfs:label "event country" ; + rdfs:comment "Country where the live event takes place (e.g., 'CA', 'US', 'JP')." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:string +. + +narrative:venueCapacity + a owl:DatatypeProperty ; + rdfs:label "venue capacity" ; + rdfs:comment "Approximate capacity of the venue where the event is held." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:integer +. + +narrative:estimatedAttendance + a owl:DatatypeProperty ; + rdfs:label "estimated attendance" ; + rdfs:comment "Estimated number of attendees for the live event." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:integer +. + +narrative:soldOut + a owl:DatatypeProperty ; + rdfs:label "sold out" ; + rdfs:comment "Boolean flag indicating whether the event was sold out." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range xsd:boolean +. + +### Object properties linking LiveEvent to works/franchises ##################### + +narrative:belongsToEventSeries + a owl:ObjectProperty ; + rdfs:label "belongs to event series" ; + rdfs:comment "Links a LiveEvent to a TourOrSeries it is part of." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range narrative:TourOrSeries +. + +narrative:promotesWork + a owl:ObjectProperty ; + rdfs:label "promotes work" ; + rdfs:comment """ + Indicates that a LiveEvent is primarily focused on promoting or + celebrating a particular StoryWork or StoryExpression + (e.g., a movie premiere, a game launch event). + """ ; + rdfs:domain narrative:LiveEvent ; + rdfs:range narrative:StoryWork +. + +narrative:focusesOnFranchise + a owl:ObjectProperty ; + rdfs:label "focuses on franchise" ; + rdfs:comment "Indicates that a LiveEvent is centered on a particular Franchise or Universe." ; + rdfs:domain narrative:LiveEvent ; + rdfs:range narrative:Franchise +. + +################################################################# +# Adaptation and cross-media relationships between StoryWorks +################################################################# + +### Generic adaptation ########################################################## + +narrative:adaptationOf + a owl:ObjectProperty ; + rdfs:label "adaptation of" ; + rdfs:comment """ + Indicates that a StoryWork is an adaptation of another StoryWork. + Examples: a film adapted from a comic series, an anime adapted from a manga, + a game adapted from a novel. + The subject is the adapted work; the object is the original work. + """ ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork +. + +narrative:hasAdaptation + a owl:ObjectProperty ; + rdfs:label "has adaptation" ; + rdfs:comment """ + Inverse of adaptationOf. Indicates that a StoryWork has one or more + adaptations in other media or forms. + """ ; + owl:inverseOf narrative:adaptationOf ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork +. + +### Common specialization: novelization, remake, reboot, spin-off ############### + +narrative:novelizationOf + a owl:ObjectProperty ; + rdfs:label "novelization of" ; + rdfs:comment """ + Indicates that a StoryWork is a novelization of another StoryWork + (often a film, game, or series). + The subject is the novelization; the object is the original work. + """ ; + rdfs:subPropertyOf narrative:adaptationOf ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork +. + +narrative:remakeOf + a owl:ObjectProperty ; + rdfs:label "remake of" ; + rdfs:comment """ + Indicates that a StoryWork is a remake of another StoryWork, often + in the same medium (e.g., film-to-film, game-to-game). + """ ; + rdfs:subPropertyOf narrative:adaptationOf ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork +. + +narrative:rebootOf + a owl:ObjectProperty ; + rdfs:label "reboot of" ; + rdfs:comment """ + Indicates that a StoryWork is a reboot of another StoryWork or franchise, + typically resetting continuity while reusing characters or core ideas. + """ ; + rdfs:subPropertyOf narrative:adaptationOf ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork +. + +narrative:spinOffOf + a owl:ObjectProperty ; + rdfs:label "spin-off of" ; + rdfs:comment """ + Indicates that a StoryWork is a spin-off from another StoryWork, + usually focusing on side characters, a particular team, or a different + part of the same universe. + """ ; + rdfs:subPropertyOf narrative:adaptationOf ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork +. + +### Crossovers and mutual relationships ######################################### + +narrative:crossoverWith + a owl:ObjectProperty , owl:SymmetricProperty ; + rdfs:label "crossover with" ; + rdfs:comment """ + Indicates that two StoryWorks participate in a crossover story + (e.g., an event that uses casts from multiple series). + This property is symmetric. + """ ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork +. \ No newline at end of file diff --git a/infra/qlever/data/ttl/07-product-manifestation.ttl b/infra/qlever/data/ttl/07-product-manifestation.ttl new file mode 100644 index 0000000..51c6d29 --- /dev/null +++ b/infra/qlever/data/ttl/07-product-manifestation.ttl @@ -0,0 +1,886 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Product and Manifestation Module +# Product → Manifestation → Item hierarchy for physical/digital goods +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Product Module" ; + rdfs:comment "Properties for products, manifestations, and items" ; + owl:imports . + +################################################################# +# Product→Manifestation→Item Relationships +################################################################# + +narrative:hasProduct a owl:ObjectProperty ; + rdfs:label "has product" ; + rdfs:domain narrative:NarrativeUnit ; + rdfs:range narrative:Product ; + owl:inverseOf narrative:productOf ; + rdfs:comment "Product realization of this narrative unit" . + +narrative:productOf a owl:ObjectProperty ; + rdfs:label "product of" ; + rdfs:domain narrative:Product ; + rdfs:range narrative:NarrativeUnit ; + owl:inverseOf narrative:hasProduct ; + rdfs:comment "Narrative unit this product realizes" . + +narrative:hasManifestation a owl:ObjectProperty ; + rdfs:label "has manifestation" ; + rdfs:domain narrative:Product ; + rdfs:range narrative:Manifestation ; + owl:inverseOf narrative:manifestationOf ; + rdfs:comment "Specific printing or release of this product" . + +narrative:manifestationOf a owl:ObjectProperty ; + rdfs:label "manifestation of" ; + rdfs:domain narrative:Manifestation ; + rdfs:range narrative:Product ; + owl:inverseOf narrative:hasManifestation ; + rdfs:comment "Product this is a manifestation of" . + +narrative:hasItem a owl:ObjectProperty ; + rdfs:label "has item" ; + rdfs:domain narrative:Manifestation ; + rdfs:range narrative:Item ; + owl:inverseOf narrative:itemOf ; + rdfs:comment "Individual copy of this manifestation" . + +narrative:itemOf a owl:ObjectProperty ; + rdfs:label "item of" ; + rdfs:domain narrative:Item ; + rdfs:range narrative:Manifestation ; + owl:inverseOf narrative:hasItem ; + rdfs:comment "Manifestation this item is a copy of" . + +################################################################# +# Product Properties +################################################################# + +narrative:productTitle a owl:DatatypeProperty ; + rdfs:label "product title" ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string ; + rdfs:comment "Product title" . + +narrative:productType a owl:DatatypeProperty ; + rdfs:label "product type" ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string ; + rdfs:comment "Single Issue, Trade Paperback, Hardcover, Digital, Blu-ray, etc." . + +narrative:format a owl:DatatypeProperty ; + rdfs:label "format" ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string ; + rdfs:comment "Physical, Digital, Streaming, etc." . + +narrative:description a owl:DatatypeProperty ; + rdfs:label "description" ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string ; + rdfs:comment "Product description" . + +narrative:coverImage a owl:DatatypeProperty ; + rdfs:label "cover image" ; + rdfs:domain narrative:Product ; + rdfs:range xsd:anyURI ; + rdfs:comment "Product cover/thumbnail image URL" . + +################################################################# +# Product Publishing Relationships +################################################################# + +narrative:publishedBy a owl:ObjectProperty ; + rdfs:label "published by" ; + rdfs:domain narrative:Product ; + rdfs:range narrative:Org ; + rdfs:comment "Publisher of this product" . + +narrative:distributedBy a owl:ObjectProperty ; + rdfs:label "distributed by" ; + rdfs:domain narrative:Product ; + rdfs:range narrative:Org ; + owl:inverseOf narrative:distributes ; + rdfs:comment "Distributor of this product" . + +narrative:printedBy a owl:ObjectProperty ; + rdfs:label "printed by" ; + rdfs:domain narrative:Product ; + rdfs:range narrative:Org ; + rdfs:comment "Printer of this product" . + +################################################################# +# Manifestation Properties +################################################################# + +narrative:manifestationType a owl:DatatypeProperty ; + rdfs:label "manifestation type" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "First Printing, Second Printing, Variant Cover, Director's Cut, etc." . + +narrative:variantType a owl:DatatypeProperty ; + rdfs:label "variant type" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Standard, Variant Cover, Incentive, Sketch, Black & White, etc." . + +narrative:printRun a owl:DatatypeProperty ; + rdfs:label "print run" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:int ; + rdfs:comment "Number of copies printed" . + +narrative:printingNumber a owl:DatatypeProperty ; + rdfs:label "printing number" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:int ; + rdfs:comment "Which printing (1st, 2nd, 3rd, etc.)" . + +narrative:releaseDate a owl:DatatypeProperty ; + rdfs:label "release date" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:date ; + rdfs:comment "Release date of this manifestation" . + +narrative:coverImage a owl:DatatypeProperty ; + rdfs:label "cover image" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:anyURI ; + rdfs:comment "Cover image for this specific manifestation" . + +################################################################# +# Manifestation Physical Properties +################################################################# + +narrative:dimensions a owl:DatatypeProperty ; + rdfs:label "dimensions" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Physical dimensions (e.g., '6.625 x 10.187 inches')" . + +narrative:weight a owl:DatatypeProperty ; + rdfs:label "weight" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Weight of physical item" . + +narrative:binding a owl:DatatypeProperty ; + rdfs:label "binding" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Paperback, Hardcover, Saddle-stitched, Perfect-bound, etc." . + +narrative:paperQuality a owl:DatatypeProperty ; + rdfs:label "paper quality" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Newsprint, Glossy, Matte, Archival, etc." . + +narrative:coverStock a owl:DatatypeProperty ; + rdfs:label "cover stock" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Cover material and finish (glossy cardstock, matte, foil, etc.)" . + +narrative:printingProcess a owl:DatatypeProperty ; + rdfs:label "printing process" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Printing method: Offset, Digital, Letterpress, etc." . + +narrative:printDate a owl:DatatypeProperty ; + rdfs:label "print date" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:date ; + rdfs:comment "Date this printing was produced" . + +narrative:reprinted a owl:DatatypeProperty ; + rdfs:label "reprinted" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether this is a reprint" . + +narrative:reprintOf a owl:ObjectProperty ; + rdfs:label "reprint of" ; + rdfs:domain narrative:Manifestation ; + rdfs:range narrative:Manifestation ; + rdfs:comment "Original manifestation this is a reprint of" . + +narrative:specialFeatures a owl:DatatypeProperty ; + rdfs:label "special features" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Sketch pages, interviews, behind-the-scenes extras included" . + +narrative:restricted a owl:DatatypeProperty ; + rdfs:label "restricted" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:boolean ; + rdfs:comment "Convention exclusive, limited distribution, retailer exclusive, etc." . + +narrative:coverArtist a owl:ObjectProperty ; + rdfs:label "cover artist" ; + rdfs:domain narrative:Manifestation ; + rdfs:range narrative:Person ; + rdfs:comment "Artist who created the cover for this manifestation" . + +################################################################# +# Manifestation Digital Properties +################################################################# + +narrative:fileFormat a owl:DatatypeProperty ; + rdfs:label "file format" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "PDF, CBZ, CBR, EPUB, MP4, etc." . + +narrative:fileSize a owl:DatatypeProperty ; + rdfs:label "file size" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:long ; + rdfs:comment "File size in bytes" . + +narrative:resolution a owl:DatatypeProperty ; + rdfs:label "resolution" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Resolution or quality (1080p, 4K, HD, etc.)" . + +narrative:drm a owl:DatatypeProperty ; + rdfs:label "DRM" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether digital manifestation has DRM" . + +################################################################# +# Manifestation Identifiers +################################################################# + +narrative:isbn a owl:DatatypeProperty ; + rdfs:label "ISBN" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "International Standard Book Number" . + +narrative:upc a owl:DatatypeProperty ; + rdfs:label "UPC" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Universal Product Code (barcode)" . + +narrative:ean a owl:DatatypeProperty ; + rdfs:label "EAN" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "European Article Number" . + +narrative:asin a owl:DatatypeProperty ; + rdfs:label "ASIN" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Amazon Standard Identification Number" . + +################################################################# +# Manifestation Pricing +################################################################# + +narrative:msrp a owl:DatatypeProperty ; + rdfs:label "MSRP" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:decimal ; + rdfs:comment "Manufacturer's Suggested Retail Price (original cover price)" . + +narrative:currentPrice a owl:DatatypeProperty ; + rdfs:label "current price" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:decimal ; + rdfs:comment "Current retail price" . + +narrative:currency a owl:DatatypeProperty ; + rdfs:label "currency" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Currency code (USD, EUR, JPY, etc.)" . + +################################################################# +# Item Properties (Individual Copies) +################################################################# + +narrative:itemIdentifier a owl:DatatypeProperty ; + rdfs:label "item identifier" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Unique identifier for this specific copy" . + +narrative:barcode a owl:DatatypeProperty ; + rdfs:label "barcode" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Library barcode or collection tracking number" . + +narrative:serialNumber a owl:DatatypeProperty ; + rdfs:label "serial number" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Serial number (for limited/numbered editions)" . + +narrative:editionNumber a owl:DatatypeProperty ; + rdfs:label "edition number" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Edition number (e.g., '24/500' for limited editions)" . + +################################################################# +# Item Ownership Properties +################################################################# + +narrative:owner a owl:ObjectProperty ; + rdfs:label "owner" ; + rdfs:domain narrative:Item ; + rdfs:range [ owl:unionOf (narrative:Person narrative:Org) ] ; + rdfs:comment "Owner of this specific copy" . + +narrative:location a owl:DatatypeProperty ; + rdfs:label "location" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Physical location (shelf, box, row, etc.)" . + +narrative:storageType a owl:DatatypeProperty ; + rdfs:label "storage type" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "How stored (long box, short box, bag+board, slab, etc.)" . + +################################################################# +# Item Condition Properties +################################################################# + +narrative:condition a owl:DatatypeProperty ; + rdfs:label "condition" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Condition description (CGC scale: Poor, Good, Fine, VF, NM, Mint)" . + +narrative:cgcGraded a owl:DatatypeProperty ; + rdfs:label "CGC graded" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether item is professionally graded by CGC/CBCS" . + +narrative:cgcGrade a owl:DatatypeProperty ; + rdfs:label "CGC grade" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Numeric grade (0.5 to 10.0) if CGC graded" . + +narrative:certificationNumber a owl:DatatypeProperty ; + rdfs:label "certification number" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "CGC/CBCS certification number" . + +narrative:defects a owl:DatatypeProperty ; + rdfs:label "defects" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Specific defects (spine stress, corner crease, water damage, etc.)" . + +narrative:restoration a owl:DatatypeProperty ; + rdfs:label "restoration" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Details of any restoration work performed" . + +################################################################# +# Item Signature & Provenance +################################################################# + +narrative:signed a owl:DatatypeProperty ; + rdfs:label "signed" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether the item is signed" . + +narrative:signedBy a owl:ObjectProperty ; + rdfs:label "signed by" ; + rdfs:domain narrative:Item ; + rdfs:range narrative:Person ; + rdfs:comment "Person(s) who signed this copy" . + +narrative:signatureLocation a owl:DatatypeProperty ; + rdfs:label "signature location" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Where signature appears (cover, interior, etc.)" . + +narrative:authenticated a owl:DatatypeProperty ; + rdfs:label "authenticated" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether signature is authenticated" . + +narrative:authenticator a owl:DatatypeProperty ; + rdfs:label "authenticator" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Organization that authenticated signature (CGC, CBCS, etc.)" . + +narrative:provenance a owl:DatatypeProperty ; + rdfs:label "provenance" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Ownership history and provenance" . + +################################################################# +# Item Acquisition & Valuation +################################################################# + +narrative:acquisitionDate a owl:DatatypeProperty ; + rdfs:label "acquisition date" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:date ; + rdfs:comment "Date item was acquired" . + +narrative:acquisitionPrice a owl:DatatypeProperty ; + rdfs:label "acquisition price" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Purchase price when acquired" . + +narrative:acquisitionSource a owl:DatatypeProperty ; + rdfs:label "acquisition source" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Where item was acquired (store, auction, trade, gift, etc.)" . + +narrative:currentValue a owl:DatatypeProperty ; + rdfs:label "current value" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Current estimated market value of this specific copy" . + +narrative:currentMarketPrice a owl:DatatypeProperty ; + rdfs:label "current market price" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Current market price for this condition/grade" . + +narrative:valuationDate a owl:DatatypeProperty ; + rdfs:label "valuation date" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:date ; + rdfs:comment "Date of most recent valuation" . + +narrative:insuredValue a owl:DatatypeProperty ; + rdfs:label "insured value" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Insured value for this item" . + +################################################################# +# Item Library/Circulation Properties +################################################################# + +narrative:circulationStatus a owl:DatatypeProperty ; + rdfs:label "circulation status" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Available, Checked Out, Reference Only, Lost, Damaged, etc." . + +narrative:checkedOutTo a owl:ObjectProperty ; + rdfs:label "checked out to" ; + rdfs:domain narrative:Item ; + rdfs:range narrative:Person ; + rdfs:comment "Person who currently has item checked out" . + +narrative:dueDate a owl:DatatypeProperty ; + rdfs:label "due date" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:date ; + rdfs:comment "Due date for return if checked out" . + +narrative:checkoutDate a owl:DatatypeProperty ; + rdfs:label "checkout date" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:date ; + rdfs:comment "Date item was checked out" . + +narrative:renewalCount a owl:DatatypeProperty ; + rdfs:label "renewal count" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:int ; + rdfs:comment "Number of times item has been renewed" . + +################################################################# +# Item Notes & Metadata +################################################################# + +narrative:itemNotes a owl:DatatypeProperty ; + rdfs:label "item notes" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Free-form notes about this specific copy" . + +narrative:personalRating a owl:DatatypeProperty ; + rdfs:label "personal rating" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Owner's personal rating of this item" . + +narrative:readStatus a owl:DatatypeProperty ; + rdfs:label "read status" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:string ; + rdfs:comment "Unread, Reading, Read, Re-reading, etc." . + +narrative:wishlist a owl:DatatypeProperty ; + rdfs:label "wishlist" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether item is on wishlist (for tracking wanted items)" . + +narrative:forSale a owl:DatatypeProperty ; + rdfs:label "for sale" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether owner is willing to sell" . + +narrative:askingPrice a owl:DatatypeProperty ; + rdfs:label "asking price" ; + rdfs:domain narrative:Item ; + rdfs:range xsd:decimal ; + rdfs:comment "Price owner is asking if for sale" . + + +################################################################# +# Product refinements for toys, figures, merch, board games, TCG +################################################################# + +### High-level product categorization ########################################### + +narrative:productCategory + a owl:DatatypeProperty ; + rdfs:label "product category" ; + rdfs:comment """ + High-level category of the product, e.g.: + 'comic', 'manga', 'webtoon', 'figure', 'statue', 'model-kit', 'plush', + 'poster', 'art-print', 'apparel', 'accessory', 'board-game', 'tcg', + 'video-game', 'soundtrack', 'album', 'film-release', etc. + """ ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string +. + +### Toy / collectible-specific metadata ######################################## + +narrative:toyCategory + a owl:DatatypeProperty ; + rdfs:label "toy category" ; + rdfs:comment """ + More specific type of toy or collectible, e.g.: + 'action-figure', 'chibi-figure', 'nendoroid', 'figma', 'statue', + 'bust', 'prop-replica', 'plush', 'model-kit'. + """ ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string +. + +narrative:scale + a owl:DatatypeProperty ; + rdfs:label "scale" ; + rdfs:comment """ + Scale of the item relative to real life, e.g.: + '1:4', '1:6', '1:12', '1:18', 'life-size'. + Stored as a string to preserve arbitrary notations. + """ ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string +. + +narrative:minRecommendedAge + a owl:DatatypeProperty ; + rdfs:label "minimum recommended age" ; + rdfs:comment "Minimum recommended age for use/play, in years." ; + rdfs:domain narrative:Product ; + rdfs:range xsd:integer +. + +narrative:maxRecommendedAge + a owl:DatatypeProperty ; + rdfs:label "maximum recommended age" ; + rdfs:comment "Optional maximum recommended age for use/play, in years." ; + rdfs:domain narrative:Product ; + rdfs:range xsd:integer +. + +narrative:safetyStandard + a owl:DatatypeProperty ; + rdfs:label "safety standard" ; + rdfs:comment """ + Safety standards or certifications applicable to the product, e.g.: + 'ASTM', 'CE', 'JP-ST', 'EN71', etc. + """ ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string +. + +narrative:chokingHazardWarning + a owl:DatatypeProperty ; + rdfs:label "choking hazard warning" ; + rdfs:comment "Boolean flag indicating whether the product carries a choking hazard warning." ; + rdfs:domain narrative:Product ; + rdfs:range xsd:boolean +. + +narrative:articulationPoints + a owl:DatatypeProperty ; + rdfs:label "articulation points" ; + rdfs:comment "Number of articulation points (joints) on an articulated figure/toy." ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:integer +. + +narrative:includesAccessories + a owl:DatatypeProperty ; + rdfs:label "includes accessories" ; + rdfs:comment """ + Description of accessories included with the manifestation, e.g.: + 'alternate-head', 'alternate-hands', 'weapons', 'stand', 'effect-parts'. + May be repeated multiple times for a single manifestation. + """ ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string +. + +################################################################# +# Board games / tabletop / TCG-specific metadata +################################################################# + +narrative:gameCategory + a owl:DatatypeProperty ; + rdfs:label "game category" ; + rdfs:comment """ + Category of a tabletop or physical game, e.g.: + 'board-game', 'tcg-booster', 'tcg-starter-deck', 'lcg-pack', + 'rpg-core-book', 'rpg-supplement', 'miniatures-game', 'party-game'. + """ ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string +. + +narrative:minPlayers + a owl:DatatypeProperty ; + rdfs:label "minimum players" ; + rdfs:comment "Minimum number of players recommended for the game." ; + rdfs:domain narrative:Product ; + rdfs:range xsd:integer +. + +narrative:maxPlayers + a owl:DatatypeProperty ; + rdfs:label "maximum players" ; + rdfs:comment "Maximum number of players recommended for the game." ; + rdfs:domain narrative:Product ; + rdfs:range xsd:integer +. + +narrative:averagePlayTimeMinutes + a owl:DatatypeProperty ; + rdfs:label "average play time (minutes)" ; + rdfs:comment "Typical play time for a single session, in minutes." ; + rdfs:domain narrative:Product ; + rdfs:range xsd:integer +. + +narrative:gameComplexity + a owl:DatatypeProperty ; + rdfs:label "game complexity" ; + rdfs:comment """ + Subjective complexity rating of the game, e.g.: + 'light', 'medium', 'heavy', or a numeric score mapped to such tiers. + """ ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string +. + +narrative:cooperative + a owl:DatatypeProperty ; + rdfs:label "cooperative" ; + rdfs:comment "Boolean flag indicating whether the game supports fully cooperative play." ; + rdfs:domain narrative:Product ; + rdfs:range xsd:boolean +. + +narrative:teamBased + a owl:DatatypeProperty ; + rdfs:label "team-based" ; + rdfs:comment "Boolean flag indicating whether the game supports or requires team-based play." ; + rdfs:domain narrative:Product ; + rdfs:range xsd:boolean +. + +################################################################# +# Video game / digital interactive product refinements +################################################################# + +narrative:editionType + a owl:DatatypeProperty ; + rdfs:label "edition type" ; + rdfs:comment """ + Edition or packaging type of a product, e.g.: + 'standard', 'deluxe', 'collector', 'goty', 'limited', 'steelbook'. + """ ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string +. + +narrative:platformCode + a owl:DatatypeProperty ; + rdfs:label "platform code" ; + rdfs:comment """ + Platform identifier for a particular Manifestation or Product, e.g.: + 'pc', 'steam', 'ps5', 'xbox-series', 'switch', 'ios', 'android'. + This is complementary to the Platform class used for InteractiveExperience. + """ ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string +. + +narrative:regionCode + a owl:DatatypeProperty ; + rdfs:label "region code" ; + rdfs:comment """ + Region code for a Manifestation, e.g.: + 'NA', 'EU', 'JP', or region-based SKU codes. + """ ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string +. + +narrative:requiresBaseProduct + a owl:ObjectProperty ; + rdfs:label "requires base product" ; + rdfs:comment """ + Indicates that a Product (e.g., DLC, expansion, season pass) + requires another base Product in order to be used. + """ ; + rdfs:domain narrative:Product ; + rdfs:range narrative:Product +. + +################################################################# +# COMET Distribution Properties (Comics Distributor System) +################################################################# + +narrative:focDate a owl:DatatypeProperty ; + rdfs:label "FOC date" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:date ; + rdfs:comment "Final Order Cutoff date for retailer orders" . + +narrative:imageUpdateDate a owl:DatatypeProperty ; + rdfs:label "image update date" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:date ; + rdfs:comment "Date when cover image was last updated in distribution system" . + +narrative:contentType a owl:DatatypeProperty ; + rdfs:label "content type" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Content type classification: Original, Collected, Digital First, Reprint, etc." . + +### Logistics & Shipping Properties + +narrative:unitWeight a owl:DatatypeProperty ; + rdfs:label "unit weight" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:decimal ; + rdfs:comment "Weight of a single unit (in ounces or grams as per system)" . + +narrative:caseWeight a owl:DatatypeProperty ; + rdfs:label "case weight" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:decimal ; + rdfs:comment "Weight of a full shipping case/carton" . + +narrative:caseLength a owl:DatatypeProperty ; + rdfs:label "case length" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:decimal ; + rdfs:comment "Length dimension of shipping case" . + +narrative:caseWidth a owl:DatatypeProperty ; + rdfs:label "case width" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:decimal ; + rdfs:comment "Width dimension of shipping case" . + +narrative:caseHeight a owl:DatatypeProperty ; + rdfs:label "case height" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:decimal ; + rdfs:comment "Height dimension of shipping case" . + +### Returns Policy Properties + +narrative:returnable a owl:DatatypeProperty ; + rdfs:label "returnable" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether the product is returnable to distributor" . + +narrative:returnType a owl:DatatypeProperty ; + rdfs:label "return type" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Return method: Affidavit, Strippable, Full Return, etc." . + +narrative:returnQualifier a owl:DatatypeProperty ; + rdfs:label "return qualifier" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Additional return policy qualifier or conditions" . + +narrative:returnPercent a owl:DatatypeProperty ; + rdfs:label "return percent" ; + rdfs:domain narrative:Manifestation ; + rdfs:range xsd:string ; + rdfs:comment "Percentage of order eligible for return" . + +################################################################# +# Linking manifestations/products to Live Events (exclusives) +################################################################# + +narrative:exclusiveAtEvent + a owl:ObjectProperty ; + rdfs:label "exclusive at event" ; + rdfs:comment """ + Indicates that a Manifestation is exclusive to a particular LiveEvent, + such as a convention-exclusive variant or tour-only merch item. + """ ; + rdfs:domain narrative:Manifestation ; + rdfs:range narrative:LiveEvent +. + +narrative:soldAtEvent + a owl:ObjectProperty ; + rdfs:label "sold at event" ; + rdfs:comment """ + Indicates that a Manifestation or Product is (or was) sold at a + particular LiveEvent (not necessarily exclusive). + """ ; + rdfs:domain narrative:Product ; + rdfs:range narrative:LiveEvent +. \ No newline at end of file diff --git a/infra/qlever/data/ttl/08-relationships.ttl b/infra/qlever/data/ttl/08-relationships.ttl new file mode 100644 index 0000000..e72a8ae --- /dev/null +++ b/infra/qlever/data/ttl/08-relationships.ttl @@ -0,0 +1,689 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Relationships Module +# Reified relationships between characters, people, and works +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Relationships Module" ; + rdfs:comment "Relationship classes for credits, portrayals, and character interactions" ; + owl:imports . + +################################################################# +# Credit Relationships (Person → Work) +################################################################# + +narrative:CreditRelationship a owl:Class ; + rdfs:subClassOf narrative:Relationship ; + rdfs:label "Credit Relationship" ; + rdfs:comment "Credit for creative contribution to a work" . + +narrative:hasCreditRelationship a owl:ObjectProperty ; + rdfs:label "has credit relationship" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:CreditRelationship ; + rdfs:comment "Person's credit relationship to a work" . + +narrative:creditsWork a owl:ObjectProperty ; + rdfs:label "credits work" ; + rdfs:domain narrative:CreditRelationship ; + rdfs:range narrative:StoryExpression ; + rdfs:comment "Work being credited" . + +narrative:creditRole a owl:ObjectProperty ; + rdfs:label "credit role" ; + rdfs:domain narrative:CreditRelationship ; + rdfs:range narrative:Role ; + rdfs:comment "Role performed (Writer, Penciller, Inker, etc.)" . + +narrative:creditYears a owl:DatatypeProperty ; + rdfs:label "credit years" ; + rdfs:domain narrative:CreditRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Years of contribution (e.g., '1962-1972')" . + +narrative:contractType a owl:DatatypeProperty ; + rdfs:label "contract type" ; + rdfs:domain narrative:CreditRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Work-for-hire, Creator-owned, etc." . + +narrative:uncredited a owl:DatatypeProperty ; + rdfs:label "uncredited" ; + rdfs:domain narrative:CreditRelationship ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether contribution was uncredited" . + +narrative:creditNote a owl:DatatypeProperty ; + rdfs:label "credit note" ; + rdfs:domain narrative:CreditRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Additional credit notes or context" . + +################################################################# +# Portrayal Relationships (Person → Character) +################################################################# + +narrative:PortrayalRelationship a owl:Class ; + rdfs:subClassOf narrative:Relationship ; + rdfs:label "Portrayal Relationship" ; + rdfs:comment "Actor or voice actor portraying a character" . + +narrative:hasPortrayalRelationship a owl:ObjectProperty ; + rdfs:label "has portrayal relationship" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:PortrayalRelationship ; + rdfs:comment "Person's portrayal of a character" . + +narrative:portraysCharacter a owl:ObjectProperty ; + rdfs:label "portrays character" ; + rdfs:domain narrative:PortrayalRelationship ; + rdfs:range narrative:Character ; + rdfs:comment "Character being portrayed" . + +narrative:portrayalMedium a owl:DatatypeProperty ; + rdfs:label "portrayal medium" ; + rdfs:domain narrative:PortrayalRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Film, TV, Animation, Video Game, etc." . + +narrative:portrayalStart a owl:DatatypeProperty ; + rdfs:label "portrayal start" ; + rdfs:domain narrative:PortrayalRelationship ; + rdfs:range xsd:date ; + rdfs:comment "When portrayal began" . + +narrative:portrayalEnd a owl:DatatypeProperty ; + rdfs:label "portrayal end" ; + rdfs:domain narrative:PortrayalRelationship ; + rdfs:range xsd:date ; + rdfs:comment "When portrayal ended (null = ongoing)" . + +narrative:billing a owl:DatatypeProperty ; + rdfs:label "billing" ; + rdfs:domain narrative:PortrayalRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Billing position or credit order" . + +narrative:castingType a owl:DatatypeProperty ; + rdfs:label "casting type" ; + rdfs:domain narrative:PortrayalRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Lead, Supporting, Cameo, Voice-only, etc." . + +narrative:awardNominations a owl:DatatypeProperty ; + rdfs:label "award nominations" ; + rdfs:domain narrative:PortrayalRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Awards won or nominated for this role" . + +################################################################# +# Worked With Relationships (Person ↔ Person Collaboration) +################################################################# + +narrative:WorkedWithRelationship a owl:Class ; + rdfs:subClassOf narrative:Relationship ; + rdfs:label "Worked With Relationship" ; + rdfs:comment "Professional collaboration between two people (e.g., writer-artist teams, recurring collaborators)" . + +narrative:hasWorkedWithRelationship a owl:ObjectProperty ; + rdfs:label "has worked with relationship" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:WorkedWithRelationship ; + rdfs:comment "Person's collaboration relationship with another person" . + +narrative:involvesPerson a owl:ObjectProperty ; + rdfs:label "involves person" ; + rdfs:domain narrative:WorkedWithRelationship ; + rdfs:range narrative:Person ; + rdfs:comment "Other person in this collaboration" . + +narrative:projectCount a owl:DatatypeProperty ; + rdfs:label "project count" ; + rdfs:domain narrative:WorkedWithRelationship ; + rdfs:range xsd:int ; + rdfs:comment "Number of projects collaborated on together" . + +narrative:collabStart a owl:DatatypeProperty ; + rdfs:label "collaboration start" ; + rdfs:domain narrative:WorkedWithRelationship ; + rdfs:range xsd:date ; + rdfs:comment "When collaboration began" . + +narrative:collabEnd a owl:DatatypeProperty ; + rdfs:label "collaboration end" ; + rdfs:domain narrative:WorkedWithRelationship ; + rdfs:range xsd:date ; + rdfs:comment "When collaboration ended (null = ongoing)" . + +narrative:collabNotes a owl:DatatypeProperty ; + rdfs:label "collaboration notes" ; + rdfs:domain narrative:WorkedWithRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Additional context about the collaboration" . + +################################################################# +# Character Relationships (Character ↔ Character) +################################################################# + +narrative:CharacterRelationship a owl:Class ; + rdfs:subClassOf narrative:Relationship ; + rdfs:label "Character Relationship" ; + rdfs:comment "Relationship between two characters" . + +narrative:hasCharacterRelationship a owl:ObjectProperty ; + rdfs:label "has character relationship" ; + rdfs:domain narrative:Character ; + rdfs:range narrative:CharacterRelationship ; + rdfs:comment "Character's relationship to another character" . + +narrative:involvesCharacter a owl:ObjectProperty ; + rdfs:label "involves character" ; + rdfs:domain narrative:CharacterRelationship ; + rdfs:range narrative:Character ; + rdfs:comment "Other character(s) in this relationship" . + +narrative:relationshipType a owl:DatatypeProperty ; + rdfs:label "relationship type" ; + rdfs:domain narrative:CharacterRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Type of relationship" . + +narrative:relationshipStatus a owl:DatatypeProperty ; + rdfs:label "relationship status" ; + rdfs:domain narrative:CharacterRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Current, Former, Complicated, etc." . + +narrative:relationshipStart a owl:DatatypeProperty ; + rdfs:label "relationship start" ; + rdfs:domain narrative:CharacterRelationship ; + rdfs:range xsd:date ; + rdfs:comment "When relationship began (in-universe)" . + +narrative:relationshipEnd a owl:DatatypeProperty ; + rdfs:label "relationship end" ; + rdfs:domain narrative:CharacterRelationship ; + rdfs:range xsd:date ; + rdfs:comment "When relationship ended (in-universe)" . + +narrative:relationshipNotes a owl:DatatypeProperty ; + rdfs:label "relationship notes" ; + rdfs:domain narrative:CharacterRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Additional context or notes" . + +################################################################# +# Family Relationships +################################################################# + +narrative:FamilyRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Family Relationship" ; + rdfs:comment "Family connection between characters" . + +narrative:ParentChild a owl:Class ; + rdfs:subClassOf narrative:FamilyRelationship ; + rdfs:label "Parent-Child" ; + rdfs:comment "Parent-child relationship" . + +narrative:Siblings a owl:Class ; + rdfs:subClassOf narrative:FamilyRelationship ; + rdfs:label "Siblings" ; + rdfs:comment "Sibling relationship" . + +narrative:MarriedCouple a owl:Class ; + rdfs:subClassOf narrative:FamilyRelationship ; + rdfs:label "Married Couple" ; + rdfs:comment "Married or partnered relationship" . + +narrative:ExtendedFamily a owl:Class ; + rdfs:subClassOf narrative:FamilyRelationship ; + rdfs:label "Extended Family" ; + rdfs:comment "Extended family (grandparent, aunt, uncle, cousin, etc.)" . + +narrative:biologicalRelation a owl:DatatypeProperty ; + rdfs:label "biological relation" ; + rdfs:domain narrative:FamilyRelationship ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether biological or adoptive/found family" . + +narrative:familyRole a owl:DatatypeProperty ; + rdfs:label "family role" ; + rdfs:domain narrative:FamilyRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Parent, Child, Sibling, Spouse, Grandparent, etc." . + +################################################################# +# Romantic Relationships +################################################################# + +narrative:RomanticRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Romantic Relationship" ; + rdfs:comment "Romantic involvement between characters" . + +narrative:LoveInterest a owl:Class ; + rdfs:subClassOf narrative:RomanticRelationship ; + rdfs:label "Love Interest" ; + rdfs:comment "One-sided or reciprocated romantic interest" . + +narrative:romanticStatus a owl:DatatypeProperty ; + rdfs:label "romantic status" ; + rdfs:domain narrative:RomanticRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Dating, Married, Former, Unrequited, Complicated, etc." . + +narrative:endgame a owl:DatatypeProperty ; + rdfs:label "endgame" ; + rdfs:domain narrative:RomanticRelationship ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether this is the canonical/endgame pairing" . + +################################################################# +# Friendship Relationships +################################################################# + +narrative:FriendshipRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Friendship Relationship" ; + rdfs:comment "Friendship between characters" . + +narrative:BestFriends a owl:Class ; + rdfs:subClassOf narrative:FriendshipRelationship ; + rdfs:label "Best Friends" ; + rdfs:comment "Best friend relationship" . + +narrative:Sidekick a owl:Class ; + rdfs:subClassOf narrative:FriendshipRelationship ; + rdfs:label "Sidekick" ; + rdfs:comment "Sidekick or junior partner relationship" . + +narrative:friendshipDepth a owl:DatatypeProperty ; + rdfs:label "friendship depth" ; + rdfs:domain narrative:FriendshipRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Casual, Close, Best Friends, etc." . + +################################################################# +# Alliance Relationships +################################################################# + +narrative:AllianceRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Alliance Relationship" ; + rdfs:comment "Alliance or partnership between characters" . + +narrative:Teammates a owl:Class ; + rdfs:subClassOf narrative:AllianceRelationship ; + rdfs:label "Teammates" ; + rdfs:comment "Members of the same team" . + +narrative:PoliticalAllies a owl:Class ; + rdfs:subClassOf narrative:AllianceRelationship ; + rdfs:label "Political Allies" ; + rdfs:comment "Political alliance or partnership" . + +narrative:allianceType a owl:DatatypeProperty ; + rdfs:label "alliance type" ; + rdfs:domain narrative:AllianceRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Permanent, Temporary, Uneasy, etc." . + +################################################################# +# Rivalry Relationships +################################################################# + +narrative:RivalryRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Rivalry Relationship" ; + rdfs:comment "Rivalry between characters" . + +narrative:Rivals a owl:Class ; + rdfs:subClassOf narrative:RivalryRelationship ; + rdfs:label "Rivals" ; + rdfs:comment "Competitive rivals" . + +narrative:Nemesis a owl:Class ; + rdfs:subClassOf narrative:RivalryRelationship ; + rdfs:label "Nemesis" ; + rdfs:comment "Arch-nemesis or arch-enemy" . + +narrative:rivalryIntensity a owl:DatatypeProperty ; + rdfs:label "rivalry intensity" ; + rdfs:domain narrative:RivalryRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Friendly Competition, Intense Rivalry, Arch-enemies, etc." . + +narrative:causedBy a owl:DatatypeProperty ; + rdfs:label "caused by" ; + rdfs:domain narrative:RivalryRelationship ; + rdfs:range xsd:string ; + rdfs:comment "What caused the rivalry" . + +################################################################# +# Enemy Relationships +################################################################# + +narrative:EnemyRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Enemy Relationship" ; + rdfs:comment "Hostile or antagonistic relationship" . + +narrative:ArchEnemy a owl:Class ; + rdfs:subClassOf narrative:EnemyRelationship ; + rdfs:label "Arch-Enemy" ; + rdfs:comment "Primary antagonist or arch-enemy" . + +narrative:hostilityLevel a owl:DatatypeProperty ; + rdfs:label "hostility level" ; + rdfs:domain narrative:EnemyRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Dislike, Hatred, Mortal Enemies, etc." . + +################################################################# +# Mentor Relationships +################################################################# + +narrative:MentorRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Mentor Relationship" ; + rdfs:comment "Mentor-student relationship" . + +narrative:mentorRole a owl:DatatypeProperty ; + rdfs:label "mentor role" ; + rdfs:domain narrative:MentorRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Teacher, Master, Guide, Coach, etc." . + +narrative:studentRole a owl:DatatypeProperty ; + rdfs:label "student role" ; + rdfs:domain narrative:MentorRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Student, Apprentice, Protégé, etc." . + +################################################################# +# Clone/Duplicate Relationships +################################################################# + +narrative:CloneRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Clone Relationship" ; + rdfs:comment "Clone or duplicate relationship" . + +narrative:cloneType a owl:DatatypeProperty ; + rdfs:label "clone type" ; + rdfs:domain narrative:CloneRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Genetic Clone, Magical Duplicate, Evil Twin, etc." . + +narrative:originalCharacter a owl:ObjectProperty ; + rdfs:label "original character" ; + rdfs:domain narrative:CloneRelationship ; + rdfs:range narrative:Character ; + rdfs:comment "Original character that was cloned" . + +################################################################# +# Temporal Relationships +################################################################# + +narrative:TemporalRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Temporal Relationship" ; + rdfs:comment "Relationship across time (future/past self, time travel)" . + +narrative:FutureSelf a owl:Class ; + rdfs:subClassOf narrative:TemporalRelationship ; + rdfs:label "Future Self" ; + rdfs:comment "Future version of character" . + +narrative:PastSelf a owl:Class ; + rdfs:subClassOf narrative:TemporalRelationship ; + rdfs:label "Past Self" ; + rdfs:comment "Past version of character" . + +narrative:temporalDirection a owl:DatatypeProperty ; + rdfs:label "temporal direction" ; + rdfs:domain narrative:TemporalRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Future, Past, Alternate Timeline, etc." . + +################################################################# +# Supernatural Relationships +################################################################# + +narrative:SupernaturalRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Supernatural Relationship" ; + rdfs:comment "Supernatural or mystical connection" . + +narrative:AlternateSelf a owl:Class ; + rdfs:subClassOf narrative:SupernaturalRelationship ; + rdfs:label "Alternate Self" ; + rdfs:comment "Alternate universe version" . + +narrative:Reincarnation a owl:Class ; + rdfs:subClassOf narrative:SupernaturalRelationship ; + rdfs:label "Reincarnation" ; + rdfs:comment "Reincarnation relationship" . + +narrative:SoulBond a owl:Class ; + rdfs:subClassOf narrative:SupernaturalRelationship ; + rdfs:label "Soul Bond" ; + rdfs:comment "Mystical soul bond or connection" . + +narrative:supernaturalType a owl:DatatypeProperty ; + rdfs:label "supernatural type" ; + rdfs:domain narrative:SupernaturalRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Type of supernatural connection" . + +################################################################# +# Predecessor Relationships (Mantle) +################################################################# + +narrative:PredecessorRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Predecessor Relationship" ; + rdfs:comment "Predecessor-successor relationship for mantles/titles" . + +narrative:mantleName a owl:DatatypeProperty ; + rdfs:label "mantle name" ; + rdfs:domain narrative:PredecessorRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Name of the mantle (Robin, Flash, Captain America, etc.)" . + +narrative:transitionType a owl:DatatypeProperty ; + rdfs:label "transition type" ; + rdfs:domain narrative:PredecessorRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Retirement, Death, Succession, Forced, etc." . + +################################################################# +# Employment Relationships (Character works for Character/Org) +################################################################# + +narrative:EmploymentRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Employment Relationship" ; + rdfs:comment "Character employed by another character or organization" . + +narrative:employerCharacter a owl:ObjectProperty ; + rdfs:label "employer character" ; + rdfs:domain narrative:EmploymentRelationship ; + rdfs:range narrative:Character ; + rdfs:comment "Character who is the employer" . + +narrative:jobTitle a owl:DatatypeProperty ; + rdfs:label "job title" ; + rdfs:domain narrative:EmploymentRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Job title or position" . + +################################################################# +# Traumatic Relationships +################################################################# + +narrative:TraumaticRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Traumatic Relationship" ; + rdfs:comment "Relationship defined by trauma or tragedy" . + +narrative:MurdererVictim a owl:Class ; + rdfs:subClassOf narrative:TraumaticRelationship ; + rdfs:label "Murderer-Victim" ; + rdfs:comment "Character killed another character" . + +narrative:traumaType a owl:DatatypeProperty ; + rdfs:label "trauma type" ; + rdfs:domain narrative:TraumaticRelationship ; + rdfs:range xsd:string ; + rdfs:comment "Type of traumatic event" . + +################################################################# +# Redemption Relationships +################################################################# + +narrative:RedemptionRelationship a owl:Class ; + rdfs:subClassOf narrative:CharacterRelationship ; + rdfs:label "Redemption Relationship" ; + rdfs:comment "Relationship involving redemption arc" . + +narrative:FormerVillain a owl:Class ; + rdfs:subClassOf narrative:RedemptionRelationship ; + rdfs:label "Former Villain" ; + rdfs:comment "Former villain now ally or friend" . + +narrative:redemptionStatus a owl:DatatypeProperty ; + rdfs:label "redemption status" ; + rdfs:domain narrative:RedemptionRelationship ; + rdfs:range xsd:string ; + rdfs:comment "In Progress, Redeemed, Failed, Complicated, etc." . + +################################################################# +# Team Membership Relationship +################################################################# + +narrative:TeamMembership a owl:Class ; + rdfs:subClassOf narrative:Relationship ; + rdfs:label "Team Membership" ; + rdfs:comment "Character's membership in a team with temporal tracking" . + +narrative:member a owl:ObjectProperty ; + rdfs:label "member" ; + rdfs:domain narrative:TeamMembership ; + rdfs:range narrative:Character ; + rdfs:comment "Character who is a member" . + +narrative:team a owl:ObjectProperty ; + rdfs:label "team" ; + rdfs:domain narrative:TeamMembership ; + rdfs:range narrative:Group ; + rdfs:comment "Team the character is a member of" . + +narrative:membershipStatus a owl:DatatypeProperty ; + rdfs:label "membership status" ; + rdfs:domain narrative:TeamMembership ; + rdfs:range xsd:string ; + rdfs:comment "Active, Former, Reserve, Honorary, etc." . + +narrative:joinedDate a owl:DatatypeProperty ; + rdfs:label "joined date" ; + rdfs:domain narrative:TeamMembership ; + rdfs:range xsd:date ; + rdfs:comment "When character joined team (in-universe)" . + +narrative:leftDate a owl:DatatypeProperty ; + rdfs:label "left date" ; + rdfs:domain narrative:TeamMembership ; + rdfs:range xsd:date ; + rdfs:comment "When character left team (in-universe)" . + +narrative:leadershipRole a owl:DatatypeProperty ; + rdfs:label "leadership role" ; + rdfs:domain narrative:TeamMembership ; + rdfs:range xsd:string ; + rdfs:comment "Leader, Co-Leader, Field Leader, etc." . + + +################################################################# +# Relationships involving Live Events +################################################################# + +### Who performs or appears at events ########################################### + +narrative:performsAtEvent + a owl:ObjectProperty ; + rdfs:label "performs at event" ; + rdfs:comment """ + Indicates that a Person performs at a LiveEvent, e.g.: + musicians at a concert, voice actors performing on stage, etc. + """ ; + rdfs:domain narrative:Person ; + rdfs:range narrative:LiveEvent +. + +narrative:appearsAtEvent + a owl:ObjectProperty ; + rdfs:label "appears at event" ; + rdfs:comment """ + Indicates that a Person appears at a LiveEvent, e.g.: + convention guest, panelist, signing guest. + """ ; + rdfs:domain narrative:Person ; + rdfs:range narrative:LiveEvent +. + +### Organizations hosting or organizing events ################################## + +narrative:hostsEvent + a owl:ObjectProperty ; + rdfs:label "hosts event" ; + rdfs:comment """ + Indicates that an Organization hosts, organizes, or presents + a LiveEvent (e.g., convention organizers, tour promoters, venues). + """ ; + rdfs:domain narrative:Organization ; + rdfs:range narrative:LiveEvent +. + +narrative:venueForEvent + a owl:ObjectProperty ; + rdfs:label "venue for event" ; + rdfs:comment """ + Indicates that an Organization (or specific venue entity) is the venue + where a LiveEvent takes place. + """ ; + rdfs:domain narrative:Organization ; + rdfs:range narrative:LiveEvent +. + +### Linking characters/franchises for discovery ################################ + +narrative:featuresCharacterAtEvent + a owl:ObjectProperty ; + rdfs:label "features character at event" ; + rdfs:comment """ + Indicates that a particular Character is prominently featured at a LiveEvent, + e.g., a character-themed concert, character meet-and-greet, or franchise panel. + """ ; + rdfs:domain narrative:LiveEvent ; + rdfs:range narrative:Character +. + +narrative:featuresFranchiseAtEvent + a owl:ObjectProperty ; + rdfs:label "features franchise at event" ; + rdfs:comment """ + Indicates that a particular Franchise or Universe is a core focus + of a LiveEvent. + """ ; + rdfs:domain narrative:LiveEvent ; + rdfs:range narrative:Franchise +. \ No newline at end of file diff --git a/infra/qlever/data/ttl/09-discovery-recommendation.ttl b/infra/qlever/data/ttl/09-discovery-recommendation.ttl new file mode 100644 index 0000000..e8ab34d --- /dev/null +++ b/infra/qlever/data/ttl/09-discovery-recommendation.ttl @@ -0,0 +1,473 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Discovery and Recommendation Module +# Genre, theme, tone, tags, user interactions, ranking features +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Discovery and Recommendation Module" ; + rdfs:comment "Content descriptors, user interactions, and recommendation features" ; + owl:imports . + +################################################################# +# Content Descriptor Classes +################################################################# + +narrative:Genre a owl:Class ; + rdfs:label "Genre" ; + rdfs:comment "High-level narrative genre (Superhero, Romance, Horror, Slice of Life, etc.)" . + +narrative:Theme a owl:Class ; + rdfs:label "Theme" ; + rdfs:comment "Thematic motifs or story DNA (Found Family, Revenge, Coming of Age, etc.)" . + +narrative:Tone a owl:Class ; + rdfs:label "Tone" ; + rdfs:comment "Overall emotional tone (Wholesome, Dark, Comedic, Melancholic, etc.)" . + +narrative:Tag a owl:Class ; + rdfs:label "Tag" ; + rdfs:comment "Flexible tagging for story facets, audience labels, or marketing categories" . + +narrative:Demographic a owl:Class ; + rdfs:label "Demographic" ; + rdfs:comment "Target demographic (Shonen, Seinen, Shoujo, Josei, Kids, Young Adult, Adult, etc.)" . + +narrative:ContentRating a owl:Class ; + rdfs:label "Content Rating" ; + rdfs:comment "Content rating system (MPAA, TV Rating, ESRB, CERO, etc.)" . + +narrative:ArtStyleClass a owl:Class ; + rdfs:label "Art Style Class" ; + rdfs:comment "Canonical art style cluster (Manga, Western Comic, Webtoon, Chibi, Realistic, etc.)" . + +narrative:FormatClass a owl:Class ; + rdfs:label "Format Class" ; + rdfs:comment "Canonical format cluster (Single Issue, Trade Paperback, Digital Chapter, etc.)" . + +################################################################# +# Content Descriptor Properties +################################################################# + +narrative:genreName a owl:DatatypeProperty ; + rdfs:label "genre name" ; + rdfs:domain narrative:Genre ; + rdfs:range xsd:string ; + rdfs:comment "Name of the genre" . + +narrative:genreDescription a owl:DatatypeProperty ; + rdfs:label "genre description" ; + rdfs:domain narrative:Genre ; + rdfs:range xsd:string ; + rdfs:comment "Description of the genre" . + +narrative:themeName a owl:DatatypeProperty ; + rdfs:label "theme name" ; + rdfs:domain narrative:Theme ; + rdfs:range xsd:string ; + rdfs:comment "Name of the theme" . + +narrative:themeDescription a owl:DatatypeProperty ; + rdfs:label "theme description" ; + rdfs:domain narrative:Theme ; + rdfs:range xsd:string ; + rdfs:comment "Description of the theme" . + +narrative:toneName a owl:DatatypeProperty ; + rdfs:label "tone name" ; + rdfs:domain narrative:Tone ; + rdfs:range xsd:string ; + rdfs:comment "Name of the tone" . + +narrative:toneDescription a owl:DatatypeProperty ; + rdfs:label "tone description" ; + rdfs:domain narrative:Tone ; + rdfs:range xsd:string ; + rdfs:comment "Description of the tone" . + +narrative:tagName a owl:DatatypeProperty ; + rdfs:label "tag name" ; + rdfs:domain narrative:Tag ; + rdfs:range xsd:string ; + rdfs:comment "Tag label" . + +narrative:tagCategory a owl:DatatypeProperty ; + rdfs:label "tag category" ; + rdfs:domain narrative:Tag ; + rdfs:range xsd:string ; + rdfs:comment "Tag category (Content Warning, Trope, Setting, etc.)" . + +################################################################# +# Story Descriptor Relationships +################################################################# + +narrative:hasGenre a owl:ObjectProperty ; + rdfs:label "has genre" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Genre ; + rdfs:comment "Associates a StoryWork with one or more genres" . + +narrative:hasTheme a owl:ObjectProperty ; + rdfs:label "has theme" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Theme ; + rdfs:comment "Associates a StoryWork with one or more themes" . + +narrative:hasTone a owl:ObjectProperty ; + rdfs:label "has tone" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Tone ; + rdfs:comment "Associates a StoryWork with a dominant tone" . + +narrative:hasTag a owl:ObjectProperty ; + rdfs:label "has tag" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Tag ; + rdfs:comment "Associates a StoryWork with flexible tags" . + +narrative:hasDemographic a owl:ObjectProperty ; + rdfs:label "has demographic" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Demographic ; + rdfs:comment "Target demographic for this work" . + +narrative:hasContentRating a owl:ObjectProperty ; + rdfs:label "has content rating" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:ContentRating ; + rdfs:comment "Content rating for this work" . + +################################################################# +# Art & Format Classifications +################################################################# + +narrative:hasArtStyleClass a owl:ObjectProperty ; + rdfs:label "has art style class" ; + rdfs:domain narrative:Artist ; + rdfs:range narrative:ArtStyleClass ; + rdfs:comment "Classifies an Artist into an art style cluster" . + +narrative:hasFormatClass a owl:ObjectProperty ; + rdfs:label "has format class" ; + rdfs:domain narrative:Manifestation ; + rdfs:range narrative:FormatClass ; + rdfs:comment "Classifies a Manifestation into a format cluster" . + +################################################################# +# User & Interaction Model +################################################################# + +narrative:User a owl:Class ; + rdfs:label "User" ; + rdfs:comment """ + End-user / reader account corresponding to Supabase auth.users + public.profiles. + Instances are created by sync processes and may carry external identifiers. + """ . + +narrative:UserStoryInteraction a owl:Class ; + rdfs:label "User Story Interaction" ; + rdfs:comment """ + Normalized interaction between a User and a StoryWork / StoryExpression. + Examples: read, completed, liked, rated, wishlisted, owned. + Derived from Supabase tables such as user_product_state, likes, reviews, + pull_list_items, collections, and other behavioral events. + """ . + +################################################################# +# User Properties +################################################################# + +narrative:username a owl:DatatypeProperty ; + rdfs:label "username" ; + rdfs:domain narrative:User ; + rdfs:range xsd:string ; + rdfs:comment "User's display name or username" . + +narrative:email a owl:DatatypeProperty ; + rdfs:label "email" ; + rdfs:domain narrative:User ; + rdfs:range xsd:string ; + rdfs:comment "User's email address" . + +narrative:joinDate a owl:DatatypeProperty ; + rdfs:label "join date" ; + rdfs:domain narrative:User ; + rdfs:range xsd:date ; + rdfs:comment "Date user joined platform" . + +narrative:avatar a owl:DatatypeProperty ; + rdfs:label "avatar" ; + rdfs:domain narrative:User ; + rdfs:range xsd:anyURI ; + rdfs:comment "User's avatar/profile image URL" . + +################################################################# +# User Interaction Core Links +################################################################# + +narrative:interactionUser a owl:ObjectProperty ; + rdfs:label "interaction user" ; + rdfs:domain narrative:UserStoryInteraction ; + rdfs:range narrative:User ; + rdfs:comment "The User who performed this interaction" . + +narrative:interactionTarget a owl:ObjectProperty ; + rdfs:label "interaction target work" ; + rdfs:domain narrative:UserStoryInteraction ; + rdfs:range narrative:StoryWork ; + rdfs:comment "The primary StoryWork to which this interaction refers" . + +narrative:interactionExpressionTarget a owl:ObjectProperty ; + rdfs:label "interaction target expression" ; + rdfs:domain narrative:UserStoryInteraction ; + rdfs:range narrative:StoryExpression ; + rdfs:comment "Optional issue-level target (StoryExpression) for per-issue reading history" . + +################################################################# +# User Interaction Attributes +################################################################# + +narrative:interactionType a owl:DatatypeProperty ; + rdfs:label "interaction type" ; + rdfs:domain narrative:UserStoryInteraction ; + rdfs:range xsd:string ; + rdfs:comment """ + Application-level interaction type. + Suggested values: 'view', 'read', 'completed', 'liked', 'rated', + 'wishlisted', 'owned', 'added_to_collection', 'pull_list'. + """ . + +narrative:interactionTimestamp a owl:DatatypeProperty ; + rdfs:label "interaction timestamp" ; + rdfs:domain narrative:UserStoryInteraction ; + rdfs:range xsd:dateTime ; + rdfs:comment "Timestamp at which the interaction occurred" . + +narrative:interactionRating a owl:DatatypeProperty ; + rdfs:label "interaction rating" ; + rdfs:domain narrative:UserStoryInteraction ; + rdfs:range xsd:decimal ; + rdfs:comment "Rating value (0–5 scale, app-defined) given as part of this interaction" . + +narrative:interactionProgressPercent a owl:DatatypeProperty ; + rdfs:label "interaction progress percent" ; + rdfs:domain narrative:UserStoryInteraction ; + rdfs:range xsd:decimal ; + rdfs:comment "Estimated completion percentage at time of interaction" . + +narrative:interactionNotes a owl:DatatypeProperty ; + rdfs:label "interaction notes" ; + rdfs:domain narrative:UserStoryInteraction ; + rdfs:range xsd:string ; + rdfs:comment "User notes or comments about this interaction" . + +################################################################# +# User Preference Hooks +################################################################# + +narrative:favoriteUniverse a owl:ObjectProperty ; + rdfs:label "favorite universe" ; + rdfs:domain narrative:User ; + rdfs:range narrative:Universe ; + rdfs:comment """ + Indicates that a Universe is a favorite for this User. + Derived from user_follows, collections, and ownership data. + """ . + +narrative:favoriteCharacter a owl:ObjectProperty ; + rdfs:label "favorite character" ; + rdfs:domain narrative:User ; + rdfs:range narrative:Character ; + rdfs:comment "User's favorite characters" . + +narrative:favoriteCreator a owl:ObjectProperty ; + rdfs:label "favorite creator" ; + rdfs:domain narrative:User ; + rdfs:range narrative:Person ; + rdfs:comment "User's favorite creators" . + +narrative:followsCreator a owl:ObjectProperty ; + rdfs:label "follows creator" ; + rdfs:domain narrative:User ; + rdfs:range narrative:Person ; + rdfs:comment "Creators the user follows" . + +narrative:followsPublisher a owl:ObjectProperty ; + rdfs:label "follows publisher" ; + rdfs:domain narrative:User ; + rdfs:range narrative:Org ; + rdfs:comment "Publishers the user follows" . + +################################################################# +# Story-Level Ranking Features +################################################################# + +narrative:popularityScore a owl:DatatypeProperty ; + rdfs:label "popularity score" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:float ; + rdfs:comment """ + Aggregate popularity score derived from reads, purchases, follows, likes, wishlist, etc. + Intended for medium- to long-term popularity ranking. + """ . + +narrative:trendingScore a owl:DatatypeProperty ; + rdfs:label "trending score" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:float ; + rdfs:comment """ + Short-term momentum score (e.g. last 7–30 days). + Used for 'Trending Now' style discovery lanes. + """ . + +narrative:completionRate a owl:DatatypeProperty ; + rdfs:label "completion rate" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:float ; + rdfs:comment """ + Estimated fraction of users who start and then complete this StoryWork. + Derived from interactionProgressPercent and user_product_state consumption data. + """ . + +narrative:engagementScore a owl:DatatypeProperty ; + rdfs:label "engagement score" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:float ; + rdfs:comment """ + Model-computed engagement measure combining reading dwell time, repeat sessions, + interaction density, and other behavioral features. + """ . + +narrative:averageRating a owl:DatatypeProperty ; + rdfs:label "average rating" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:decimal ; + rdfs:comment "Average user rating (0-5 scale)" . + +narrative:ratingCount a owl:DatatypeProperty ; + rdfs:label "rating count" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Number of user ratings" . + +narrative:viewCount a owl:DatatypeProperty ; + rdfs:label "view count" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Total number of views" . + +narrative:readCount a owl:DatatypeProperty ; + rdfs:label "read count" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Number of times work was read" . + +narrative:favoriteCount a owl:DatatypeProperty ; + rdfs:label "favorite count" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Number of users who favorited this work" . + +narrative:wishlistCount a owl:DatatypeProperty ; + rdfs:label "wishlist count" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:int ; + rdfs:comment "Number of users who wishlisted this work" . + +################################################################# +# Embedding Storage (for ML/vector search) +################################################################# + +narrative:userEmbeddingVector a owl:DatatypeProperty ; + rdfs:label "user embedding vector" ; + rdfs:domain narrative:User ; + rdfs:range xsd:string ; + rdfs:comment """ + Serialized vector representation of a User's tastes. + Common encodings: JSON array, base64-encoded binary, or space-separated floats. + """ . + +narrative:workEmbeddingVector a owl:DatatypeProperty ; + rdfs:label "work embedding vector" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:string ; + rdfs:comment """ + Serialized vector representation of a StoryWork's content and graph neighborhood. + Used for nearest-neighbor search in a vector index. + """ . + +narrative:characterEmbeddingVector a owl:DatatypeProperty ; + rdfs:label "character embedding vector" ; + rdfs:domain narrative:Character ; + rdfs:range xsd:string ; + rdfs:comment "Serialized vector representation of a Character" . + +################################################################# +# Similarity Relationships +################################################################# + +narrative:similarTo a owl:ObjectProperty ; + rdfs:label "similar to" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:StoryWork ; + rdfs:comment "Works similar to this work (for recommendations)" . + +narrative:similarityScore a owl:DatatypeProperty ; + rdfs:label "similarity score" ; + rdfs:range xsd:float ; + rdfs:comment "Similarity score between two works (0.0-1.0)" . + +narrative:recommendedFor a owl:ObjectProperty ; + rdfs:label "recommended for" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:User ; + rdfs:comment "User this work is recommended for" . + +narrative:recommendationScore a owl:DatatypeProperty ; + rdfs:label "recommendation score" ; + rdfs:domain narrative:StoryWork ; + rdfs:range xsd:float ; + rdfs:comment "Recommendation score for a user (personalized)" . + +################################################################# +# Discovery Shelf/Collection Types +################################################################# + +narrative:Shelf a owl:Class ; + rdfs:label "Shelf" ; + rdfs:comment "Curated discovery shelf (Trending, Popular, New Releases, Staff Picks, etc.)" . + +narrative:shelfName a owl:DatatypeProperty ; + rdfs:label "shelf name" ; + rdfs:domain narrative:Shelf ; + rdfs:range xsd:string ; + rdfs:comment "Name of the shelf" . + +narrative:shelfType a owl:DatatypeProperty ; + rdfs:label "shelf type" ; + rdfs:domain narrative:Shelf ; + rdfs:range xsd:string ; + rdfs:comment "Algorithmic, Curated, Personalized, etc." . + +narrative:shelfDescription a owl:DatatypeProperty ; + rdfs:label "shelf description" ; + rdfs:domain narrative:Shelf ; + rdfs:range xsd:string ; + rdfs:comment "Description of what's on this shelf" . + +narrative:onShelf a owl:ObjectProperty ; + rdfs:label "on shelf" ; + rdfs:domain narrative:StoryWork ; + rdfs:range narrative:Shelf ; + rdfs:comment "Work appears on this discovery shelf" . + +narrative:shelfPosition a owl:DatatypeProperty ; + rdfs:label "shelf position" ; + rdfs:range xsd:int ; + rdfs:comment "Position of work on shelf (for ordering)" . diff --git a/infra/qlever/data/ttl/10-rights-licensing.ttl b/infra/qlever/data/ttl/10-rights-licensing.ttl new file mode 100644 index 0000000..48451ce --- /dev/null +++ b/infra/qlever/data/ttl/10-rights-licensing.ttl @@ -0,0 +1,464 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# Rights and Licensing Module +# Intellectual property rights, ownership, and licensing agreements +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern Rights and Licensing Module" ; + rdfs:comment "Properties and relationships for IP rights, ownership, and licensing" ; + owl:imports . + +################################################################# +# Rights Classes +################################################################# + +narrative:Right a owl:Class ; + rdfs:label "Right" ; + rdfs:comment "Intellectual property right for a character, work, or franchise" . + +narrative:CopyrightRight a owl:Class ; + rdfs:subClassOf narrative:Right ; + rdfs:label "Copyright Right" ; + rdfs:comment "Copyright ownership" . + +narrative:TrademarkRight a owl:Class ; + rdfs:subClassOf narrative:Right ; + rdfs:label "Trademark Right" ; + rdfs:comment "Trademark ownership" . + +narrative:MerchandisingRight a owl:Class ; + rdfs:subClassOf narrative:Right ; + rdfs:label "Merchandising Right" ; + rdfs:comment "Rights to create merchandise" . + +narrative:AdaptationRight a owl:Class ; + rdfs:subClassOf narrative:Right ; + rdfs:label "Adaptation Right" ; + rdfs:comment "Rights to adapt work to other media" . + +narrative:DistributionRight a owl:Class ; + rdfs:subClassOf narrative:Right ; + rdfs:label "Distribution Right" ; + rdfs:comment "Rights to distribute work" . + +narrative:DigitalRight a owl:Class ; + rdfs:subClassOf narrative:Right ; + rdfs:label "Digital Right" ; + rdfs:comment "Digital distribution and reproduction rights" . + +################################################################# +# Rights Properties +################################################################# + +narrative:rightType a owl:DatatypeProperty ; + rdfs:label "right type" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:string ; + rdfs:comment "Copyright, Trademark, Merchandising, Adaptation, Distribution, etc." . + +narrative:rightDescription a owl:DatatypeProperty ; + rdfs:label "right description" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:string ; + rdfs:comment "Description of the specific rights granted" . + +narrative:ownershipType a owl:DatatypeProperty ; + rdfs:label "ownership type" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:string ; + rdfs:comment "Full, Partial, Work-for-Hire, Creator-Owned, Joint, etc." . + +narrative:ownershipPercentage a owl:DatatypeProperty ; + rdfs:label "ownership percentage" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:float ; + rdfs:comment "Percentage ownership (0.0-1.0)" . + +narrative:territory a owl:DatatypeProperty ; + rdfs:label "territory" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:string ; + rdfs:comment "Geographic territory (ISO 3166 codes, repeatable)" . + +narrative:rightsStartDate a owl:DatatypeProperty ; + rdfs:label "rights start date" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:date ; + rdfs:comment "When rights became effective" . + +narrative:rightsExpirationDate a owl:DatatypeProperty ; + rdfs:label "rights expiration date" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:date ; + rdfs:comment "When rights expire (null = perpetual)" . + +narrative:reversionDate a owl:DatatypeProperty ; + rdfs:label "reversion date" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:date ; + rdfs:comment "Date when rights revert to creator" . + +narrative:exclusivity a owl:DatatypeProperty ; + rdfs:label "exclusivity" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether rights are exclusive" . + +narrative:transferable a owl:DatatypeProperty ; + rdfs:label "transferable" ; + rdfs:domain narrative:Right ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether rights can be transferred" . + +################################################################# +# Rights Subject Relationships +################################################################# + +narrative:rightsSubject a owl:ObjectProperty ; + rdfs:label "rights subject" ; + rdfs:domain narrative:Right ; + rdfs:comment "What this right covers (Character, Work, Franchise, etc.)" . + +narrative:rightsToCharacter a owl:ObjectProperty ; + rdfs:label "rights to character" ; + rdfs:domain narrative:Right ; + rdfs:range narrative:Character ; + rdfs:comment "Character these rights apply to" . + +narrative:rightsToWork a owl:ObjectProperty ; + rdfs:label "rights to work" ; + rdfs:domain narrative:Right ; + rdfs:range narrative:StoryWork ; + rdfs:comment "Work these rights apply to" . + +narrative:rightsToFranchise a owl:ObjectProperty ; + rdfs:label "rights to franchise" ; + rdfs:domain narrative:Right ; + rdfs:range narrative:Franchise ; + rdfs:comment "Franchise these rights apply to" . + +################################################################# +# Rights Holder Relationships +################################################################# + +narrative:rightsHolder a owl:ObjectProperty ; + rdfs:label "rights holder" ; + rdfs:domain narrative:Right ; + rdfs:range [ owl:unionOf (narrative:Person narrative:Org) ] ; + rdfs:comment "Who holds this right (Person or Organization)" . + +narrative:holdsRightsTo a owl:ObjectProperty ; + rdfs:label "holds rights to" ; + rdfs:domain [ owl:unionOf (narrative:Person narrative:Org) ] ; + rdfs:range narrative:Right ; + owl:inverseOf narrative:rightsHolder ; + rdfs:comment "Rights held by this person or organization" . + +narrative:creatorOwns a owl:ObjectProperty ; + rdfs:label "creator owns" ; + rdfs:domain narrative:Person ; + rdfs:range narrative:Right ; + rdfs:comment "Creator-owned rights" . + +narrative:publisherOwns a owl:ObjectProperty ; + rdfs:label "publisher owns" ; + rdfs:domain narrative:Org ; + rdfs:range narrative:Right ; + rdfs:comment "Publisher-owned rights" . + +################################################################# +# License Classes +################################################################# + +narrative:License a owl:Class ; + rdfs:label "License" ; + rdfs:comment "License agreement for using intellectual property" . + +narrative:ExclusiveLicense a owl:Class ; + rdfs:subClassOf narrative:License ; + rdfs:label "Exclusive License" ; + rdfs:comment "Exclusive licensing agreement" . + +narrative:NonExclusiveLicense a owl:Class ; + rdfs:subClassOf narrative:License ; + rdfs:label "Non-Exclusive License" ; + rdfs:comment "Non-exclusive licensing agreement" . + +narrative:SubLicense a owl:Class ; + rdfs:subClassOf narrative:License ; + rdfs:label "Sub-License" ; + rdfs:comment "Sub-licensing agreement" . + +################################################################# +# License Properties +################################################################# + +narrative:licenseType a owl:DatatypeProperty ; + rdfs:label "license type" ; + rdfs:domain narrative:License ; + rdfs:range xsd:string ; + rdfs:comment "Exclusive, Non-Exclusive, Sub-License, Territorial, etc." . + +narrative:licenseDescription a owl:DatatypeProperty ; + rdfs:label "license description" ; + rdfs:domain narrative:License ; + rdfs:range xsd:string ; + rdfs:comment "Description of the license terms" . + +narrative:licenseScope a owl:DatatypeProperty ; + rdfs:label "license scope" ; + rdfs:domain narrative:License ; + rdfs:range xsd:string ; + rdfs:comment "Scope of licensed rights (Print, Digital, Merchandise, Film, TV, etc.)" . + +narrative:royaltyPercentage a owl:DatatypeProperty ; + rdfs:label "royalty percentage" ; + rdfs:domain narrative:License ; + rdfs:range xsd:float ; + rdfs:comment "Royalty percentage (0.0-1.0)" . + +narrative:royaltyRate a owl:DatatypeProperty ; + rdfs:label "royalty rate" ; + rdfs:domain narrative:License ; + rdfs:range xsd:decimal ; + rdfs:comment "Flat royalty rate per unit" . + +narrative:minimumGuarantee a owl:DatatypeProperty ; + rdfs:label "minimum guarantee" ; + rdfs:domain narrative:License ; + rdfs:range xsd:decimal ; + rdfs:comment "Minimum guaranteed payment" . + +narrative:advancePayment a owl:DatatypeProperty ; + rdfs:label "advance payment" ; + rdfs:domain narrative:License ; + rdfs:range xsd:decimal ; + rdfs:comment "Advance payment against royalties" . + +narrative:territory a owl:DatatypeProperty ; + rdfs:label "territory" ; + rdfs:domain narrative:License ; + rdfs:range xsd:string ; + rdfs:comment "Geographic territory covered by license" . + +narrative:language a owl:DatatypeProperty ; + rdfs:label "language" ; + rdfs:domain narrative:License ; + rdfs:range xsd:string ; + rdfs:comment "Language(s) covered by license" . + +narrative:licenseStartDate a owl:DatatypeProperty ; + rdfs:label "license start date" ; + rdfs:domain narrative:License ; + rdfs:range xsd:date ; + rdfs:comment "When license becomes effective" . + +narrative:licenseExpirationDate a owl:DatatypeProperty ; + rdfs:label "license expiration date" ; + rdfs:domain narrative:License ; + rdfs:range xsd:date ; + rdfs:comment "When license expires" . + +narrative:renewalOption a owl:DatatypeProperty ; + rdfs:label "renewal option" ; + rdfs:domain narrative:License ; + rdfs:range xsd:boolean ; + rdfs:comment "Whether license can be renewed" . + +narrative:renewalTerms a owl:DatatypeProperty ; + rdfs:label "renewal terms" ; + rdfs:domain narrative:License ; + rdfs:range xsd:string ; + rdfs:comment "Terms for renewal" . + +################################################################# +# License Relationships +################################################################# + +narrative:licenseOf a owl:ObjectProperty ; + rdfs:label "license of" ; + rdfs:domain narrative:License ; + rdfs:range narrative:Right ; + rdfs:comment "Which right is being licensed" . + +narrative:licensor a owl:ObjectProperty ; + rdfs:label "licensor" ; + rdfs:domain narrative:License ; + rdfs:range [ owl:unionOf (narrative:Person narrative:Org) ] ; + rdfs:comment "Who is granting the license" . + +narrative:licensee a owl:ObjectProperty ; + rdfs:label "licensee" ; + rdfs:domain narrative:License ; + rdfs:range [ owl:unionOf (narrative:Person narrative:Org) ] ; + rdfs:comment "Who is receiving the license" . + +narrative:hasLicense a owl:ObjectProperty ; + rdfs:label "has license" ; + rdfs:domain narrative:Right ; + rdfs:range narrative:License ; + owl:inverseOf narrative:licenseOf ; + rdfs:comment "License granted for this right" . + +################################################################# +# Royalty Tracking +################################################################# + +narrative:RoyaltyPayment a owl:Class ; + rdfs:label "Royalty Payment" ; + rdfs:comment "Individual royalty payment record" . + +narrative:paymentAmount a owl:DatatypeProperty ; + rdfs:label "payment amount" ; + rdfs:domain narrative:RoyaltyPayment ; + rdfs:range xsd:decimal ; + rdfs:comment "Amount paid" . + +narrative:paymentDate a owl:DatatypeProperty ; + rdfs:label "payment date" ; + rdfs:domain narrative:RoyaltyPayment ; + rdfs:range xsd:date ; + rdfs:comment "Date of payment" . + +narrative:paymentPeriodStart a owl:DatatypeProperty ; + rdfs:label "payment period start" ; + rdfs:domain narrative:RoyaltyPayment ; + rdfs:range xsd:date ; + rdfs:comment "Start of period this payment covers" . + +narrative:paymentPeriodEnd a owl:DatatypeProperty ; + rdfs:label "payment period end" ; + rdfs:domain narrative:RoyaltyPayment ; + rdfs:range xsd:date ; + rdfs:comment "End of period this payment covers" . + +narrative:unitsSold a owl:DatatypeProperty ; + rdfs:label "units sold" ; + rdfs:domain narrative:RoyaltyPayment ; + rdfs:range xsd:int ; + rdfs:comment "Number of units sold in period" . + +narrative:paymentForLicense a owl:ObjectProperty ; + rdfs:label "payment for license" ; + rdfs:domain narrative:RoyaltyPayment ; + rdfs:range narrative:License ; + rdfs:comment "License this payment is for" . + +narrative:paymentTo a owl:ObjectProperty ; + rdfs:label "payment to" ; + rdfs:domain narrative:RoyaltyPayment ; + rdfs:range [ owl:unionOf (narrative:Person narrative:Org) ] ; + rdfs:comment "Recipient of payment" . + +################################################################# +# Rights Disputes & Legal +################################################################# + +narrative:RightsDispute a owl:Class ; + rdfs:label "Rights Dispute" ; + rdfs:comment "Legal dispute over rights ownership" . + +narrative:disputeType a owl:DatatypeProperty ; + rdfs:label "dispute type" ; + rdfs:domain narrative:RightsDispute ; + rdfs:range xsd:string ; + rdfs:comment "Ownership, Infringement, Breach of Contract, etc." . + +narrative:disputeStatus a owl:DatatypeProperty ; + rdfs:label "dispute status" ; + rdfs:domain narrative:RightsDispute ; + rdfs:range xsd:string ; + rdfs:comment "Pending, Settled, Court Ruling, Arbitration, etc." . + +narrative:disputeDescription a owl:DatatypeProperty ; + rdfs:label "dispute description" ; + rdfs:domain narrative:RightsDispute ; + rdfs:range xsd:string ; + rdfs:comment "Description of the dispute" . + +narrative:filedDate a owl:DatatypeProperty ; + rdfs:label "filed date" ; + rdfs:domain narrative:RightsDispute ; + rdfs:range xsd:date ; + rdfs:comment "Date dispute was filed" . + +narrative:resolvedDate a owl:DatatypeProperty ; + rdfs:label "resolved date" ; + rdfs:domain narrative:RightsDispute ; + rdfs:range xsd:date ; + rdfs:comment "Date dispute was resolved" . + +narrative:disputeOverRight a owl:ObjectProperty ; + rdfs:label "dispute over right" ; + rdfs:domain narrative:RightsDispute ; + rdfs:range narrative:Right ; + rdfs:comment "Right being disputed" . + +narrative:claimant a owl:ObjectProperty ; + rdfs:label "claimant" ; + rdfs:domain narrative:RightsDispute ; + rdfs:range [ owl:unionOf (narrative:Person narrative:Org) ] ; + rdfs:comment "Party making the claim" . + +narrative:defendant a owl:ObjectProperty ; + rdfs:label "defendant" ; + rdfs:domain narrative:RightsDispute ; + rdfs:range [ owl:unionOf (narrative:Person narrative:Org) ] ; + rdfs:comment "Party defending against claim" . + +################################################################# +# Work-for-Hire & Creator Agreements +################################################################# + +narrative:CreatorAgreement a owl:Class ; + rdfs:label "Creator Agreement" ; + rdfs:comment "Agreement between creator and publisher" . + +narrative:agreementType a owl:DatatypeProperty ; + rdfs:label "agreement type" ; + rdfs:domain narrative:CreatorAgreement ; + rdfs:range xsd:string ; + rdfs:comment "Work-for-Hire, Creator-Owned, Joint Ownership, etc." . + +narrative:pageRate a owl:DatatypeProperty ; + rdfs:label "page rate" ; + rdfs:domain narrative:CreatorAgreement ; + rdfs:range xsd:decimal ; + rdfs:comment "Payment per page of work" . + +narrative:flatFee a owl:DatatypeProperty ; + rdfs:label "flat fee" ; + rdfs:domain narrative:CreatorAgreement ; + rdfs:range xsd:decimal ; + rdfs:comment "Flat fee for work" . + +narrative:reversionClause a owl:DatatypeProperty ; + rdfs:label "reversion clause" ; + rdfs:domain narrative:CreatorAgreement ; + rdfs:range xsd:string ; + rdfs:comment "Terms under which rights revert to creator" . + +narrative:agreementForWork a owl:ObjectProperty ; + rdfs:label "agreement for work" ; + rdfs:domain narrative:CreatorAgreement ; + rdfs:range narrative:StoryWork ; + rdfs:comment "Work covered by this agreement" . + +narrative:creatorParty a owl:ObjectProperty ; + rdfs:label "creator party" ; + rdfs:domain narrative:CreatorAgreement ; + rdfs:range narrative:Person ; + rdfs:comment "Creator in the agreement" . + +narrative:publisherParty a owl:ObjectProperty ; + rdfs:label "publisher party" ; + rdfs:domain narrative:CreatorAgreement ; + rdfs:range narrative:Org ; + rdfs:comment "Publisher in the agreement" . diff --git a/infra/qlever/data/ttl/11-external-identifiers.ttl b/infra/qlever/data/ttl/11-external-identifiers.ttl new file mode 100644 index 0000000..6baf91a --- /dev/null +++ b/infra/qlever/data/ttl/11-external-identifiers.ttl @@ -0,0 +1,505 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . + +################################################################# +# External Identifiers Module +# Cross-system identifiers and metadata for deduplication and enrichment +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern External Identifiers Module" ; + rdfs:comment "External system identifiers and metadata for all entity types" ; + owl:imports . + +################################################################# +# Generic External Identifier +################################################################# + +narrative:externalSystemId a owl:DatatypeProperty ; + rdfs:label "external system ID" ; + rdfs:range xsd:string ; + rdfs:comment """ + Generic hook for storing an external system identifier. + Recommended pattern: prefix values with a system tag, such as: + - 'supabase:profiles:' + - 'supabase:products:' + - 'metron:character:145' + - 'comicvine:issue:12345' + so that lookups remain unambiguous across systems. + """ . + +################################################################# +# Comics & Manga Identifiers +################################################################# + +### Metron (Comics Database) +narrative:metronId a owl:DatatypeProperty ; + rdfs:label "Metron ID" ; + rdfs:range xsd:int ; + rdfs:comment "Metron database identifier" . + +### ComicVine +narrative:comicVineId a owl:DatatypeProperty ; + rdfs:label "ComicVine ID" ; + rdfs:range xsd:string ; + rdfs:comment "ComicVine database identifier" . + +### Grand Comics Database +narrative:gcdId a owl:DatatypeProperty ; + rdfs:label "GCD ID" ; + rdfs:range xsd:string ; + rdfs:comment "Grand Comics Database identifier" . + +### League of Comic Geeks +narrative:leagueOfComicGeeksId a owl:DatatypeProperty ; + rdfs:label "League of Comic Geeks ID" ; + rdfs:range xsd:string ; + rdfs:comment "League of Comic Geeks identifier" . + +################################################################# +# Anime & Manga Identifiers +################################################################# + +### MyAnimeList +narrative:malId a owl:DatatypeProperty ; + rdfs:label "MAL ID" ; + rdfs:range xsd:int ; + rdfs:comment "MyAnimeList identifier" . + +### AniList +narrative:anilistId a owl:DatatypeProperty ; + rdfs:label "AniList ID" ; + rdfs:range xsd:int ; + rdfs:comment "AniList database identifier" . + +### Kitsu +narrative:kitsuId a owl:DatatypeProperty ; + rdfs:label "Kitsu ID" ; + rdfs:range xsd:int ; + rdfs:comment "Kitsu database identifier" . + +### AniDB +narrative:anidbId a owl:DatatypeProperty ; + rdfs:label "AniDB ID" ; + rdfs:range xsd:int ; + rdfs:comment "AniDB (Anime Database) identifier" . + +### MangaDex +narrative:mangadexId a owl:DatatypeProperty ; + rdfs:label "MangaDex ID" ; + rdfs:range xsd:string ; + rdfs:comment "MangaDex identifier (UUID)" . + +### MangaUpdates +narrative:mangaUpdatesId a owl:DatatypeProperty ; + rdfs:label "MangaUpdates ID" ; + rdfs:range xsd:int ; + rdfs:comment "MangaUpdates (Baka-Updates) series identifier" . + +################################################################# +# Film & TV Identifiers +################################################################# + +### IMDb +narrative:imdbId a owl:DatatypeProperty ; + rdfs:label "IMDb ID" ; + rdfs:range xsd:string ; + rdfs:comment "Internet Movie Database identifier (tt1234567)" . + +### The Movie Database (TMDb) +narrative:tmdbId a owl:DatatypeProperty ; + rdfs:label "TMDb ID" ; + rdfs:range xsd:int ; + rdfs:comment "The Movie Database identifier" . + +### TheTVDB +narrative:tvdbId a owl:DatatypeProperty ; + rdfs:label "TheTVDB ID" ; + rdfs:range xsd:int ; + rdfs:comment "TheTVDB series identifier" . + +### Trakt.tv +narrative:traktId a owl:DatatypeProperty ; + rdfs:label "Trakt ID" ; + rdfs:range xsd:int ; + rdfs:comment "Trakt.tv identifier" . + +################################################################# +# Music Identifiers +################################################################# + +### MusicBrainz +narrative:musicbrainzId a owl:DatatypeProperty ; + rdfs:label "MusicBrainz ID" ; + rdfs:range xsd:string ; + rdfs:comment "MusicBrainz identifier (UUID)" . + +### Discogs +narrative:discogsId a owl:DatatypeProperty ; + rdfs:label "Discogs ID" ; + rdfs:range xsd:int ; + rdfs:comment "Discogs release/artist identifier" . + +### Spotify +narrative:spotifyId a owl:DatatypeProperty ; + rdfs:label "Spotify ID" ; + rdfs:range xsd:string ; + rdfs:comment "Spotify track/album/artist identifier" . + +### Apple Music +narrative:appleMusicId a owl:DatatypeProperty ; + rdfs:label "Apple Music ID" ; + rdfs:range xsd:string ; + rdfs:comment "Apple Music identifier" . + +### Last.fm +narrative:lastfmId a owl:DatatypeProperty ; + rdfs:label "Last.fm ID" ; + rdfs:range xsd:string ; + rdfs:comment "Last.fm artist/album identifier" . + +### ISRC (International Standard Recording Code) +narrative:isrc a owl:DatatypeProperty ; + rdfs:label "ISRC" ; + rdfs:range xsd:string ; + rdfs:comment "International Standard Recording Code for audio tracks" . + +################################################################# +# Games Identifiers +################################################################# + +### IGDB (Internet Game Database) +narrative:igdbId a owl:DatatypeProperty ; + rdfs:label "IGDB ID" ; + rdfs:range xsd:int ; + rdfs:comment "Internet Game Database identifier" . + +### Steam +narrative:steamId a owl:DatatypeProperty ; + rdfs:label "Steam ID" ; + rdfs:range xsd:int ; + rdfs:comment "Steam application ID" . + +### GOG +narrative:gogId a owl:DatatypeProperty ; + rdfs:label "GOG ID" ; + rdfs:range xsd:int ; + rdfs:comment "GOG.com game identifier" . + +### Epic Games +narrative:epicGamesId a owl:DatatypeProperty ; + rdfs:label "Epic Games ID" ; + rdfs:range xsd:string ; + rdfs:comment "Epic Games Store identifier" . + +### Giant Bomb +narrative:giantBombId a owl:DatatypeProperty ; + rdfs:label "Giant Bomb ID" ; + rdfs:range xsd:int ; + rdfs:comment "Giant Bomb game database identifier" . + +################################################################# +# Books & Literature Identifiers +################################################################# + +### ISBN (International Standard Book Number) +narrative:isbn a owl:DatatypeProperty ; + rdfs:label "ISBN" ; + rdfs:range xsd:string ; + rdfs:comment "International Standard Book Number (ISBN-10 or ISBN-13)" . + +### ISBN-10 +narrative:isbn10 a owl:DatatypeProperty ; + rdfs:label "ISBN-10" ; + rdfs:range xsd:string ; + rdfs:comment "10-digit ISBN" . + +### ISBN-13 +narrative:isbn13 a owl:DatatypeProperty ; + rdfs:label "ISBN-13" ; + rdfs:range xsd:string ; + rdfs:comment "13-digit ISBN" . + +### Goodreads +narrative:goodreadsId a owl:DatatypeProperty ; + rdfs:label "Goodreads ID" ; + rdfs:range xsd:int ; + rdfs:comment "Goodreads book/author identifier" . + +### Open Library +narrative:openLibraryId a owl:DatatypeProperty ; + rdfs:label "Open Library ID" ; + rdfs:range xsd:string ; + rdfs:comment "Open Library identifier (OL123456W)" . + +### LibraryThing +narrative:libraryThingId a owl:DatatypeProperty ; + rdfs:label "LibraryThing ID" ; + rdfs:range xsd:string ; + rdfs:comment "LibraryThing work identifier" . + +################################################################# +# Product & Commerce Identifiers +################################################################# + +### UPC (Universal Product Code) +narrative:upc a owl:DatatypeProperty ; + rdfs:label "UPC" ; + rdfs:range xsd:string ; + rdfs:comment "Universal Product Code (barcode)" . + +### EAN (European Article Number) +narrative:ean a owl:DatatypeProperty ; + rdfs:label "EAN" ; + rdfs:range xsd:string ; + rdfs:comment "European Article Number" . + +### SKU (Stock Keeping Unit) +narrative:sku a owl:DatatypeProperty ; + rdfs:label "SKU" ; + rdfs:range xsd:string ; + rdfs:comment "Stock Keeping Unit / Diamond order code" . + +### ASIN (Amazon Standard Identification Number) +narrative:asin a owl:DatatypeProperty ; + rdfs:label "ASIN" ; + rdfs:range xsd:string ; + rdfs:comment "Amazon Standard Identification Number" . + +### Diamond Comic Distributors Code +narrative:diamondCode a owl:DatatypeProperty ; + rdfs:label "Diamond Code" ; + rdfs:range xsd:string ; + rdfs:comment "Diamond Comic Distributors order code" . + +### COMET Distribution System Codes +narrative:cometStockCode a owl:DatatypeProperty ; + rdfs:label "COMET Stock Code" ; + rdfs:range xsd:string ; + rdfs:comment "COMET StockCode - primary catalog ID for distribution" . + +narrative:cometMonthCode a owl:DatatypeProperty ; + rdfs:label "COMET Month Code" ; + rdfs:range xsd:string ; + rdfs:comment "COMET MonthCode identifier (e.g., SEP081984)" . + +narrative:cometAlternateCode a owl:DatatypeProperty ; + rdfs:label "COMET Alternate Code" ; + rdfs:range xsd:string ; + rdfs:comment "Additional COMET AlternateCode(s) for product lookup" . + +### BISAC (Book Industry Standards and Communications) +narrative:bisacCode a owl:DatatypeProperty ; + rdfs:label "BISAC Code" ; + rdfs:range xsd:string ; + rdfs:comment "BISAC subject code for book/comic categorization (e.g., CGN004030)" . + +################################################################# +# Digital Platform Identifiers +################################################################# + +### Webtoon +narrative:webtoonId a owl:DatatypeProperty ; + rdfs:label "Webtoon ID" ; + rdfs:range xsd:int ; + rdfs:comment "Webtoon series identifier" . + +### Tapas +narrative:tapasId a owl:DatatypeProperty ; + rdfs:label "Tapas ID" ; + rdfs:range xsd:int ; + rdfs:comment "Tapas series identifier" . + +### ComiXology +narrative:comixologyId a owl:DatatypeProperty ; + rdfs:label "ComiXology ID" ; + rdfs:range xsd:string ; + rdfs:comment "ComiXology/Amazon Comics identifier" . + +### Crunchyroll +narrative:crunchyrollId a owl:DatatypeProperty ; + rdfs:label "Crunchyroll ID" ; + rdfs:range xsd:int ; + rdfs:comment "Crunchyroll series identifier" . + +### Funimation +narrative:funimationId a owl:DatatypeProperty ; + rdfs:label "Funimation ID" ; + rdfs:range xsd:string ; + rdfs:comment "Funimation series identifier" . + +################################################################# +# Social & Fan Sites +################################################################# + +### MyComicShop +narrative:myComicShopId a owl:DatatypeProperty ; + rdfs:label "MyComicShop ID" ; + rdfs:range xsd:int ; + rdfs:comment "MyComicShop.com product identifier" . + +### Fandom Wiki +narrative:fandomWikiUrl a owl:DatatypeProperty ; + rdfs:label "Fandom Wiki URL" ; + rdfs:range xsd:anyURI ; + rdfs:comment "Fandom (formerly Wikia) wiki page URL" . + +### Wikipedia +narrative:wikipediaUrl a owl:DatatypeProperty ; + rdfs:label "Wikipedia URL" ; + rdfs:range xsd:anyURI ; + rdfs:comment "Wikipedia page URL" . + +### Wikidata +narrative:wikidataId a owl:DatatypeProperty ; + rdfs:label "Wikidata ID" ; + rdfs:range xsd:string ; + rdfs:comment "Wikidata entity identifier (Q123456)" . + +################################################################# +# Supabase Platform Identifiers +################################################################# + +### Supabase UUID (Primary Platform ID) +narrative:supabaseId a owl:DatatypeProperty ; + rdfs:label "Supabase ID" ; + rdfs:range xsd:string ; + rdfs:comment "Supabase database UUID (primary platform identifier)" . + +### Supabase Profile ID +narrative:supabaseProfileId a owl:DatatypeProperty ; + rdfs:label "Supabase Profile ID" ; + rdfs:domain narrative:User ; + rdfs:range xsd:string ; + rdfs:comment "Supabase auth.users / public.profiles UUID" . + +### Supabase Product ID +narrative:supabaseProductId a owl:DatatypeProperty ; + rdfs:label "Supabase Product ID" ; + rdfs:domain narrative:Product ; + rdfs:range xsd:string ; + rdfs:comment "Supabase products table UUID" . + +################################################################# +# Metadata Properties +################################################################# + +### Resource URL (Canonical External URL) +narrative:resourceUrl a owl:DatatypeProperty ; + rdfs:label "resource URL" ; + rdfs:range xsd:anyURI ; + rdfs:comment "Canonical external resource URL (e.g., Metron, ComicVine page)" . + +### Last Modified Timestamp +narrative:lastModified a owl:DatatypeProperty ; + rdfs:label "last modified" ; + rdfs:range xsd:dateTime ; + rdfs:comment "Last modification timestamp from source system for data freshness tracking" . + +### Created Timestamp +narrative:createdAt a owl:DatatypeProperty ; + rdfs:label "created at" ; + rdfs:range xsd:dateTime ; + rdfs:comment "Creation timestamp" . + +### Updated Timestamp +narrative:updatedAt a owl:DatatypeProperty ; + rdfs:label "updated at" ; + rdfs:range xsd:dateTime ; + rdfs:comment "Last update timestamp" . + +### Source System +narrative:sourceSystem a owl:DatatypeProperty ; + rdfs:label "source system" ; + rdfs:range xsd:string ; + rdfs:comment "Source system name (metron, comicvine, mal, tmdb, etc.)" . + +### Data Quality Score +narrative:dataQualityScore a owl:DatatypeProperty ; + rdfs:label "data quality score" ; + rdfs:range xsd:float ; + rdfs:comment "Data quality score (0.0-1.0) for confidence in data accuracy" . + +### Verification Status +narrative:verificationStatus a owl:DatatypeProperty ; + rdfs:label "verification status" ; + rdfs:range xsd:string ; + rdfs:comment "Unverified, Community Verified, Official, Admin Verified" . + +### Canonical ID +narrative:canonicalId a owl:DatatypeProperty ; + rdfs:label "canonical ID" ; + rdfs:range xsd:string ; + rdfs:comment "Canonical identifier chosen as primary when multiple IDs exist" . + +################################################################# +# Deduplication Properties +################################################################# + +### Duplicate Of +narrative:duplicateOf a owl:ObjectProperty ; + rdfs:label "duplicate of" ; + rdfs:comment "This entity is a duplicate of another entity (for deduplication)" . + +### Merged Into +narrative:mergedInto a owl:ObjectProperty ; + rdfs:label "merged into" ; + rdfs:comment "This entity was merged into another entity" . + +### Canonical Entity +narrative:canonicalEntity a owl:ObjectProperty ; + rdfs:label "canonical entity" ; + rdfs:comment "The canonical version of this entity" . + +### Alternate Of +narrative:alternateOf a owl:ObjectProperty ; + rdfs:label "alternate of" ; + rdfs:comment "This is an alternate representation of another entity" . + +################################################################# +# Domain-Specific Identifier Mappings +################################################################# + +### Character Domain +# Applied domains: Character +# Applicable IDs: metronId, comicVineId, gcdId, malId, anilistId, wikidataId + +### Person Domain +# Applied domains: Person +# Applicable IDs: metronId, imdbId, tmdbId, musicbrainzId, wikidataId + +### Organization Domain +# Applied domains: Org +# Applicable IDs: wikidataId + +### StoryWork Domain +# Applied domains: StoryWork +# Applicable IDs: metronId, comicVineId, gcdId, malId, anilistId, tmdbId, tvdbId, igdbId + +### StoryExpression Domain +# Applied domains: StoryExpression +# Applicable IDs: metronId, comicVineId, gcdId, malId, anilistId, tmdbId, imdbId + +### Universe Domain +# Applied domains: Universe +# Applicable IDs: metronId, wikidataId + +### Group Domain +# Applied domains: Group +# Applicable IDs: metronId, comicVineId + +### Product/Manifestation Domain +# Applied domains: Product, Manifestation +# Applicable IDs: isbn, upc, ean, sku, asin, diamondCode, cometStockCode, cometMonthCode, cometAlternateCode, bisacCode, supabaseProductId + +### NarrativeUnit Domain (Audio) +# Applied domains: NarrativeUnit (audio tracks) +# Applicable IDs: isrc + +### User Domain +# Applied domains: User +# Applicable IDs: supabaseProfileId diff --git a/infra/qlever/data/ttl/12-trading-cards.ttl b/infra/qlever/data/ttl/12-trading-cards.ttl new file mode 100644 index 0000000..62f47a3 --- /dev/null +++ b/infra/qlever/data/ttl/12-trading-cards.ttl @@ -0,0 +1,256 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . +@prefix narrative: . +@prefix tcg: . + +################################################################# +# PopModern TCG Module +# Extension for Trading Card Games (Magic: The Gathering, Pokemon, etc.) +################################################################# + + + a owl:Ontology ; + rdfs:label "PopModern TCG Module" ; + owl:imports . + +# --- Core Classes --- +tcg:CardOracle a owl:Class ; + rdfs:subClassOf narrative:Product ; + rdfs:label "Card Oracle" ; + rdfs:comment "The abstract concept of a card (e.g. 'Black Lotus', 'Charizard')." . + +tcg:CardPrinting a owl:Class ; + rdfs:subClassOf narrative:Manifestation ; + rdfs:label "Card Printing" ; + rdfs:comment "A specific physical instance of a card in a set." . + +tcg:CardSet a owl:Class ; + rdfs:subClassOf narrative:Collection ; + rdfs:label "Card Set" ; + rdfs:comment "A release set containing card printings." . + +tcg:CardFace a owl:Class ; + rdfs:label "Card Face" ; + rdfs:comment "A single face of a multi-faced card." . + +# --- Pokemon Specific Classes --- +tcg:PokemonCardOracle a owl:Class ; + rdfs:subClassOf tcg:CardOracle ; + rdfs:label "Pokemon Card Oracle" . + +tcg:PokemonCardPrinting a owl:Class ; + rdfs:subClassOf tcg:CardPrinting ; + rdfs:label "Pokemon Card Printing" . + +tcg:PokemonSet a owl:Class ; + rdfs:subClassOf tcg:CardSet ; + rdfs:label "Pokemon Set" . + +tcg:Attack a owl:Class ; + rdfs:label "Attack" ; + rdfs:comment "An attack on a Pokemon card." . + +tcg:Ability a owl:Class ; + rdfs:label "Ability" ; + rdfs:comment "An ability on a Pokemon card." . + +tcg:Weakness a owl:Class ; + rdfs:label "Weakness" . + +tcg:Resistance a owl:Class ; + rdfs:label "Resistance" . + +tcg:EnergyType a owl:Class ; + rdfs:label "Energy Type" . + +# --- Relationships --- +tcg:printingOf a owl:ObjectProperty ; + rdfs:domain tcg:CardPrinting ; + rdfs:range tcg:CardOracle ; + owl:inverseOf tcg:hasPrinting ; + rdfs:label "printing of" . + +tcg:hasPrinting a owl:ObjectProperty ; + rdfs:domain tcg:CardOracle ; + rdfs:range tcg:CardPrinting . + +tcg:inSet a owl:ObjectProperty ; + rdfs:domain tcg:CardPrinting ; + rdfs:range tcg:CardSet ; + rdfs:label "in set" . + +# --- Pokémon TCG Extensions --- + +tcg:PokemonCardOracle a owl:Class ; + rdfs:subClassOf tcg:CardOracle ; + rdfs:label "Pokémon Card Oracle" . + +tcg:PokemonCardPrinting a owl:Class ; + rdfs:subClassOf tcg:CardPrinting ; + rdfs:label "Pokémon Card Printing" . + +tcg:PokemonSet a owl:Class ; + rdfs:subClassOf tcg:CardSet ; + rdfs:label "Pokémon Set" . + +tcg:Attack a owl:Class ; + rdfs:label "Attack" . + +tcg:Ability a owl:Class ; + rdfs:label "Ability" . + +tcg:Weakness a owl:Class ; + rdfs:label "Weakness" . + +tcg:Resistance a owl:Class ; + rdfs:label "Resistance" . + +tcg:EnergyType a owl:Class ; + rdfs:label "Energy Type" . + +# Properties +tcg:nationalPokedexNumber a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:integer ; + rdfs:label "National Pokédex Number" . + +tcg:hp a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:integer ; + rdfs:label "HP" . + +tcg:supertype a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:string ; + rdfs:label "Supertype" . + +tcg:subtype a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:string ; + rdfs:label "Subtype" . + +tcg:hasEnergyType a owl:ObjectProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range tcg:EnergyType ; + rdfs:label "has energy type" . + +tcg:evolvesFrom a owl:ObjectProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range tcg:PokemonCardOracle ; + rdfs:label "evolves from" . + +tcg:hasAttack a owl:ObjectProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range tcg:Attack ; + rdfs:label "has attack" . + +tcg:cost a owl:DatatypeProperty ; + rdfs:domain tcg:Attack ; + rdfs:range xsd:string ; + rdfs:label "cost" . + +tcg:damage a owl:DatatypeProperty ; + rdfs:domain tcg:Attack ; + rdfs:range xsd:string ; + rdfs:label "damage" . + +tcg:retreatCost a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:integer ; + rdfs:label "retreat cost" . + +tcg:regulationMark a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardPrinting ; + rdfs:range xsd:string ; + rdfs:label "regulation mark" . + +tcg:TypeFire a tcg:EnergyType ; rdfs:label "Fire" . +tcg:TypeWater a tcg:EnergyType ; rdfs:label "Water" . +tcg:TypeGrass a tcg:EnergyType ; rdfs:label "Grass" . +tcg:TypeLightning a tcg:EnergyType ; rdfs:label "Lightning" . +tcg:TypePsychic a tcg:EnergyType ; rdfs:label "Psychic" . +tcg:TypeFighting a tcg:EnergyType ; rdfs:label "Fighting" . +tcg:TypeDarkness a tcg:EnergyType ; rdfs:label "Darkness" . +tcg:TypeMetal a tcg:EnergyType ; rdfs:label "Metal" . +tcg:TypeFairy a tcg:EnergyType ; rdfs:label "Fairy" . +tcg:TypeDragon a tcg:EnergyType ; rdfs:label "Dragon" . +tcg:TypeColorless a tcg:EnergyType ; rdfs:label "Colorless" . + +tcg:hasFace a owl:ObjectProperty ; + rdfs:domain tcg:CardOracle ; + rdfs:range tcg:CardFace ; + rdfs:label "has face" . + +# --- Pokemon Specific Properties --- +tcg:hp a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:int ; + rdfs:label "HP" . + +tcg:supertype a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:string ; + rdfs:label "Supertype" . + +tcg:subtype a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:string ; + rdfs:label "Subtype" . + +tcg:hasEnergyType a owl:ObjectProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range tcg:EnergyType ; + rdfs:label "has energy type" . + +tcg:evolvesFrom a owl:ObjectProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range tcg:PokemonCardOracle ; + rdfs:label "evolves from" . + +tcg:hasAttack a owl:ObjectProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range tcg:Attack ; + rdfs:label "has attack" . + +tcg:cost a owl:DatatypeProperty ; + rdfs:domain tcg:Attack ; + rdfs:range xsd:string ; + rdfs:label "cost" . + +tcg:damage a owl:DatatypeProperty ; + rdfs:domain tcg:Attack ; + rdfs:range xsd:string ; + rdfs:label "damage" . + +tcg:legalIn a owl:DatatypeProperty ; + rdfs:domain tcg:CardOracle ; + rdfs:range xsd:string ; + rdfs:label "legal in" . + +tcg:nationalPokedexNumber a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:int ; + rdfs:label "National Pokedex Number" . + +tcg:retreatCost a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardOracle ; + rdfs:range xsd:int ; + rdfs:label "Retreat Cost" . + +tcg:regulationMark a owl:DatatypeProperty ; + rdfs:domain tcg:PokemonCardPrinting ; + rdfs:range xsd:string ; + rdfs:label "Regulation Mark" . + +# --- MTG Specific Properties (kept for compatibility) --- +tcg:cmc a owl:DatatypeProperty ; + rdfs:domain tcg:CardOracle ; + rdfs:range xsd:decimal ; + rdfs:label "converted mana cost" . + +tcg:colorIdentity a owl:DatatypeProperty ; + rdfs:domain tcg:CardOracle ; + rdfs:range xsd:string ; + rdfs:label "color identity" . diff --git a/infra/qlever/data/ttl/13-timestamps.ttl b/infra/qlever/data/ttl/13-timestamps.ttl new file mode 100644 index 0000000..768578b --- /dev/null +++ b/infra/qlever/data/ttl/13-timestamps.ttl @@ -0,0 +1,29 @@ +@prefix : . +@prefix narrative: . +@prefix owl: . +@prefix rdfs: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "PopModern Narrative Ontology — Timestamps" ; + rdfs:comment "Timestamp predicates used for incremental exports and provenance." ; + owl:imports . + +narrative:lastModifiedAt + a owl:DatatypeProperty ; + rdfs:label "last modified at" ; + rdfs:comment "Canonical change timestamp for this entity in the knowledge graph. Used by export pipelines for incremental updates." ; + rdfs:range xsd:dateTime . + +narrative:sourceModifiedAt + a owl:DatatypeProperty ; + rdfs:label "source modified at" ; + rdfs:comment "Optional: original upstream change timestamp (if provided by the source system)." ; + rdfs:range xsd:dateTime . + +narrative:ingestedAt + a owl:DatatypeProperty ; + rdfs:label "ingested at" ; + rdfs:comment "Optional: timestamp when the importer/exporter ingested or derived this entity." ; + rdfs:range xsd:dateTime . diff --git a/infra/qlever/qlever.env b/infra/qlever/qlever.env index a7e56c0..ecb5900 100644 --- a/infra/qlever/qlever.env +++ b/infra/qlever/qlever.env @@ -9,8 +9,9 @@ QLEVER_DATA_NAME=local QLEVER_DATA_DESCRIPTION=Local NT dataset for QLever # [index] -QLEVER_INDEX_INPUT_FILES=../input/data.nt -QLEVER_INDEX_CAT_INPUT_FILES=cat ../input/data.nt +QLEVER_INDEX_INPUT_FILES=../input/**/*.ttl +QLEVER_INDEX_CAT_INPUT_FILES=cat ../input/**/*.ttl +QLEVER_INDEX_PARALLEL_PARSING=false # QLEVER_INDEX_SETTINGS_JSON={ "ascii-prefixes-only": false, "num-triples-per-batch": 100000 } # [server] -- 2.51.2