# Private-markets ontology, v1.1 (built for a proposal demo; invented domain data, not a production ontology)
# Formalism: OWL 2 for the ontological relationships, SKOS for the taxonomies (controlled vocabularies).
# Rule of thumb used here: a thing becomes an owl:Class when it carries its own properties or rules
# (a Fund has a manager and a vintage; a FamilyOffice is a kind of investor firm). A value you filter
# or roll up by (stage, sector, geography, deal type, asset class) is a skos:Concept in a scheme.
# External alignment: none in v1.1. FIBO alignment is a v2 step; no FIBO, GICS or NAICS identifiers appear here.

@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix prov:    <http://www.w3.org/ns/prov#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix pm:      <https://semantic-layer.mhndlabs.com/ontology/pm#> .
@prefix pmv:     <https://semantic-layer.mhndlabs.com/vocab/> .

<https://semantic-layer.mhndlabs.com/ontology/pm>
    a owl:Ontology ;
    rdfs:label "Private-markets ontology"@en ;
    owl:versionIRI <https://semantic-layer.mhndlabs.com/ontology/pm/1.1> ;
    owl:versionInfo "1.1" ;
    owl:priorVersion <https://semantic-layer.mhndlabs.com/ontology/pm/1.0> ;
    dcterms:modified "2026-10-20"^^xsd:date ;
    rdfs:comment "v1.1 changes: sector concept 'Cleantech' deprecated and replaced by 'Climate tech'; stage concept 'Series D and later' added; pm:formerName added for firm renames."@en .

# ---------------------------------------------------------------- classes

pm:Organization a owl:Class ; rdfs:label "Organization"@en ;
    rdfs:comment "Any legal organisation: an investor firm or a private company."@en .
pm:InvestorFirm a owl:Class ; rdfs:subClassOf pm:Organization ; rdfs:label "Investor firm"@en ;
    rdfs:comment "An organisation that invests or lends. Always typed with exactly one of its subclasses."@en .
pm:FamilyOffice a owl:Class ; rdfs:subClassOf pm:InvestorFirm ; rdfs:label "Family office"@en .
pm:VentureCapitalFirm a owl:Class ; rdfs:subClassOf pm:InvestorFirm ; rdfs:label "Venture capital firm"@en .
pm:PrivateEquityFirm a owl:Class ; rdfs:subClassOf pm:InvestorFirm ; rdfs:label "Private equity firm"@en .
pm:PrivateCreditManager a owl:Class ; rdfs:subClassOf pm:InvestorFirm ; rdfs:label "Private credit manager"@en .
pm:CorporateInvestor a owl:Class ; rdfs:subClassOf pm:InvestorFirm ; rdfs:label "Corporate investor"@en .
[] a owl:AllDisjointClasses ;
    owl:members ( pm:FamilyOffice pm:VentureCapitalFirm pm:PrivateEquityFirm pm:PrivateCreditManager pm:CorporateInvestor ) .

pm:Company a owl:Class ; rdfs:subClassOf pm:Organization ; rdfs:label "Company"@en ;
    rdfs:comment "A private company that raises capital, sells shares on the secondary market, borrows, or is acquired."@en ;
    owl:disjointWith pm:InvestorFirm .

pm:Fund a owl:Class ; rdfs:label "Fund"@en ;
    rdfs:comment "A pooled investment vehicle (for example 'Fund III, L.P.') managed by an investor firm."@en ;
    rdfs:subClassOf [ a owl:Restriction ; owl:onProperty pm:managedBy ; owl:cardinality "1"^^xsd:nonNegativeInteger ] .

pm:Person a owl:Class ; rdfs:label "Person"@en ;
    rdfs:comment "A professional contact. One canonical Person per real individual, after entity resolution."@en .

pm:Affiliation a owl:Class ; rdfs:label "Affiliation"@en ;
    rdfs:comment "An n-ary relation: a person held a role at an organisation from a start date to an optional end date. No end date means current."@en .

pm:Deal a owl:Class ; rdfs:label "Deal"@en ;
    rdfs:comment "A financing or ownership transaction. Its kind is a pm:dealType concept, not a subclass."@en ;
    rdfs:subClassOf [ a owl:Restriction ; owl:onProperty pm:targetCompany ; owl:minCardinality "1"^^xsd:nonNegativeInteger ] .

# ---------------------------------------------------------------- object properties (ontological relationships)

pm:participatedIn a owl:ObjectProperty ; rdfs:label "participated in"@en ;
    rdfs:domain [ owl:unionOf ( pm:InvestorFirm pm:Fund ) ] ; rdfs:range pm:Deal ;
    rdfs:comment "An investor firm or fund took part in a deal (investor, buyer or lender). A fund's participation is also asserted for its managing firm, with derivation provenance."@en .
pm:ledDeal a owl:ObjectProperty ; rdfs:subPropertyOf pm:participatedIn ; rdfs:label "led deal"@en ;
    rdfs:domain [ owl:unionOf ( pm:InvestorFirm pm:Fund ) ] ; rdfs:range pm:Deal .
pm:targetCompany a owl:ObjectProperty ; rdfs:label "target company"@en ;
    rdfs:domain pm:Deal ; rdfs:range pm:Company ;
    rdfs:comment "The company that raises, whose shares change hands, that borrows, or that is acquired."@en .
pm:managedBy a owl:ObjectProperty , owl:FunctionalProperty ; rdfs:label "managed by"@en ;
    rdfs:domain pm:Fund ; rdfs:range pm:InvestorFirm .
pm:hasPortfolioManager a owl:ObjectProperty ; rdfs:label "has portfolio manager"@en ;
    rdfs:domain pm:Fund ; rdfs:range pm:Person .
pm:hasAffiliation a owl:ObjectProperty ; rdfs:label "has affiliation"@en ;
    rdfs:domain pm:Person ; rdfs:range pm:Affiliation .
pm:affiliatedWith a owl:ObjectProperty ; rdfs:label "affiliated with"@en ;
    rdfs:domain pm:Affiliation ; rdfs:range pm:Organization .

# Taxonomy-valued properties: the range is a concept scheme, enforced by the shapes file, not by OWL.
pm:stage a owl:ObjectProperty ; rdfs:label "stage"@en ; rdfs:domain pm:Deal ; rdfs:range skos:Concept ; pm:rangeScheme pmv:StageScheme .
pm:dealType a owl:ObjectProperty ; rdfs:label "deal type"@en ; rdfs:domain pm:Deal ; rdfs:range skos:Concept ; pm:rangeScheme pmv:DealTypeScheme .
pm:assetClass a owl:ObjectProperty ; rdfs:label "asset class"@en ; rdfs:domain [ owl:unionOf ( pm:Deal pm:Fund ) ] ; rdfs:range skos:Concept ; pm:rangeScheme pmv:AssetClassScheme .
pm:sector a owl:ObjectProperty ; rdfs:label "sector"@en ; rdfs:domain pm:Company ; rdfs:range skos:Concept ; pm:rangeScheme pmv:SectorScheme .
pm:headquarteredIn a owl:ObjectProperty ; rdfs:label "headquartered in"@en ; rdfs:domain pm:Organization ; rdfs:range skos:Concept ; pm:rangeScheme pmv:GeographyScheme .
pm:basedIn a owl:ObjectProperty ; rdfs:label "based in"@en ; rdfs:domain pm:Person ; rdfs:range skos:Concept ; pm:rangeScheme pmv:GeographyScheme .
pm:focusSector a owl:ObjectProperty ; rdfs:label "focus sector"@en ; rdfs:domain pm:InvestorFirm ; rdfs:range skos:Concept ; pm:rangeScheme pmv:SectorScheme ;
    rdfs:comment "Stated investment preference from the firm's profile, not evidence of past deals."@en .
pm:focusStage a owl:ObjectProperty ; rdfs:label "focus stage"@en ; rdfs:domain pm:InvestorFirm ; rdfs:range skos:Concept ; pm:rangeScheme pmv:StageScheme .
pm:focusGeography a owl:ObjectProperty ; rdfs:label "focus geography"@en ; rdfs:domain pm:InvestorFirm ; rdfs:range skos:Concept ; pm:rangeScheme pmv:GeographyScheme .

pm:rangeScheme a owl:AnnotationProperty ; rdfs:label "range scheme"@en ;
    rdfs:comment "The SKOS concept scheme a taxonomy-valued property must draw its values from."@en .

# ---------------------------------------------------------------- data properties

pm:dealSizeUsd a owl:DatatypeProperty ; rdfs:label "deal size (USD)"@en ; rdfs:domain pm:Deal ; rdfs:range xsd:decimal ;
    rdfs:comment "Total round, block, facility or transaction size in US dollars. Must be positive."@en .
pm:announcedDate a owl:DatatypeProperty ; rdfs:label "announced date"@en ; rdfs:domain pm:Deal ; rdfs:range xsd:date .
pm:foundedYear a owl:DatatypeProperty ; rdfs:label "founded year"@en ; rdfs:domain pm:Company ; rdfs:range xsd:integer .
pm:vintageYear a owl:DatatypeProperty ; rdfs:label "vintage year"@en ; rdfs:domain pm:Fund ; rdfs:range xsd:integer .
pm:fundSizeUsd a owl:DatatypeProperty ; rdfs:label "fund size (USD)"@en ; rdfs:domain pm:Fund ; rdfs:range xsd:decimal .
pm:minTicketUsd a owl:DatatypeProperty ; rdfs:label "minimum ticket (USD)"@en ; rdfs:domain pm:InvestorFirm ; rdfs:range xsd:decimal .
pm:maxTicketUsd a owl:DatatypeProperty ; rdfs:label "maximum ticket (USD)"@en ; rdfs:domain pm:InvestorFirm ; rdfs:range xsd:decimal .
pm:role a owl:DatatypeProperty ; rdfs:label "role"@en ; rdfs:domain pm:Affiliation ; rdfs:range xsd:string .
pm:startDate a owl:DatatypeProperty ; rdfs:label "start date"@en ; rdfs:domain pm:Affiliation ; rdfs:range xsd:date .
pm:endDate a owl:DatatypeProperty ; rdfs:label "end date"@en ; rdfs:domain pm:Affiliation ; rdfs:range xsd:date ;
    rdfs:comment "Absent when the affiliation is current."@en .
pm:formerName a owl:DatatypeProperty ; rdfs:label "former name"@en ; rdfs:domain pm:Organization ; rdfs:range xsd:string ;
    dcterms:created "1.1" .
pm:stageOrder a owl:DatatypeProperty ; rdfs:label "stage order"@en ; rdfs:domain skos:Concept ; rdfs:range xsd:integer ;
    rdfs:comment "Position on the stage ladder (Pre-seed = 1). Lets a question say 'Series B or later'."@en .

# ---------------------------------------------------------------- provenance (every instance assertion lives in a named graph)
# Each source record is loaded into its own named graph. That graph node carries the source system,
# a confidence and a last-verified date, so every triple inside it resolves to all three by query.

pm:SourceRecord a owl:Class ; rdfs:subClassOf prov:Entity ; rdfs:label "Source record"@en .
pm:confidence a owl:DatatypeProperty ; rdfs:label "confidence"@en ; rdfs:domain prov:Entity ; rdfs:range xsd:decimal ;
    rdfs:comment "0 to 1. Source reliability times the entity-resolution link score of the record."@en .
pm:lastVerified a owl:DatatypeProperty ; rdfs:label "last verified"@en ; rdfs:domain prov:Entity ; rdfs:range xsd:date .
pm:resolvedFrom a owl:ObjectProperty ; rdfs:label "resolved from"@en ; rdfs:range pm:SourceRecord ;
    rdfs:comment "Links a canonical entity to each source record entity resolution merged into it."@en .
