| 1 | #!/usr/bin/env python3 |
| 2 | """Single source of truth for the Property Business Ontology model. |
| 3 | |
| 4 | Emits model.yaml, ontology.ttl and taxonomy.ttl from the compact declarations |
| 5 | below so that the model ledger and the RDF artefacts never drift. Evidence IDs |
| 6 | refer to evidence.jsonl; sources to sources.yaml. Run: |
| 7 | |
| 8 | python3 build/build_model.py |
| 9 | |
| 10 | from the project root. shapes.ttl, instances.ttl and queries/ are hand-written. |
| 11 | """ |
| 12 | from __future__ import annotations |
| 13 | |
| 14 | import json |
| 15 | from pathlib import Path |
| 16 | |
| 17 | import yaml |
| 18 | |
| 19 | ROOT = Path(__file__).resolve().parent.parent |
| 20 | BASE = "https://ontology.property.local/pbo#" |
| 21 | ONT = "https://ontology.property.local/pbo" |
| 22 | VERSION = "0.1.0" |
| 23 | TODAY = "2026-09-14" |
| 24 | |
| 25 | PREFIXES = f"""@prefix pbo: <{BASE}> . |
| 26 | @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . |
| 27 | @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . |
| 28 | @prefix owl: <http://www.w3.org/2002/07/owl#> . |
| 29 | @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . |
| 30 | @prefix skos: <http://www.w3.org/2004/02/skos/core#> . |
| 31 | @prefix sh: <http://www.w3.org/ns/shacl#> . |
| 32 | @prefix dcterms: <http://purl.org/dc/terms/> . |
| 33 | @prefix prov: <http://www.w3.org/ns/prov#> . |
| 34 | """ |
| 35 | |
| 36 | # --------------------------------------------------------------------------- |
| 37 | # Classes: (local name, label, definition, parents, support, evidence, rationale) |
| 38 | # --------------------------------------------------------------------------- |
| 39 | CLASSES = [ |
| 40 | # --- Parties and roles ------------------------------------------------- |
| 41 | ("Party", "Party", "A person, organisation or government body that can bear a role in relation to a property asset, agreement, authorisation or business activity.", ["prov:Agent"], "modelling_construct", [], "Generalises the persons, companies, trusts, councils and regulators the sources name as landlords, tenants, operators, managers and authorities so that participation can be stated uniformly (DEC-003)."), |
| 42 | ("Person", "Person", "An individual human party, for example an owner-occupier renting rooms, an individual investor or a resident.", ["Party", "prov:Person"], "source_supported", ["EV-041", "EV-052"], None), |
| 43 | ("Organisation", "Organisation", "A legal or business entity such as a company, trust, partnership, agency, franchisor, lender or insurer.", ["Party", "prov:Organization"], "source_supported", ["EV-042", "EV-160"], None), |
| 44 | ("GovernmentBody", "Government body", "A public authority at federal, state or local level that legislates, regulates, registers, licenses, taxes or plans.", ["Organisation"], "source_supported", ["EV-090", "EV-096"], None), |
| 45 | ("LocalCouncil", "Local council", "A local government authority administering a planning scheme, development approvals, premises registration and local compliance.", ["GovernmentBody"], "source_supported", ["EV-094", "EV-097"], None), |
| 46 | ("Regulator", "Regulator", "A government body that administers a regulatory regime, for example the Residential Tenancies Authority, the Australian Taxation Office or Consumer Affairs Victoria.", ["GovernmentBody"], "source_supported", ["EV-090", "EV-092", "EV-130"], None), |
| 47 | ("Business", "Business", "An organisation operating a commercial activity in property, such as a property-management agency, developer, operator or real-estate agency.", ["Organisation"], "source_supported", ["EV-150", "EV-160"], None), |
| 48 | ("PropertyManagementBusiness", "Property management business", "A business that manages properties on behalf of owners under management agreements, holding a rent roll and providing leasing, rent collection, inspection, maintenance and reporting services.", ["Business"], "source_supported", ["EV-150", "EV-151"], None), |
| 49 | ("Role", "Role", "A context-dependent capacity a party bears in relation to a property, agreement or activity (owner, investor, operator, landlord, tenant, resident, property manager, lender, insurer, developer, adviser). Roles are named individuals of this class, bound to parties through participations.", [], "modelling_construct", [], "The same party appears in different capacities across sources (an operator is both the owner's tenant and the residents' landlord; an owner-occupier is a provider). A role individual plus participation node avoids typing parties by role (DEC-003)."), |
| 50 | ("Participation", "Participation", "The occurrence of a party bearing a role in a specific context (an agreement, property asset, development project or business), optionally bounded in time.", [], "modelling_construct", [], "N-ary node needed to answer who bears which role under which agreement and when (DEC-003, DEC-004, CQ-003)."), |
| 51 | |
| 52 | # --- Property assets and identifiers ------------------------------------ |
| 53 | ("PropertyAsset", "Property asset", "A parcel of land, building, dwelling, rentable unit or commercial premises that can be owned, leased, developed or operated.", [], "source_supported", ["EV-170", "EV-171"], None), |
| 54 | ("LandParcel", "Land parcel", "A legally identified parcel of land, described by a lot-on-plan and represented spatially in a cadastre.", ["PropertyAsset"], "source_supported", ["EV-171", "EV-172"], None), |
| 55 | ("Building", "Building", "A structure on land, classified for building-code purposes and containing one or more dwellings or units.", ["PropertyAsset"], "source_supported", ["EV-098", "EV-173"], None), |
| 56 | ("Dwelling", "Dwelling", "A self-contained residential unit of accommodation, whether a detached house, apartment, duplex half, dual-key section or secondary dwelling.", ["PropertyAsset"], "source_supported", ["EV-030", "EV-031"], None), |
| 57 | ("RentableUnit", "Rentable unit", "A room, studio, bed or tenancy unit let separately within a larger property, for example a rooming-house room, a coliving bed or a multi-tenant commercial unit.", ["PropertyAsset"], "source_supported", ["EV-070", "EV-072", "EV-085"], None), |
| 58 | ("CommercialPremises", "Commercial premises", "Property occupied for business purposes such as retail, office, industrial, healthcare or warehouse use.", ["PropertyAsset"], "source_supported", ["EV-080", "EV-083"], None), |
| 59 | ("Portfolio", "Portfolio", "A collection of property assets held or managed together by an investor or business, including a property manager's rent roll.", [], "source_supported", ["EV-025", "EV-151"], None), |
| 60 | ("PropertyIdentifier", "Property identifier", "An identifier that denotes a property asset within some identification scheme (address, lot-on-plan, title reference, cadastral parcel identifier, G-NAF address identifier).", [], "source_supported", ["EV-172", "EV-174"], None), |
| 61 | ("Address", "Address", "A postal or geocoded street address identifying a property.", ["PropertyIdentifier"], "source_supported", ["EV-174"], None), |
| 62 | ("LotOnPlanIdentifier", "Lot-on-plan identifier", "A Queensland-style legal land description consisting of a lot number and registered plan.", ["PropertyIdentifier"], "source_supported", ["EV-172"], None), |
| 63 | ("TitleReference", "Title reference", "The registered title identifier under which ownership and registered interests (mortgages, easements, covenants, leases, caveats) are recorded.", ["PropertyIdentifier"], "source_supported", ["EV-175"], None), |
| 64 | ("CadastralParcelIdentifier", "Cadastral parcel identifier", "The identifier of a parcel in the spatial cadastral fabric.", ["PropertyIdentifier"], "source_supported", ["EV-172"], None), |
| 65 | ("Jurisdiction", "Jurisdiction", "A geographic-legal area (nation, state, local government area, metropolitan region) within which a regulatory regime, tax rule or market statistic applies.", [], "source_supported", ["EV-090", "EV-095"], None), |
| 66 | |
| 67 | # --- Agreements and clauses -------------------------------------------- |
| 68 | ("Agreement", "Agreement", "A contract between two or more parties concerning the occupation, operation, management or use of a property asset, carrying term, rent, permitted use and allocation of obligations and risks.", [], "source_supported", ["EV-060", "EV-061", "EV-081"], None), |
| 69 | ("ResidentialTenancyAgreement", "Residential tenancy agreement", "A general tenancy agreement under which a tenant rents whole residential premises from a lessor.", ["Agreement"], "source_supported", ["EV-050", "EV-051", "EV-073"], None), |
| 70 | ("RoomingAccommodationAgreement", "Rooming accommodation agreement", "An agreement under which a resident rents a room and shares facilities with a provider; in Queensland the prescribed form under the Residential Tenancies and Rooming Accommodation Act 2008.", ["Agreement"], "source_supported", ["EV-089", "EV-090", "EV-091"], None), |
| 71 | ("HeadLease", "Head lease (master lease)", "A lease from the property owner to an operator who then sublets to residents or occupants; the operator pays fixed rent regardless of occupancy.", ["Agreement"], "source_supported", ["EV-060", "EV-062"], None), |
| 72 | ("Sublease", "Sublease", "A letting by a head tenant or operator to an end tenant, resident or occupant of all or part of premises held under a head lease.", ["Agreement"], "source_supported", ["EV-060", "EV-063"], None), |
| 73 | ("ManagementAgreement", "Management agreement", "An agreement under which an operator or property manager manages accommodation or property for an owner in return for a fee and/or revenue or profit share, without fixed head rent.", ["Agreement"], "source_supported", ["EV-064", "EV-152"], None), |
| 74 | ("CorporateLease", "Corporate lease", "A lease of residential property to a company for occupation by its staff, typically furnished and serviced to a higher standard at a premium rent.", ["Agreement"], "source_supported", ["EV-065"], None), |
| 75 | ("CommercialLease", "Commercial lease", "A lease of commercial premises between a lessor and a business lessee, characterised by lease type (gross, net, triple net), term, rent reviews, permitted use and outgoings allocation.", ["Agreement"], "source_supported", ["EV-080", "EV-081"], None), |
| 76 | ("ContractClause", "Contract clause", "A provision within an agreement that allocates a specific right, obligation or contingency, such as subletting permission, break rights, rent escalation, make-good or co-tenancy relief.", [], "source_supported", ["EV-066", "EV-082"], None), |
| 77 | ("CoTenancyClause", "Co-tenancy clause", "A commercial-lease clause allowing a tenant to reduce rent or exercise other rights if an anchor tenant leaves or occupancy falls below an agreed level.", ["ContractClause"], "source_supported", ["EV-082"], None), |
| 78 | ("SublettingPermissionClause", "Subletting permission clause", "An express provision granting the tenant or operator authority to sublet or license the premises to others.", ["ContractClause"], "source_supported", ["EV-066"], None), |
| 79 | ("OutgoingAllocation", "Outgoing allocation", "The assignment of a category of property outgoing (taxes, insurance, maintenance, common-area costs, capital expenditure, utilities) to the party in a given role under a lease type.", [], "modelling_construct", [], "Three-way relation (lease type, outgoing category, bearing role) required by CQ-010; cannot be a binary property."), |
| 80 | |
| 81 | # --- Regulation --------------------------------------------------------- |
| 82 | ("RegulatoryRegime", "Regulatory regime", "A coherent body of rules administered by a regulator under legislation in a jurisdiction that applies to an operating model or accommodation type, may set occupancy thresholds and may require authorisations before operation.", [], "modelling_construct", [], "Sources describe overlapping planning, building, fire, tenancy, residential-service, licensing and tax systems as distinct regimes with their own triggers; a first-class regime node lets CQ-001 and CQ-002 be answered per regime (DEC-004, DEC-007)."), |
| 83 | ("Legislation", "Legislation", "A named statute, regulation, planning provision, code or ruling that establishes a regulatory regime or rule.", ["LegalInstrument"], "source_supported", ["EV-090", "EV-093", "EV-131"], None), |
| 84 | ("LegalInstrument", "Legal instrument", "An information artefact with legal effect, such as legislation, a prescribed form or a planning-scheme provision.", ["InformationArtefact"], "modelling_construct", [], "Groups legislation and prescribed forms (e.g. the RTA rooming-accommodation agreement form) as information artefacts with legal effect."), |
| 85 | ("PrescribedForm", "Prescribed form", "A form mandated by a regulator for a specified agreement or notice, such as Queensland's Form R18 rooming accommodation agreement.", ["LegalInstrument"], "source_supported", ["EV-089", "EV-091"], None), |
| 86 | ("RegulatoryRule", "Regulatory rule", "A specific requirement, restriction or entitlement within a regime that has effective dates, such as a rent-increase frequency limit, a notice period, a levy or a tax deductibility rule.", [], "source_supported", ["EV-099", "EV-130", "EV-131"], None), |
| 87 | ("TaxRule", "Tax rule", "A regulatory rule about income tax, capital gains tax, GST, land tax or duty that applies to a class of property or taxpayer from an effective date, possibly with a grandfathering cut-off.", ["RegulatoryRule"], "source_supported", ["EV-130", "EV-131", "EV-133"], None), |
| 88 | ("OccupancyThreshold", "Occupancy threshold", "A numeric limit on residents, rooms, bedrooms, lettings or floor area that triggers, exempts or bounds the application of a regulatory regime.", [], "modelling_construct", [], "Thresholds such as four or more residents, 1-3 rooms with bond, nine bedrooms / 12 persons / 300 m2 need kind, comparator, value, unit and effect; a literal cannot carry that (DEC-007)."), |
| 89 | ("Authorisation", "Authorisation", "A planning approval, building approval, fire-safety certification, registration, accreditation or licence issued by a government body to a party for a property or operation under a regulatory regime, with a status and validity.", [], "source_supported", ["EV-092", "EV-093", "EV-097"], None), |
| 90 | ("PlanningApproval", "Planning approval", "A development or use approval under a local planning scheme permitting a stated use (for example rooming accommodation) on a site, or an exemption from needing one.", ["Authorisation"], "source_supported", ["EV-094", "EV-097"], None), |
| 91 | ("BuildingApproval", "Building approval", "A building permit, classification change, occupancy approval or compliance notice confirming the building is approved for its intended class and use.", ["Authorisation"], "source_supported", ["EV-098", "EV-092"], None), |
| 92 | ("FireSafetyCertification", "Fire-safety certification", "Documentation that the premises satisfy applicable fire-safety requirements (alarms, exits, emergency lighting, fire-safety management).", ["Authorisation"], "source_supported", ["EV-092", "EV-098"], None), |
| 93 | ("ResidentialServiceRegistration", "Residential service registration", "Queensland registration required before operating a residential service accommodating four or more residents who separately pay for accommodation.", ["Authorisation"], "source_supported", ["EV-092"], None), |
| 94 | ("AccommodationServiceAccreditation", "Accommodation service accreditation", "Queensland accreditation of a registered residential service (Level 1 accommodation; Levels 2-3 where food or personal care are provided), sought within three months of registration.", ["Authorisation"], "source_supported", ["EV-092"], None), |
| 95 | ("RoomingHouseOperatorLicence", "Rooming house operator licence", "The Victorian licence a person or entity must hold before operating a rooming house under the Rooming House Operators Act 2016; one licence can cover multiple premises.", ["Authorisation"], "source_supported", ["EV-093"], None), |
| 96 | ("RoomingHousePremisesRegistration", "Rooming house premises registration", "Victorian registration of each rooming-house premises with the local council under the public-health framework, separate from the operator licence.", ["Authorisation"], "source_supported", ["EV-093"], None), |
| 97 | ("RealEstateAgentLicence", "Real estate agent licence", "A state licence or registration held by a property agent, salesperson or corporation, recorded in a public register such as the Queensland Office of Fair Trading register.", ["Authorisation"], "source_supported", ["EV-153", "EV-142"], None), |
| 98 | |
| 99 | # --- Strategy, models and structures (kind classes; instances are SKOS concepts) --- |
| 100 | ("InvestmentStrategy", "Investment strategy", "A named approach to acquiring, holding, improving, operating or disposing of property to achieve return objectives (for example buy and hold, fix and flip, rooming house, dual income, small-scale development).", [], "source_supported", ["EV-020", "EV-021"], None), |
| 101 | ("OperatingModel", "Operating model", "A named arrangement of who controls the asset, who earns the operating revenue and who bears vacancy and fixed-cost risk (ownership, master lease / rent-to-rent, management or revenue share, hybrid/franchise, corporate leasing, single-lease rental).", [], "source_supported", ["EV-061", "EV-062"], None), |
| 102 | ("AccommodationType", "Accommodation type", "A named physical and occupancy configuration of accommodation (whole-house rental, rooming house / HMO, coliving, boarding house, share house, dual-income configurations, student accommodation, short-stay, single- or multi-tenant commercial).", [], "source_supported", ["EV-070", "EV-071", "EV-075"], None), |
| 103 | ("OwnershipStructure", "Ownership structure", "A legal vehicle through which property is held (individual, joint tenants, tenants in common, discretionary trust, unit trust, company, self-managed super fund).", [], "source_supported", ["EV-040", "EV-041"], None), |
| 104 | ("StructureCharacteristic", "Structure characteristic", "A stated tax, liability, distribution, financing, estate or administrative property of an ownership structure as described by a source.", [], "modelling_construct", [], "CQ-005 needs characteristic-level rows with provenance; a node per characteristic keeps each claim traceable."), |
| 105 | ("LeaseType", "Lease type", "A named commercial or residential lease structure distinguished by duration and outgoings allocation (short-term, long-term, shopping-centre/retail, gross, net, triple net).", [], "source_supported", ["EV-080", "EV-081"], None), |
| 106 | ("TenantConfiguration", "Tenant configuration", "Whether a property is occupied by a single tenant or by multiple tenants under separate leases.", [], "source_supported", ["EV-083", "EV-084"], None), |
| 107 | ("TenantSegment", "Tenant segment", "A demand group that an accommodation product targets (students, young professionals, essential workers, corporate staff, singles and couples, families, new arrivals, temporary workers).", [], "source_supported", ["EV-074", "EV-065"], None), |
| 108 | ("AgencyBusinessModel", "Agency business model", "An organisational structure for a real-estate agency (franchise, cooperative, joint venture, boutique, independent) with characteristic control and capability-sourcing patterns.", [], "source_supported", ["EV-160", "EV-161"], None), |
| 109 | ("BuildingClassification", "Building classification", "A National Construction Code building class (for example Class 1a, Class 1b, Class 3) that determines fire, egress and occupancy requirements.", [], "source_supported", ["EV-098"], None), |
| 110 | ("TaxClassification", "Tax classification", "A tax-law categorisation of a property activity or supply (rental investment, rental-property business, profit-making undertaking, input-taxed residential rent, commercial residential premises).", [], "source_supported", ["EV-022", "EV-133"], None), |
| 111 | ("AuthorisationType", "Authorisation type", "The kind of authorisation a regime requires (planning approval, building approval, fire-safety certification, registration, accreditation, operator licence, premises registration, agent licence).", [], "modelling_construct", [], "Lets a regime state which authorisation kinds it requires without instantiating an authorisation (CQ-001)."), |
| 112 | ("ThresholdKind", "Threshold kind", "What an occupancy threshold counts: residents, unrelated tenants, rooms rented, bedrooms, separate lettings, persons, floor area, dwellings.", [], "modelling_construct", [], "Controlled vocabulary for OccupancyThreshold (DEC-007)."), |
| 113 | ("Metric", "Metric", "A named financial, operating or market measure (gross yield, net yield, NOI, cash-on-cash return, IRR, occupancy, economic vacancy, RevPAR, CAC, EBITDA, EBITDAR, DSCR, LVR, break-even occupancy, median rent, vacancy rate).", [], "source_supported", ["EV-100", "EV-102"], None), |
| 114 | ("RiskCategory", "Risk category", "A grouping of risks by nature (planning-use, building/fire, licensing, tenancy-law, vacancy/turnover, management intensity, insurance, interest-rate/refinancing, valuation/exit, construction-cost, tax-classification, policy, counterparty, market-cycle, data/privacy, key-person).", [], "source_supported", ["EV-120", "EV-121"], None), |
| 115 | ("OutgoingCategory", "Outgoing category", "A category of property operating cost that a lease may allocate: taxes/rates, insurance, maintenance, common-area maintenance, capital expenditure, utilities.", [], "source_supported", ["EV-081"], None), |
| 116 | ("DataAccessTier", "Data access tier", "The access model of a data source: open authoritative, public lookup or government paid, commercial API/extract, first-party, derived internally.", [], "source_supported", ["EV-140"], None), |
| 117 | ("PropertyAttribute", "Property attribute", "A kind of information about a property that a data source can supply (address, parcel boundary, zoning, overlay, flood exposure, school catchment, transport access, demographics, development application, transaction, listing, rent, ownership, title, valuation).", [], "source_supported", ["EV-141", "EV-143"], None), |
| 118 | ("DocumentSection", "Document section", "A named component that a business-planning artefact is recommended to contain (executive summary, market analysis, financial projections, risk and contingency, exit strategy, and so on).", [], "source_supported", ["EV-001", "EV-002"], None), |
| 119 | ("FeeModel", "Fee model", "The way a property-management service is charged: percentage of rent collected, flat fee, hybrid, letting fee, renewal fee, ancillary fees.", [], "source_supported", ["EV-154"], None), |
| 120 | ("CapabilitySourcing", "Capability sourcing", "How an organisation obtains a capability: owned internally, centralised, localised, outsourced, shared through a network, accessed through partnership (inbound/outbound open innovation).", [], "source_supported", ["EV-162", "EV-163"], None), |
| 121 | ("PropertyClass", "Property class for tax purposes", "A category of property to which a tax rule applies: new residential build, established residential, commercial residential premises, build-to-rent project, affordable housing.", [], "source_supported", ["EV-130", "EV-134"], None), |
| 122 | ("ProjectPhase", "Project phase", "A stage in a development or conversion project (acquisition screening, conditional due diligence, concept and approvals, construction, completion, operating approvals, lease-up, ongoing operation).", [], "source_supported", ["EV-105", "EV-010"], None), |
| 123 | |
| 124 | # --- Risk and decision --------------------------------------------------- |
| 125 | ("Risk", "Risk", "An uncertain event or condition that, if it occurs, adversely affects a strategy, operating model, agreement, property or project, categorised and optionally mitigated.", [], "source_supported", ["EV-120", "EV-121", "EV-122"], None), |
| 126 | ("Mitigation", "Mitigation", "A control, action or diligence step recorded as reducing the likelihood or impact of a risk.", [], "source_supported", ["EV-120", "EV-123"], None), |
| 127 | ("DecisionGate", "Decision gate", "A go/no-go condition that must be satisfied before a project proceeds, such as the planning, building/fire, finance and operating gates for a rooming house.", [], "source_supported", ["EV-123", "EV-124"], None), |
| 128 | |
| 129 | # --- Information artefacts ---------------------------------------------- |
| 130 | ("InformationArtefact", "Information artefact", "A document, dataset, model, plan, register or other information object produced or used in property business activity.", ["prov:Entity"], "modelling_construct", [], "Parent for plans, studies, memoranda, models, legal instruments, data sources and corpus source documents; aligned to prov:Entity for provenance."), |
| 131 | ("BusinessPlan", "Business plan", "An internal strategy document describing a business's objectives, structure, market, strategy, operations, finances, risks and exit.", ["InformationArtefact"], "source_supported", ["EV-001", "EV-003", "EV-013"], None), |
| 132 | ("ProjectPlan", "Project plan", "A document describing a specific development project's site, scope, staging, milestones, team and delivery.", ["InformationArtefact"], "source_supported", ["EV-004"], None), |
| 133 | ("FeasibilityStudy", "Feasibility study", "A financial and technical assessment of whether a site and project are viable, covering income and cost streams, structure, risks and projected position.", ["InformationArtefact"], "source_supported", ["EV-005"], None), |
| 134 | ("InformationMemorandum", "Information memorandum", "An external document (typically 25-30 pages) presenting a development to investors or lenders with overview, location, plan, team, market, financial plan, offer and risk management.", ["InformationArtefact"], "source_supported", ["EV-005", "EV-006"], None), |
| 135 | ("FinancialModel", "Financial model", "A projection artefact containing income statement, cash flow, balance sheet, sources and uses, break-even, ROI/IRR and sensitivity analysis.", ["InformationArtefact"], "source_supported", ["EV-007", "EV-008"], None), |
| 136 | ("RiskRegister", "Risk register", "A structured list of risks with owner, likelihood, impact, mitigation, trigger and response.", ["InformationArtefact"], "source_supported", ["EV-009"], None), |
| 137 | ("ImplementationSchedule", "Implementation schedule", "A dated milestone schedule with role matrix, approval gates, governance cadence and reporting.", ["InformationArtefact"], "source_supported", ["EV-010"], None), |
| 138 | ("SourceDocument", "Source document", "A document in the property-pages corpus (scraped article, government page, forum thread, academic paper, synthesis or report) from which claims are drawn.", ["InformationArtefact"], "modelling_construct", [], "Needed so that metric claims and definitions can be attributed to the corpus document that asserted them (CQ-011)."), |
| 139 | ("DataSource", "Data source", "A published dataset, register, API or service that supplies property attributes, identifiers or market statistics for a jurisdiction under an access tier and licence.", ["InformationArtefact"], "source_supported", ["EV-140", "EV-141"], None), |
| 140 | ("Workflow", "Workflow", "A documented operational process of a property business with trigger, responsible role, steps, decision points, records, service standard and escalation path.", ["InformationArtefact"], "source_supported", ["EV-155"], None), |
| 141 | ("Service", "Service", "A defined service a property-management business provides to landlords or tenants, such as tenant screening, lease preparation, rent collection, inspections, maintenance coordination or reporting.", [], "source_supported", ["EV-154", "EV-156"], None), |
| 142 | |
| 143 | # --- Finance ------------------------------------------------------------- |
| 144 | ("FinancialScenario", "Financial scenario", "A named set of underwriting assumptions applied to a property or project (project cost, leverage, interest, rooms, tariff, vacancy, operating-expense ratio, growth) that yields result metrics.", [], "source_supported", ["EV-100", "EV-101"], None), |
| 145 | ("MetricValue", "Metric value", "A value of a metric (numeric value, unit, basis note) as assumed in a scenario, computed as a result, or claimed by a source for a property, market or model.", [], "modelling_construct", [], "Financial figures are always qualified by basis, publisher and date and conflict across sources; a node preserves those qualifiers and provenance (DEC-006, CQ-004, CQ-011)."), |
| 146 | |
| 147 | # --- Activity ------------------------------------------------------------ |
| 148 | ("DevelopmentProject", "Development project", "An activity that acquires, converts, subdivides, builds or repositions property through phases from screening to operation, producing approvals, buildings and artefacts.", ["prov:Activity"], "source_supported", ["EV-011", "EV-105"], None), |
| 149 | ] |
| 150 | |
| 151 | # --------------------------------------------------------------------------- |
| 152 | # Object properties: (name, label, definition, domain, range, support, evidence, rationale, characteristics/inverse) |
| 153 | # --------------------------------------------------------------------------- |
| 154 | OBJ_PROPS = [ |
| 155 | ("hasParticipation", "has participation", "Links an agreement, property asset, development project or business to a participation in which a party bears a role in that context.", None, "Participation", "modelling_construct", [], "Participation pattern (DEC-003). Domain intentionally omitted because several unrelated classes serve as context.", {"inverse": "participationContext"}), |
| 156 | ("participationContext", "participation context", "The agreement, property asset, project or business in which the participation occurs.", "Participation", None, "modelling_construct", [], "Inverse of hasParticipation; range omitted deliberately (DEC-009).", {}), |
| 157 | ("participant", "participant", "The party bearing the role in a participation.", "Participation", "Party", "modelling_construct", [], "Participation pattern (DEC-003).", {"functional": True}), |
| 158 | ("inRole", "in role", "The role borne by the participant in the participation.", "Participation", "Role", "modelling_construct", [], "Participation pattern (DEC-003).", {"functional": True}), |
| 159 | ("ownedBy", "owned by", "Convenience shortcut stating the party that owns the property asset; equivalent in intent to a participation in the Owner role.", "PropertyAsset", "Party", "source_supported", ["EV-050", "EV-062"], None, {}), |
| 160 | ("managedBy", "managed by", "Convenience shortcut stating the party that manages a property asset or portfolio on the owner's behalf.", None, "Party", "source_supported", ["EV-150", "EV-152"], None, {}), |
| 161 | ("operatedBy", "operated by", "Convenience shortcut stating the party that operates accommodation at the property (the operator, provider or head tenant).", "PropertyAsset", "Party", "source_supported", ["EV-060", "EV-071"], None, {}), |
| 162 | ("concernsAsset", "concerns asset", "The property asset (or rentable unit) that an agreement, authorisation, scenario, risk or project concerns.", None, "PropertyAsset", "source_supported", ["EV-060", "EV-092"], None, {}), |
| 163 | ("hasClause", "has clause", "A clause contained in the agreement.", "Agreement", "ContractClause", "source_supported", ["EV-066", "EV-082"], None, {}), |
| 164 | ("leaseType", "classified by lease type", "The lease-type classification of an agreement.", "Agreement", "LeaseType", "source_supported", ["EV-080", "EV-081"], None, {}), |
| 165 | ("agreementUnderHeadLease", "sublease under head lease", "Links a sublease to the head lease from which the operator's right to sublet derives.", "Sublease", "HeadLease", "source_supported", ["EV-060", "EV-063"], None, {}), |
| 166 | ("permittedUse", "permitted use", "The accommodation type or use the agreement permits.", "Agreement", "AccommodationType", "source_supported", ["EV-066", "EV-069"], None, {}), |
| 167 | ("allocatesOutgoing", "allocates outgoing", "Links a lease type or agreement to an outgoing allocation.", None, "OutgoingAllocation", "source_supported", ["EV-081"], None, {}), |
| 168 | ("outgoingCategory", "allocates outgoing category", "The category of outgoing being allocated.", "OutgoingAllocation", "OutgoingCategory", "source_supported", ["EV-081"], None, {}), |
| 169 | ("borneByRole", "borne by role", "The role (landlord/lessor or tenant/lessee) that bears the allocated outgoing.", "OutgoingAllocation", "Role", "source_supported", ["EV-081"], None, {}), |
| 170 | ("locatedIn", "located in", "The jurisdiction in which a property asset is located.", "PropertyAsset", "Jurisdiction", "source_supported", ["EV-095", "EV-170"], None, {}), |
| 171 | ("withinJurisdiction", "within jurisdiction", "Containment of one jurisdiction within a larger one (a local government area within a state within a nation).", "Jurisdiction", "Jurisdiction", "modelling_construct", [], "Needed so that state-level regimes are found for a property located in a local government area (DEC-014).", {"transitive": True}), |
| 172 | ("hasIdentifier", "has identifier", "A property identifier denoting the asset.", "PropertyAsset", "PropertyIdentifier", "source_supported", ["EV-172", "EV-174"], None, {}), |
| 173 | ("partOf", "part of", "Mereological part relation between property assets (a room within a dwelling, a dwelling within a building, a building on a parcel).", "PropertyAsset", "PropertyAsset", "source_supported", ["EV-070", "EV-072"], None, {"transitive": True}), |
| 174 | ("inPortfolio", "in portfolio", "The portfolio that holds or manages the asset.", "PropertyAsset", "Portfolio", "source_supported", ["EV-025", "EV-151"], None, {}), |
| 175 | ("heldUnder", "held under ownership structure", "The ownership structure through which an asset or portfolio is held.", None, "OwnershipStructure", "source_supported", ["EV-040", "EV-043"], None, {}), |
| 176 | ("hasCharacteristic", "has characteristic", "A characteristic a source attributes to an ownership structure.", "OwnershipStructure", "StructureCharacteristic", "source_supported", ["EV-041", "EV-042"], None, {}), |
| 177 | ("hasAccommodationType", "has accommodation type", "The accommodation-type classification of a property asset or rentable unit.", "PropertyAsset", "AccommodationType", "source_supported", ["EV-070", "EV-075"], None, {}), |
| 178 | ("hasBuildingClassification", "has building classification", "The building-code class of a building or dwelling.", "PropertyAsset", "BuildingClassification", "source_supported", ["EV-098"], None, {}), |
| 179 | ("intendedOperatingModel", "intended operating model", "The operating model under which a property is, or is proposed to be, operated.", "PropertyAsset", "OperatingModel", "source_supported", ["EV-061", "EV-106"], None, {}), |
| 180 | ("tenantConfiguration", "uses tenant configuration", "Whether the property is single- or multi-tenant.", "PropertyAsset", "TenantConfiguration", "source_supported", ["EV-083"], None, {}), |
| 181 | ("hasAuthorisation", "has authorisation", "An authorisation held for, or required by, a property asset or party.", None, "Authorisation", "source_supported", ["EV-092", "EV-093"], None, {}), |
| 182 | ("authorisationType", "has authorisation type", "The kind of authorisation.", "Authorisation", "AuthorisationType", "modelling_construct", [], "Binds authorisation instances to the same vocabulary regimes use in requiresAuthorisationType (CQ-001, CQ-015).", {}), |
| 183 | ("issuedBy", "issued by", "The government body that issues or grants the authorisation.", "Authorisation", "GovernmentBody", "source_supported", ["EV-092", "EV-093", "EV-097"], None, {}), |
| 184 | ("authorisedParty", "authorised party", "The party to whom the authorisation is granted (the operator, provider, licensee or applicant).", "Authorisation", "Party", "source_supported", ["EV-093"], None, {}), |
| 185 | ("underRegime", "under regime", "The regulatory regime under which the authorisation is issued or the rule sits.", None, "RegulatoryRegime", "modelling_construct", [], "Connects authorisations and rules to their regime (DEC-004).", {}), |
| 186 | ("appliesIn", "applies in", "The jurisdiction in which a regulatory regime or rule applies.", None, "Jurisdiction", "source_supported", ["EV-090", "EV-093"], None, {}), |
| 187 | ("governedBy", "governed by", "The legislation that establishes the regime or rule.", None, "Legislation", "source_supported", ["EV-090", "EV-093"], None, {}), |
| 188 | ("administeredBy", "administered by", "The regulator or government body that administers the regime.", "RegulatoryRegime", "GovernmentBody", "source_supported", ["EV-090", "EV-092"], None, {}), |
| 189 | ("appliesToOperatingModel", "applies to operating model", "An operating model to which the regime applies.", "RegulatoryRegime", "OperatingModel", "source_supported", ["EV-069", "EV-092"], None, {}), |
| 190 | ("appliesToAccommodationType", "applies to accommodation type", "An accommodation type to which the regime applies.", "RegulatoryRegime", "AccommodationType", "source_supported", ["EV-092", "EV-093"], None, {}), |
| 191 | ("requiresAuthorisationType", "requires authorisation type", "A kind of authorisation that must be obtained before operating under the regime.", "RegulatoryRegime", "AuthorisationType", "source_supported", ["EV-092", "EV-093", "EV-094"], None, {}), |
| 192 | ("hasThreshold", "has threshold", "An occupancy or size threshold that triggers, exempts or bounds the regime.", "RegulatoryRegime", "OccupancyThreshold", "source_supported", ["EV-091", "EV-092", "EV-093", "EV-094"], None, {}), |
| 193 | ("thresholdKind", "has threshold kind", "What the threshold counts.", "OccupancyThreshold", "ThresholdKind", "modelling_construct", [], "DEC-007.", {"functional": True}), |
| 194 | ("hasRule", "has rule", "A specific rule within the regime.", "RegulatoryRegime", "RegulatoryRule", "source_supported", ["EV-099", "EV-130"], None, {}), |
| 195 | ("appliesToPropertyClass", "applies to property class", "The class of property (new build, established, commercial residential, build-to-rent) to which a tax rule applies.", "TaxRule", "PropertyClass", "source_supported", ["EV-130", "EV-134"], None, {}), |
| 196 | ("hasTaxClassification", "has tax classification", "The tax classification attributed to an activity, party, property or supply.", None, "TaxClassification", "source_supported", ["EV-022", "EV-133"], None, {}), |
| 197 | ("prescribesForm", "prescribes form", "A prescribed form required by the regime for an agreement or notice.", "RegulatoryRegime", "PrescribedForm", "source_supported", ["EV-089", "EV-091"], None, {}), |
| 198 | ("strategyUsesOperatingModel", "strategy uses operating model", "An operating model on which the investment strategy relies.", "InvestmentStrategy", "OperatingModel", "source_supported", ["EV-021", "EV-061"], None, {}), |
| 199 | ("strategyUsesAccommodationType", "strategy uses accommodation type", "An accommodation type on which the investment strategy relies.", "InvestmentStrategy", "AccommodationType", "source_supported", ["EV-021", "EV-030"], None, {}), |
| 200 | ("targetsTenantSegment", "targets tenant segment", "A tenant segment that a strategy, accommodation type or property targets.", None, "TenantSegment", "source_supported", ["EV-074", "EV-065"], None, {}), |
| 201 | ("hasStrategy", "has strategy", "The investment strategy applied to a portfolio, asset or project.", None, "InvestmentStrategy", "source_supported", ["EV-020", "EV-025"], None, {}), |
| 202 | ("hasRisk", "has risk", "A risk that applies to the subject (strategy, operating model, agreement, property, project or business).", None, "Risk", "source_supported", ["EV-120", "EV-121", "EV-122"], None, {}), |
| 203 | ("riskCategory", "classified in risk category", "The category of the risk.", "Risk", "RiskCategory", "source_supported", ["EV-120"], None, {}), |
| 204 | ("mitigatedBy", "mitigated by", "A mitigation recorded for the risk.", "Risk", "Mitigation", "source_supported", ["EV-120", "EV-123"], None, {}), |
| 205 | ("hasDecisionGate", "has decision gate", "A decision gate that must be passed for the subject (strategy or project).", None, "DecisionGate", "source_supported", ["EV-123", "EV-124"], None, {}), |
| 206 | ("gateRequiresAuthorisationType", "gate requires authorisation type", "An authorisation type whose confirmation satisfies the decision gate.", "DecisionGate", "AuthorisationType", "source_supported", ["EV-124"], None, {}), |
| 207 | ("hasMetricValue", "has metric value", "A metric value describing the subject (property, portfolio, market claim, scenario).", None, "MetricValue", "modelling_construct", [], "DEC-006.", {}), |
| 208 | ("assumes", "assumes", "A metric value used as an input assumption of the scenario.", "FinancialScenario", "MetricValue", "modelling_construct", [], "DEC-006; distinguishes inputs from results for CQ-004.", {}), |
| 209 | ("yields", "yields", "A metric value produced as a result of the scenario.", "FinancialScenario", "MetricValue", "modelling_construct", [], "DEC-006.", {}), |
| 210 | ("metric", "measures metric", "The metric that the value measures.", "MetricValue", "Metric", "modelling_construct", [], "DEC-006.", {"functional": True}), |
| 211 | ("assertedIn", "asserted in", "The corpus source document that asserts the value, definition or claim.", None, "SourceDocument", "modelling_construct", [], "Statement-level provenance for claims (CQ-011); uses the corpus document rather than PROV qualified attribution to keep the pattern simple.", {}), |
| 212 | ("describesJurisdiction", "describes jurisdiction", "The jurisdiction a metric value, claim or data source refers to.", None, "Jurisdiction", "source_supported", ["EV-110", "EV-140"], None, {}), |
| 213 | ("scenarioForModel", "scenario for operating model", "The operating model or accommodation type that the scenario underwrites.", "FinancialScenario", "OperatingModel", "source_supported", ["EV-100"], None, {}), |
| 214 | ("recommendsSection", "recommends section", "A document section that a source or template recommends the artefact contain.", "InformationArtefact", "DocumentSection", "source_supported", ["EV-001", "EV-002", "EV-006"], None, {}), |
| 215 | ("providesService", "provides service", "A service provided by the business.", "Business", "Service", "source_supported", ["EV-154", "EV-156"], None, {}), |
| 216 | ("hasFeeModel", "has fee model", "The fee model under which a service is charged.", "Service", "FeeModel", "source_supported", ["EV-154"], None, {}), |
| 217 | ("supportedByWorkflow", "supported by workflow", "A workflow that delivers the service.", "Service", "Workflow", "source_supported", ["EV-155"], None, {}), |
| 218 | ("measuredBy", "measured by", "A metric used as a key performance indicator for the business, service or workflow.", None, "Metric", "source_supported", ["EV-157"], None, {}), |
| 219 | ("businessModel", "business model", "The agency business model under which the business is organised.", "Business", "AgencyBusinessModel", "source_supported", ["EV-160"], None, {}), |
| 220 | ("sourcesCapabilityVia", "sources capability via", "The capability-sourcing pattern characteristic of the business model or business.", None, "CapabilitySourcing", "source_supported", ["EV-161", "EV-162"], None, {}), |
| 221 | ("publishedBy", "published by", "The organisation that publishes the data source or document.", "InformationArtefact", "Organisation", "source_supported", ["EV-140", "EV-141"], None, {}), |
| 222 | ("suppliesAttribute", "supplies attribute", "A property attribute the data source can supply.", "DataSource", "PropertyAttribute", "source_supported", ["EV-141", "EV-143"], None, {}), |
| 223 | ("accessTier", "access tier", "The access tier of the data source.", "DataSource", "DataAccessTier", "source_supported", ["EV-140"], None, {}), |
| 224 | ("coversJurisdiction", "covers jurisdiction", "The jurisdiction the data source covers.", "DataSource", "Jurisdiction", "source_supported", ["EV-140", "EV-141"], None, {}), |
| 225 | ("hasPhase", "has phase", "A phase of the development project.", "DevelopmentProject", "ProjectPhase", "source_supported", ["EV-105"], None, {}), |
| 226 | ("precedes", "precedes", "Ordering between project phases.", "ProjectPhase", "ProjectPhase", "source_supported", ["EV-105"], None, {"transitive": True}), |
| 227 | ("producesArtefact", "produces artefact", "An information artefact produced by the project or business activity.", "DevelopmentProject", "InformationArtefact", "source_supported", ["EV-004", "EV-011"], None, {}), |
| 228 | ("usesStrategy", "project uses strategy", "The investment strategy that the development project implements.", "DevelopmentProject", "InvestmentStrategy", "source_supported", ["EV-011", "EV-021"], None, {}), |
| 229 | ("occupancyThresholdEffect", "has threshold effect", "The regime application effect when the threshold is met (regime applies in full, applies in part, does not apply, permit exempt, licence required).", "OccupancyThreshold", "ThresholdEffect", "modelling_construct", [], "DEC-007; controlled values keep effects comparable across jurisdictions.", {}), |
| 230 | ] |
| 231 | |
| 232 | # Threshold effect is a small kind class; add it to CLASSES programmatically. |
| 233 | CLASSES.append(("ThresholdEffect", "Threshold effect", "The regulatory consequence when an occupancy threshold is satisfied: the regime applies in full, applies in part, does not apply, a permit is exempt, or an authorisation becomes required.", [], "modelling_construct", [], "Controlled vocabulary for OccupancyThreshold (DEC-007).")) |
| 234 | |
| 235 | # --------------------------------------------------------------------------- |
| 236 | # Datatype properties: (name, label, definition, domain, range, support, evidence, rationale, functional) |
| 237 | # --------------------------------------------------------------------------- |
| 238 | DATA_PROPS = [ |
| 239 | ("weeklyRent", "weekly rent", "Rent payable per week under an agreement or for a rentable unit, in AUD unless stated.", None, "xsd:decimal", "source_supported", ["EV-067", "EV-110"], None, False), |
| 240 | ("annualRent", "annual rent", "Scheduled rent per year.", None, "xsd:decimal", "source_supported", ["EV-100"], None, False), |
| 241 | ("termMonths", "term (months)", "Duration of an agreement in months.", "Agreement", "xsd:integer", "source_supported", ["EV-067", "EV-081"], None, True), |
| 242 | ("escalationRatePercent", "escalation rate (%)", "Annual rent escalation rate in percent under an agreement.", "Agreement", "xsd:decimal", "source_supported", ["EV-068"], None, True), |
| 243 | ("fixedRent", "fixed rent regardless of occupancy", "Whether the rent obligation is fixed irrespective of occupancy (true for head/master leases).", "Agreement", "xsd:boolean", "source_supported", ["EV-060", "EV-062"], None, True), |
| 244 | ("effectiveFrom", "effective from", "Date from which an agreement, authorisation, rule or regime is in force.", None, "xsd:date", "source_supported", ["EV-130", "EV-131"], None, True), |
| 245 | ("effectiveUntil", "effective until", "Date until which an agreement, authorisation, rule or regime is in force.", None, "xsd:date", "source_supported", ["EV-132"], None, True), |
| 246 | ("cutoffDate", "cut-off date", "A grandfathering or eligibility cut-off date-time attached to a rule (for example 7:30 pm AEST 12 May 2026).", "RegulatoryRule", "xsd:dateTime", "source_supported", ["EV-130"], None, True), |
| 247 | ("thresholdComparator", "threshold comparator", "Comparison operator for the threshold value: 'gte', 'lte', 'gt', 'lt', 'eq', 'range'.", "OccupancyThreshold", "xsd:string", "modelling_construct", [], "DEC-007.", True), |
| 248 | ("thresholdValue", "threshold value", "Numeric threshold value (lower bound for ranges).", "OccupancyThreshold", "xsd:decimal", "modelling_construct", [], "DEC-007.", True), |
| 249 | ("thresholdUpperValue", "threshold upper value", "Upper bound when the comparator is 'range'.", "OccupancyThreshold", "xsd:decimal", "modelling_construct", [], "DEC-007.", True), |
| 250 | ("thresholdUnit", "threshold unit", "Unit of the threshold value (persons, rooms, bedrooms, lettings, m2).", "OccupancyThreshold", "xsd:string", "modelling_construct", [], "DEC-007.", True), |
| 251 | ("numericValue", "numeric value", "The numeric value of a metric value.", "MetricValue", "xsd:decimal", "modelling_construct", [], "DEC-006.", True), |
| 252 | ("upperValue", "upper value", "Upper bound of a metric value reported as a range.", "MetricValue", "xsd:decimal", "modelling_construct", [], "DEC-006; sources quote ranges such as 8-12%.", True), |
| 253 | ("unit", "unit", "Unit of a metric value (percent, AUD, AUD_per_week, months, ratio, EUR).", "MetricValue", "xsd:string", "modelling_construct", [], "DEC-006.", True), |
| 254 | ("basisNote", "basis note", "Free-text statement of the basis, assumptions or qualification attached to a value or claim.", None, "xsd:string", "modelling_construct", [], "Preserves the qualifiers sources attach to figures (DEC-006, DEC-008).", False), |
| 255 | ("claimDate", "claim date", "Date on which a claim or figure was published or is current.", None, "xsd:date", "modelling_construct", [], "CQ-011 requires the date of quantitative claims.", True), |
| 256 | ("roomCount", "room count", "Number of separately lettable rooms or studios in a property.", "PropertyAsset", "xsd:integer", "source_supported", ["EV-072", "EV-100"], None, True), |
| 257 | ("bedroomCount", "bedroom count", "Number of bedrooms.", "PropertyAsset", "xsd:integer", "source_supported", ["EV-076"], None, True), |
| 258 | ("floorAreaSqm", "floor area (m2)", "Total floor area in square metres.", "PropertyAsset", "xsd:decimal", "source_supported", ["EV-076", "EV-094"], None, True), |
| 259 | ("lotSizeSqm", "lot size (m2)", "Land area in square metres.", "LandParcel", "xsd:decimal", "source_supported", ["EV-032"], None, True), |
| 260 | ("identifierValue", "identifier value", "The literal value of a property identifier.", "PropertyIdentifier", "xsd:string", "source_supported", ["EV-172", "EV-174"], None, True), |
| 261 | ("jurisdictionCode", "jurisdiction code", "Short code for a jurisdiction (AU, QLD, VIC, NSW, WA, SA, BCC, LOGAN).", "Jurisdiction", "xsd:string", "modelling_construct", [], "Stable filter key for CQ-001/002/009.", True), |
| 262 | ("authorisationStatus", "authorisation status", "Status of an authorisation: 'held', 'pending', 'expired', 'refused', 'not_required', 'unknown'.", "Authorisation", "xsd:string", "modelling_construct", [], "Needed for CQ-015; SHACL restricts the allowed values.", True), |
| 263 | ("dateIssued", "date issued", "Date the authorisation was issued.", "Authorisation", "xsd:date", "modelling_construct", [], "Authorisation lifecycle (DEC-011).", True), |
| 264 | ("refreshCadence", "refresh cadence", "How often a data source is updated (daily, weekly, quarterly, annual, release-driven, near-real-time).", "DataSource", "xsd:string", "source_supported", ["EV-144"], None, True), |
| 265 | ("licenceNote", "licence note", "Licence or terms under which a data source or document is available.", "InformationArtefact", "xsd:string", "source_supported", ["EV-140", "EV-142"], None, False), |
| 266 | ("sourceUrl", "source URL", "Original location of a source document or data source.", "InformationArtefact", "xsd:anyURI", "modelling_construct", [], "Locator for corpus documents and data sources.", False), |
| 267 | ("publicationDate", "publication date", "Date the artefact was published or compiled.", "InformationArtefact", "xsd:date", "modelling_construct", [], "Currency of claims (CQ-011).", True), |
| 268 | ("authorityLevel", "authority level", "Authority level of a source document: normative, authoritative, primary, secondary, expert, reference, illustrative.", "SourceDocument", "xsd:string", "modelling_construct", [], "Mirrors sources.yaml authority for query-time filtering (CQ-011, DEC-012).", True), |
| 269 | ("scenarioName", "scenario name", "Human-readable name of a financial scenario (conservative, moderate, aggressive).", "FinancialScenario", "xsd:string", "source_supported", ["EV-100"], None, True), |
| 270 | ("characteristicNote", "characteristic note", "Text of a structure characteristic as stated by the source.", "StructureCharacteristic", "xsd:string", "modelling_construct", [], "CQ-005 characteristic rows.", True), |
| 271 | ("mitigationNote", "mitigation note", "Text describing the mitigation, control or diligence step.", "Mitigation", "xsd:string", "modelling_construct", [], "Carries the source wording of mitigations for CQ-007.", True), |
| 272 | ("gateCondition", "gate condition", "Text of the condition a decision gate requires.", "DecisionGate", "xsd:string", "modelling_construct", [], "CQ-007.", True), |
| 273 | ("phaseOrder", "phase order", "Ordinal position of a project phase.", "ProjectPhase", "xsd:integer", "modelling_construct", [], "Deterministic ordering for phase queries.", True), |
| 274 | ("feePercentOfRent", "fee (% of rent)", "Management fee expressed as a percentage of rent collected.", "Service", "xsd:decimal", "source_supported", ["EV-154", "EV-158"], None, True), |
| 275 | ("portfolioSizeProperties", "portfolio size (properties)", "Number of properties under management or held.", "Portfolio", "xsd:integer", "source_supported", ["EV-151", "EV-159"], None, True), |
| 276 | ] |
| 277 | |
| 278 | # --------------------------------------------------------------------------- |
| 279 | # SKOS schemes: scheme local name -> (label, definition, kind class, evidence, [(concept local, prefLabel, definition/scope note, evidence)]) |
| 280 | # --------------------------------------------------------------------------- |
| 281 | SCHEMES = { |
| 282 | "RoleScheme": ("Role scheme", "Roles a party can bear.", "Role", ["EV-050"], [ |
| 283 | ("Role_Owner", "Owner", "Party holding legal ownership of the asset.", ["EV-050", "EV-062"]), |
| 284 | ("Role_Investor", "Investor", "Party deploying capital into property for return.", ["EV-020", "EV-022"]), |
| 285 | ("Role_Operator", "Operator", "Party running the accommodation business at the property (master tenant, rooming-house operator, coliving operator).", ["EV-060", "EV-071"]), |
| 286 | ("Role_Provider", "Provider (rooming accommodation)", "Queensland term for the party providing rooming accommodation to residents.", ["EV-090", "EV-091"]), |
| 287 | ("Role_Landlord", "Landlord / lessor", "Party granting the right to occupy under an agreement.", ["EV-081", "EV-050"]), |
| 288 | ("Role_Tenant", "Tenant / lessee", "Party taking the right to occupy under a tenancy or lease.", ["EV-081", "EV-050"]), |
| 289 | ("Role_Resident", "Resident", "Occupant of a room under rooming accommodation or coliving arrangements.", ["EV-090", "EV-070"]), |
| 290 | ("Role_OwnerOccupier", "Owner-occupier", "Owner who lives at the property while renting rooms.", ["EV-091"]), |
| 291 | ("Role_PropertyManager", "Property manager", "Licensed party managing property for an owner.", ["EV-150", "EV-152"]), |
| 292 | ("Role_Lender", "Lender", "Party providing debt finance secured on the property.", ["EV-024", "EV-026", "EV-125"]), |
| 293 | ("Role_Insurer", "Insurer", "Party insuring the property or business.", ["EV-125", "EV-126"]), |
| 294 | ("Role_Developer", "Developer", "Party undertaking a development project.", ["EV-011", "EV-004"]), |
| 295 | ("Role_Adviser", "Adviser", "Planner, lawyer, accountant, building surveyor, valuer or other professional adviser.", ["EV-012", "EV-123"]), |
| 296 | ("Role_CorporateTenant", "Corporate tenant", "Company leasing residential property for staff.", ["EV-065"]), |
| 297 | ("Role_AnchorTenant", "Anchor tenant", "Major tenant whose presence draws traffic and underpins co-tenancy clauses.", ["EV-082"]), |
| 298 | ("Role_Council", "Council", "Local government in its regulatory role.", ["EV-094", "EV-097"]), |
| 299 | ]), |
| 300 | "InvestmentStrategyScheme": ("Investment strategy scheme", "Named investment strategies described in the corpus.", "InvestmentStrategy", ["EV-020", "EV-021"], [ |
| 301 | ("Strategy_BuyAndHold", "Buy and hold", "Long-term ownership for capital growth and rental income.", ["EV-021"]), |
| 302 | ("Strategy_FixAndFlip", "Fix and flip", "Acquire undervalued property, renovate quickly, sell for gain.", ["EV-021"]), |
| 303 | ("Strategy_RenovateAndRent", "Renovate and rent", "Modernise older assets for long-term tenants.", ["EV-021"]), |
| 304 | ("Strategy_ShortTermRental", "Short-term rental / holiday let", "Target tourist or transient markets; subject to short-stay regulation.", ["EV-021", "EV-099"]), |
| 305 | ("Strategy_CashFlow", "Cash-flow strategy", "Acquire high-yield, low-vacancy property to maximise income.", ["EV-021"]), |
| 306 | ("Strategy_DualIncome", "Dual-income property", "One land parcel configured to produce two rental streams.", ["EV-030", "EV-031"]), |
| 307 | ("Strategy_RoomingHouse", "Rooming house / room-by-room", "Let rooms separately to unrelated residents for higher gross yield with higher management and compliance load.", ["EV-070", "EV-110"]), |
| 308 | ("Strategy_RentToRent", "Rent-to-rent / master lease operation", "Lease from an owner and sublet to residents, capturing the spread.", ["EV-060", "EV-062"]), |
| 309 | ("Strategy_Coliving", "Coliving operation", "Operate shared-living accommodation with services and community.", ["EV-061", "EV-075"]), |
| 310 | ("Strategy_CorporateLeasing", "Corporate leasing", "Let furnished residential property to companies for staff at a premium.", ["EV-065"]), |
| 311 | ("Strategy_CommercialProperty", "Commercial property investment", "Own commercial premises let to business tenants.", ["EV-023", "EV-080"]), |
| 312 | ("Strategy_NewBuildBuyToLet", "New-build buy-to-let", "Acquire newly built residential property to rent, favoured by post-2027 negative-gearing rules.", ["EV-130", "EV-135"]), |
| 313 | ("Strategy_SmallScaleDevelopment", "Small-scale development", "Build, subdivide or convert to manufacture equity and new dwellings (build-and-hold, build-sell-some-hold-some, acquire-convert-hold).", ["EV-011", "EV-135"]), |
| 314 | ("Strategy_ManagedInvestment", "Managed / passive investment", "REITs or managed funds with minimal direct involvement.", ["EV-020"]), |
| 315 | ("Strategy_BuildToRent", "Build-to-rent (institutional)", "Large-scale purpose-built rental with at least 50 self-contained dwellings qualifying for land-tax incentives.", ["EV-134"]), |
| 316 | ]), |
| 317 | "OperatingModelScheme": ("Operating model scheme", "Who controls the asset, earns revenue and bears risk.", "OperatingModel", ["EV-061"], [ |
| 318 | ("OperatingModel_SingleLeaseRental", "Single-lease rental", "Owner lets the whole property under one tenancy, usually via a property manager.", ["EV-073", "EV-050"]), |
| 319 | ("OperatingModel_OwnerOperated", "Owner-operated accommodation", "Owner operates rooming or coliving accommodation directly, retaining NOI and appreciation.", ["EV-061", "EV-062"]), |
| 320 | ("OperatingModel_MasterLease", "Master lease / rent-to-rent", "Operator holds a head lease at fixed rent and sublets to residents; bears vacancy and operating risk.", ["EV-060", "EV-062"]), |
| 321 | ("OperatingModel_ManagementRevenueShare", "Management / revenue share", "Operator manages for the owner for a fee or share of revenue or profit; no fixed head rent.", ["EV-064"]), |
| 322 | ("OperatingModel_HybridFranchise", "Hybrid / franchise", "Brand and systems separated from local capital; operator margin plus or minus royalties.", ["EV-064", "EV-061"]), |
| 323 | ("OperatingModel_CorporateLeasing", "Corporate leasing", "Landlord lets furnished residential property to a company; treated as a demand channel rather than an ownership structure.", ["EV-065"]), |
| 324 | ("OperatingModel_OwnerOccupierRooms", "Owner-occupier renting rooms", "Owner lives in and rents one or more rooms; tenancy-law application depends on room count and bonds.", ["EV-091"]), |
| 325 | ("OperatingModel_ShortStay", "Short-stay accommodation", "Transient accommodation under 28 days (Victoria), subject to levy, planning and owners-corporation rules.", ["EV-099"]), |
| 326 | ]), |
| 327 | "AccommodationTypeScheme": ("Accommodation type scheme", "Physical and occupancy configurations of accommodation.", "AccommodationType", ["EV-070"], [ |
| 328 | ("AccommodationType_WholeDwellingRental", "Whole-dwelling rental", "Entire house or apartment let under one agreement.", ["EV-073"]), |
| 329 | ("AccommodationType_RoomingHouse", "Rooming house / rooming accommodation", "Rooms let separately with shared facilities; definitions vary by state and source (four or more unrelated residents; up to five lets in Brisbane; five-studio or six-bedroom purpose-built layouts).", ["EV-070", "EV-071", "EV-072", "EV-077"]), |
| 330 | ("AccommodationType_HMO", "House in multiple occupation (HMO)", "UK-derived term for room-by-room letting to unrelated tenants sharing communal facilities; used interchangeably with rooming house in Australian marketing.", ["EV-074"]), |
| 331 | ("AccommodationType_BoardingHouse", "Boarding house", "Historic term for room-by-room accommodation; may be classified as commercial residential premises for GST.", ["EV-070", "EV-133"]), |
| 332 | ("AccommodationType_ShareHouse", "Share house / co-tenancy", "Unrelated co-tenants on one or several leases without an operator; not a rooming house per Consumer Affairs Victoria.", ["EV-073", "EV-093"]), |
| 333 | ("AccommodationType_Coliving", "Coliving", "Private rooms or beds with shared spaces, community services and operating technology.", ["EV-075"]), |
| 334 | ("AccommodationType_PurposeBuiltStudios", "Purpose-built self-contained studios", "Rooming accommodation designed as self-contained studios with ensuite and kitchenette plus common areas.", ["EV-072", "EV-077"]), |
| 335 | ("AccommodationType_StudentAccommodation", "Student accommodation", "Accommodation for students; may be exempt from residential-service registration in Queensland.", ["EV-092", "EV-070"]), |
| 336 | ("AccommodationType_Duplex", "Duplex", "Two dwellings side-by-side or front/rear on one lot, single title or subdivided.", ["EV-031"]), |
| 337 | ("AccommodationType_DualKey", "Dual key", "One building with two self-contained sections on one title.", ["EV-031"]), |
| 338 | ("AccommodationType_DualOccupancy", "Dual occupancy", "Two dwellings on one lot.", ["EV-031"]), |
| 339 | ("AccommodationType_SecondaryDwelling", "Secondary dwelling / granny flat", "Smaller secondary dwelling (60-80 m2 typical; under 70 m2 ancillary in WA/SA) on the same lot as a primary home.", ["EV-031", "EV-032"]), |
| 340 | ("AccommodationType_ShortStay", "Short-stay accommodation", "Transient accommodation for tourists or workers.", ["EV-099", "EV-021"]), |
| 341 | ("AccommodationType_CorporateFurnished", "Corporate furnished housing", "Hotel-like furnished residential property for corporate staff.", ["EV-065"]), |
| 342 | ("AccommodationType_SingleTenantCommercial", "Single-tenant commercial property", "Commercial property occupied by one lessee, often on a long net lease.", ["EV-083"]), |
| 343 | ("AccommodationType_MultiTenantCommercial", "Multi-tenant commercial property", "Property with several lessees in separate units (office centre, shopping mall, industrial estate, healthcare centre).", ["EV-084"]), |
| 344 | ("AccommodationType_Coworking", "Co-working space", "Shared office environment for sole operators and small businesses.", ["EV-086"]), |
| 345 | ]), |
| 346 | "OwnershipStructureScheme": ("Ownership structure scheme", "Legal vehicles for holding property.", "OwnershipStructure", ["EV-040"], [ |
| 347 | ("Structure_Individual", "Individual / personal name", "Property held personally; simplest, suits negative gearing with low personal risk.", ["EV-041"]), |
| 348 | ("Structure_JointTenants", "Joint tenants", "Equal shares; ownership passes to the surviving joint tenant.", ["EV-041"]), |
| 349 | ("Structure_TenantsInCommon", "Tenants in common", "Specified shares that pass to each owner's estate.", ["EV-041"]), |
| 350 | ("Structure_DiscretionaryTrust", "Discretionary (family) trust", "Trustee distributes income at discretion; some asset protection; higher land-tax rates in some states.", ["EV-042", "EV-136"]), |
| 351 | ("Structure_UnitTrust", "Unit trust", "Fixed interests suited to unrelated investors; asset protection.", ["EV-042"]), |
| 352 | ("Structure_Company", "Company", "Corporate ownership; loses the 50% CGT discount.", ["EV-042", "EV-136"]), |
| 353 | ("Structure_SMSF", "Self-managed superannuation fund", "Retirement-focused holding vehicle with liquidity constraints.", ["EV-042"]), |
| 354 | ]), |
| 355 | "LeaseTypeScheme": ("Lease type scheme", "Lease structures by duration and outgoings allocation.", "LeaseType", ["EV-080", "EV-081"], [ |
| 356 | ("LeaseType_ShortTerm", "Short-term renting", "Flexible short occupation with reduced security of tenure.", ["EV-080"]), |
| 357 | ("LeaseType_LongTerm", "Long-term lease", "Longer commitment giving stability; early termination carries consequences.", ["EV-080"]), |
| 358 | ("LeaseType_ShoppingCentre", "Shopping-centre / retail shop lease", "Lease in a centre of five or more shops with centre-specific restrictions and retail-lease legislation.", ["EV-080"]), |
| 359 | ("LeaseType_Gross", "Gross lease", "Landlord bears most outgoings; tenant pays rent only.", ["EV-081"]), |
| 360 | ("LeaseType_Net", "Net lease", "Tenant pays rent plus some outgoings.", ["EV-081"]), |
| 361 | ("LeaseType_TripleNet", "Triple-net lease", "Tenant pays taxes, insurance and maintenance in addition to rent.", ["EV-081"]), |
| 362 | ]), |
| 363 | "TenantConfigurationScheme": ("Tenant configuration scheme", "Single versus multiple tenants.", "TenantConfiguration", ["EV-083"], [ |
| 364 | ("TenantConfiguration_Single", "Single-tenant", "One lessee occupies the entire property.", ["EV-083"]), |
| 365 | ("TenantConfiguration_Multi", "Multi-tenant", "Several lessees occupy separate units.", ["EV-084"]), |
| 366 | ]), |
| 367 | "TenantSegmentScheme": ("Tenant segment scheme", "Demand groups targeted by accommodation products.", "TenantSegment", ["EV-074"], [ |
| 368 | ("Segment_Students", "Students", None, ["EV-074", "EV-070"]), |
| 369 | ("Segment_YoungProfessionals", "Young professionals", None, ["EV-074"]), |
| 370 | ("Segment_EssentialWorkers", "Healthcare and essential workers", None, ["EV-074"]), |
| 371 | ("Segment_TemporaryWorkers", "Temporary or seasonal workers", None, ["EV-074"]), |
| 372 | ("Segment_CorporateStaff", "Corporate staff / travelling employees", None, ["EV-065"]), |
| 373 | ("Segment_SinglesAndCouples", "Singles and couples", "Underserved for studio and one-bed accommodation.", ["EV-078"]), |
| 374 | ("Segment_NewArrivals", "New arrivals / migrants", None, ["EV-074"]), |
| 375 | ("Segment_Families", "Families", "Not a target for HMO products.", ["EV-074"]), |
| 376 | ("Segment_Tourists", "Tourists / transient visitors", None, ["EV-021"]), |
| 377 | ("Segment_BusinessOccupiers", "Business occupiers", "Retail, office, industrial, healthcare and warehouse tenants.", ["EV-083"]), |
| 378 | ]), |
| 379 | "AgencyBusinessModelScheme": ("Agency business model scheme", "Organisational models for real-estate agencies.", "AgencyBusinessModel", ["EV-160"], [ |
| 380 | ("AgencyModel_Franchise", "Franchise agency", "Franchisees operate under a franchisor's brand and system for fees; resources controlled internally.", ["EV-160", "EV-161"]), |
| 381 | ("AgencyModel_Cooperative", "Cooperative agency", "Independently owned agencies under a licence arrangement sharing services.", ["EV-160"]), |
| 382 | ("AgencyModel_JointVenture", "Joint-venture agency", "Main owner/operator holds a majority interest in each operating unit.", ["EV-160"]), |
| 383 | ("AgencyModel_Boutique", "Boutique agency", "Large independent organisation under a single owner/operator with multiple managed units.", ["EV-160"]), |
| 384 | ("AgencyModel_Independent", "Independent agency", "Fully independent agency supported by specialist networks; sources capabilities externally.", ["EV-160", "EV-161"]), |
| 385 | ]), |
| 386 | "BuildingClassificationScheme": ("Building classification scheme", "National Construction Code building classes referenced in the corpus.", "BuildingClassification", ["EV-098"], [ |
| 387 | ("BuildingClass_1a", "Class 1a", "Single dwelling (detached house, townhouse).", ["EV-098"]), |
| 388 | ("BuildingClass_1b", "Class 1b", "Boarding house, guest house or hostel with limited residents and floor area.", ["EV-098"]), |
| 389 | ("BuildingClass_3", "Class 3", "Residential building for unrelated persons (larger shared accommodation, hostels).", ["EV-098"]), |
| 390 | ]), |
| 391 | "TaxClassificationScheme": ("Tax classification scheme", "Tax-law categorisations of property activity.", "TaxClassification", ["EV-022"], [ |
| 392 | ("Tax_RentalInvestment", "Rental property investment", "Passive letting; most owners even with multiple properties.", ["EV-022"]), |
| 393 | ("Tax_RentalBusiness", "Carrying on a rental-property business", "Significant scale, hours, personal involvement and business-like conduct (TR 97/11 indicators).", ["EV-022"]), |
| 394 | ("Tax_ProfitMakingUndertaking", "Profit-making undertaking / development business", "Property acquired, developed or subdivided for profitable resale; profit is ordinary income.", ["EV-133"]), |
| 395 | ("Tax_InputTaxedResidentialRent", "Input-taxed residential rent", "Ordinary residential rent: no GST charged, no GST credits.", ["EV-133"]), |
| 396 | ("Tax_CommercialResidentialPremises", "Commercial residential premises", "Hotels, motels, hostels, boarding houses whose lease can be subject to GST.", ["EV-133"]), |
| 397 | ]), |
| 398 | "AuthorisationTypeScheme": ("Authorisation type scheme", "Kinds of authorisation regimes require.", "AuthorisationType", [], [ |
| 399 | ("AuthType_PlanningApproval", "Planning approval", None, ["EV-094", "EV-097"]), |
| 400 | ("AuthType_BuildingApproval", "Building approval / classification", None, ["EV-098"]), |
| 401 | ("AuthType_FireSafety", "Fire-safety certification", None, ["EV-092", "EV-098"]), |
| 402 | ("AuthType_ResidentialServiceRegistration", "Residential service registration (QLD)", None, ["EV-092"]), |
| 403 | ("AuthType_Accreditation", "Accommodation service accreditation (QLD)", None, ["EV-092"]), |
| 404 | ("AuthType_OperatorLicence", "Rooming house operator licence (VIC)", None, ["EV-093"]), |
| 405 | ("AuthType_PremisesRegistration", "Premises registration with council (VIC)", None, ["EV-093"]), |
| 406 | ("AuthType_AgentLicence", "Real estate agent licence", None, ["EV-153"]), |
| 407 | ("AuthType_LenderApproval", "Lender acceptance of proposed use", "Not a government authorisation; recorded because sources treat it as a gate.", ["EV-124", "EV-125"]), |
| 408 | ("AuthType_InsurerConfirmation", "Insurer confirmation of use", "Not a government authorisation; recorded because sources treat it as a gate.", ["EV-125", "EV-126"]), |
| 409 | ]), |
| 410 | "ThresholdKindScheme": ("Threshold kind scheme", "What occupancy thresholds count.", "ThresholdKind", [], [ |
| 411 | ("ThresholdKind_Residents", "Residents", None, ["EV-092"]), |
| 412 | ("ThresholdKind_UnrelatedTenants", "Unrelated tenants", None, ["EV-071"]), |
| 413 | ("ThresholdKind_RoomsRented", "Rooms rented", None, ["EV-091"]), |
| 414 | ("ThresholdKind_Bedrooms", "Bedrooms", None, ["EV-094"]), |
| 415 | ("ThresholdKind_Persons", "Persons", None, ["EV-094"]), |
| 416 | ("ThresholdKind_SeparateLettings", "Separate lettings", None, ["EV-077"]), |
| 417 | ("ThresholdKind_FloorArea", "Floor area", None, ["EV-094", "EV-077"]), |
| 418 | ("ThresholdKind_Dwellings", "Dwellings", None, ["EV-134"]), |
| 419 | ("ThresholdKind_StayLength", "Length of stay (days)", None, ["EV-099"]), |
| 420 | ("ThresholdKind_Shops", "Shops in a centre", None, ["EV-080"]), |
| 421 | ]), |
| 422 | "ThresholdEffectScheme": ("Threshold effect scheme", "Consequences of meeting a threshold.", "ThresholdEffect", [], [ |
| 423 | ("Effect_RegimeAppliesInFull", "Regime applies in full", None, ["EV-091"]), |
| 424 | ("Effect_RegimeAppliesInPart", "Regime applies in part", None, ["EV-091"]), |
| 425 | ("Effect_RegimeDoesNotApply", "Regime does not apply", None, ["EV-091"]), |
| 426 | ("Effect_PermitExempt", "Planning permit exempt", None, ["EV-094"]), |
| 427 | ("Effect_AuthorisationRequired", "Authorisation required", None, ["EV-092", "EV-093"]), |
| 428 | ("Effect_IncentiveEligible", "Incentive eligibility", None, ["EV-134"]), |
| 429 | ]), |
| 430 | "MetricScheme": ("Metric scheme", "Financial, operating and market metrics.", "Metric", ["EV-100", "EV-102"], [ |
| 431 | ("Metric_GrossYield", "Gross rental yield", "Annual rent divided by price or value, before costs.", ["EV-110", "EV-102"]), |
| 432 | ("Metric_NetYield", "Net yield", "Yield after operating costs.", ["EV-102"]), |
| 433 | ("Metric_NOI", "Net operating income", "Revenue less operating expenses before debt and capex.", ["EV-102", "EV-100"]), |
| 434 | ("Metric_NOIMargin", "NOI margin", None, ["EV-102"]), |
| 435 | ("Metric_CashOnCash", "Cash-on-cash return", "Year-one pre-tax cash flow over initial equity.", ["EV-100"]), |
| 436 | ("Metric_IRR", "Internal rate of return", None, ["EV-100"]), |
| 437 | ("Metric_Occupancy", "Occupancy", None, ["EV-102"]), |
| 438 | ("Metric_EconomicVacancy", "Economic vacancy / bad-debt allowance", None, ["EV-100"]), |
| 439 | ("Metric_VacancyRate", "Market vacancy rate", None, ["EV-103"]), |
| 440 | ("Metric_BreakEvenOccupancy", "Break-even occupancy", None, ["EV-102"]), |
| 441 | ("Metric_BreakEvenMonths", "Break-even period (months)", None, ["EV-104"]), |
| 442 | ("Metric_RevPAR", "Revenue per available room/bed", None, ["EV-102"]), |
| 443 | ("Metric_CAC", "Customer acquisition cost", None, ["EV-102"]), |
| 444 | ("Metric_EBITDA", "EBITDA margin", None, ["EV-102"]), |
| 445 | ("Metric_EBITDAR", "EBITDAR margin", "Earnings before rent; useful for asset-light operators.", ["EV-102"]), |
| 446 | ("Metric_OperatingMargin", "Operating margin", None, ["EV-104"]), |
| 447 | ("Metric_CapRate", "Capitalisation rate", None, ["EV-102"]), |
| 448 | ("Metric_DSCR", "Debt service coverage ratio", None, ["EV-024"]), |
| 449 | ("Metric_LVR", "Loan-to-value ratio", None, ["EV-024", "EV-100"]), |
| 450 | ("Metric_InterestRate", "Interest rate", None, ["EV-100"]), |
| 451 | ("Metric_OperatingExpenseRatio", "Operating expense ratio", None, ["EV-100"]), |
| 452 | ("Metric_WeeklyRoomTariff", "Weekly room tariff", None, ["EV-100", "EV-110"]), |
| 453 | ("Metric_ProjectCost", "All-in project cost", None, ["EV-100"]), |
| 454 | ("Metric_CapitalRequired", "Capital required per property", None, ["EV-104"]), |
| 455 | ("Metric_MedianRent", "Median weekly rent", None, ["EV-103"]), |
| 456 | ("Metric_MedianPrice", "Median dwelling price", None, ["EV-103"]), |
| 457 | ("Metric_RentGrowth", "Rent growth rate", None, ["EV-100"]), |
| 458 | ("Metric_ValueGrowth", "Asset value growth rate", None, ["EV-100"]), |
| 459 | ("Metric_YearOneCashFlow", "Year-one pre-tax cash flow", None, ["EV-100"]), |
| 460 | ("Metric_PropertiesUnderManagement", "Properties under management", None, ["EV-157", "EV-159"]), |
| 461 | ("Metric_Arrears", "Arrears", None, ["EV-157"]), |
| 462 | ("Metric_DaysToLease", "Days to lease / leasing velocity", None, ["EV-157"]), |
| 463 | ("Metric_LandlordRetention", "Landlord retention", None, ["EV-157"]), |
| 464 | ("Metric_RevenuePerProperty", "Revenue per property", None, ["EV-157"]), |
| 465 | ("Metric_ManagementFeeIncome", "Management fee income", None, ["EV-159"]), |
| 466 | ("Metric_Depreciation", "Depreciation deduction", None, ["EV-033"]), |
| 467 | ]), |
| 468 | "RiskCategoryScheme": ("Risk category scheme", "Categories of risk.", "RiskCategory", ["EV-120"], [ |
| 469 | ("RiskCat_PlanningUse", "Planning-use risk", None, ["EV-120"]), |
| 470 | ("RiskCat_BuildingFire", "Building-classification and fire-safety risk", None, ["EV-120"]), |
| 471 | ("RiskCat_Licensing", "Licensing / registration risk", None, ["EV-120"]), |
| 472 | ("RiskCat_TenancyLaw", "Tenancy-law risk", None, ["EV-120"]), |
| 473 | ("RiskCat_Vacancy", "Vacancy / tenant churn risk", None, ["EV-120", "EV-121"]), |
| 474 | ("RiskCat_ManagementIntensity", "Management intensity risk", None, ["EV-120", "EV-121"]), |
| 475 | ("RiskCat_Insurance", "Insurance risk", None, ["EV-120", "EV-126"]), |
| 476 | ("RiskCat_InterestRate", "Interest-rate / refinancing risk", None, ["EV-120", "EV-024"]), |
| 477 | ("RiskCat_Valuation", "Valuation / exit / resale risk", None, ["EV-120", "EV-125"]), |
| 478 | ("RiskCat_ConstructionCost", "Construction-cost risk", None, ["EV-120", "EV-009"]), |
| 479 | ("RiskCat_TaxClassification", "Tax-classification risk", None, ["EV-120", "EV-133"]), |
| 480 | ("RiskCat_Policy", "Policy / regulatory-change risk", None, ["EV-120", "EV-009"]), |
| 481 | ("RiskCat_Counterparty", "Counterparty risk", None, ["EV-121", "EV-062"]), |
| 482 | ("RiskCat_MarketCycle", "Market-cycle risk", None, ["EV-120", "EV-009"]), |
| 483 | ("RiskCat_Concentration", "Concentration risk (tenant, asset, lender)", None, ["EV-083", "EV-025"]), |
| 484 | ("RiskCat_DataPrivacy", "Data, privacy and cyber risk", None, ["EV-122"]), |
| 485 | ("RiskCat_KeyPerson", "Key-person and staffing risk", None, ["EV-122"]), |
| 486 | ("RiskCat_TrustAccount", "Trust-account risk", None, ["EV-122"]), |
| 487 | ("RiskCat_UtilityCost", "Utility-cost risk", None, ["EV-120"]), |
| 488 | ("RiskCat_LeaseEscalation", "Lease escalation risk", None, ["EV-121", "EV-068"]), |
| 489 | ]), |
| 490 | "OutgoingCategoryScheme": ("Outgoing category scheme", "Categories of outgoings allocated by leases.", "OutgoingCategory", ["EV-081"], [ |
| 491 | ("Outgoing_Taxes", "Taxes and rates", None, ["EV-081"]), |
| 492 | ("Outgoing_Insurance", "Insurance", None, ["EV-081"]), |
| 493 | ("Outgoing_Maintenance", "Property maintenance", None, ["EV-081"]), |
| 494 | ("Outgoing_CommonArea", "Common-area maintenance", None, ["EV-081"]), |
| 495 | ("Outgoing_Capex", "Capital expenditure", None, ["EV-081"]), |
| 496 | ("Outgoing_Utilities", "Utilities", None, ["EV-074", "EV-104"]), |
| 497 | ]), |
| 498 | "DataAccessTierScheme": ("Data access tier scheme", "Access models for data sources.", "DataAccessTier", ["EV-140"], [ |
| 499 | ("Tier_OpenAuthoritative", "Open authoritative", "Default open government source.", ["EV-140"]), |
| 500 | ("Tier_PublicPaid", "Public lookup / government paid", "Legal identity, ownership, official transaction verification.", ["EV-140"]), |
| 501 | ("Tier_Commercial", "Commercial API / extract", "Listings, rich attributes, transactions at scale, AVMs.", ["EV-140"]), |
| 502 | ("Tier_FirstParty", "First-party", "CRM, leasing system, campaigns, website analytics.", ["EV-140"]), |
| 503 | ("Tier_Derived", "Derived internally", "Scores, yields, forecasts.", ["EV-140"]), |
| 504 | ]), |
| 505 | "PropertyAttributeScheme": ("Property attribute scheme", "Kinds of property information data sources supply.", "PropertyAttribute", ["EV-141"], [ |
| 506 | ("Attr_Address", "Address / geocode", None, ["EV-174"]), |
| 507 | ("Attr_ParcelBoundary", "Parcel boundary / lot-on-plan", None, ["EV-172"]), |
| 508 | ("Attr_Zoning", "Zoning and overlays", None, ["EV-143"]), |
| 509 | ("Attr_DevelopmentApplication", "Development applications", None, ["EV-143"]), |
| 510 | ("Attr_FloodHazard", "Flood and natural-hazard exposure", None, ["EV-143"]), |
| 511 | ("Attr_SchoolCatchment", "School catchment", None, ["EV-143"]), |
| 512 | ("Attr_TransportAccess", "Public-transport accessibility", None, ["EV-143"]), |
| 513 | ("Attr_Demographics", "Demographics and population projections", None, ["EV-143"]), |
| 514 | ("Attr_Crime", "Crime context", None, ["EV-143"]), |
| 515 | ("Attr_ClimateProjection", "Climate projections", None, ["EV-143"]), |
| 516 | ("Attr_Transaction", "Transacted sales / sale history", None, ["EV-141"]), |
| 517 | ("Attr_Ownership", "Ownership and registered interests", None, ["EV-175"]), |
| 518 | ("Attr_Title", "Title reference", None, ["EV-175"]), |
| 519 | ("Attr_Listing", "Current sale and rental listings", None, ["EV-141"]), |
| 520 | ("Attr_Rent", "Median rents / bond lodgements", None, ["EV-143"]), |
| 521 | ("Attr_Valuation", "Valuation / AVM", None, ["EV-141"]), |
| 522 | ("Attr_DwellingAttributes", "Dwelling attributes (bed/bath/car)", None, ["EV-141"]), |
| 523 | ("Attr_AgentLicence", "Agent licence status", None, ["EV-142"]), |
| 524 | ("Attr_PortalEngagement", "Portal engagement and enquiries", None, ["EV-141"]), |
| 525 | ("Attr_PoolRegister", "Pool safety register", None, ["EV-143"]), |
| 526 | ("Attr_SolarPenetration", "Solar installation penetration", None, ["EV-143"]), |
| 527 | ("Attr_DevelopmentPipeline", "Development pipeline statistics", None, ["EV-143"]), |
| 528 | ]), |
| 529 | "DocumentSectionScheme": ("Document section scheme", "Sections recommended for business-planning artefacts.", "DocumentSection", ["EV-001"], [ |
| 530 | ("Section_ExecutiveSummary", "Executive summary", None, ["EV-001", "EV-002"]), |
| 531 | ("Section_CompanyDescription", "Company description and structure", None, ["EV-001"]), |
| 532 | ("Section_MarketAnalysis", "Market analysis", None, ["EV-001", "EV-002"]), |
| 533 | ("Section_ProjectDescription", "Project description", None, ["EV-002", "EV-004"]), |
| 534 | ("Section_DevelopmentStrategy", "Development strategy", None, ["EV-001"]), |
| 535 | ("Section_MarketingAndSales", "Marketing and sales", None, ["EV-001"]), |
| 536 | ("Section_FinancialProjections", "Financial projections and funding", None, ["EV-001", "EV-007"]), |
| 537 | ("Section_OperationalPlan", "Operational plan", None, ["EV-001"]), |
| 538 | ("Section_RiskAndContingency", "Risk and contingency", None, ["EV-001", "EV-009", "EV-014"]), |
| 539 | ("Section_ExitStrategy", "Exit strategy", None, ["EV-001"]), |
| 540 | ("Section_TimelineMilestones", "Timeline and milestones", None, ["EV-002", "EV-010"]), |
| 541 | ("Section_TeamCredentials", "Team and participant credentials", None, ["EV-006"]), |
| 542 | ("Section_LocationDetails", "Location details", None, ["EV-006"]), |
| 543 | ("Section_InvestmentOffer", "Investment / lending offer", None, ["EV-006"]), |
| 544 | ("Section_ServicesAndFees", "Services and fee structure", None, ["EV-156"]), |
| 545 | ("Section_ComplianceTrustAccounting", "Compliance and trust accounting", None, ["EV-156"]), |
| 546 | ("Section_TechnologyStrategy", "Technology and portal strategy", None, ["EV-156"]), |
| 547 | ("Section_StaffingPlan", "Team structure and staffing plan", None, ["EV-156"]), |
| 548 | ("Section_KPIs", "KPIs and management reporting", None, ["EV-156"]), |
| 549 | ("Section_SWOT", "SWOT analysis", None, ["EV-003"]), |
| 550 | ]), |
| 551 | "FeeModelScheme": ("Fee model scheme", "Charging models for property-management services.", "FeeModel", ["EV-154"], [ |
| 552 | ("Fee_PercentOfRent", "Percentage of rent collected", None, ["EV-154"]), |
| 553 | ("Fee_Flat", "Flat management fee", None, ["EV-154"]), |
| 554 | ("Fee_Hybrid", "Hybrid", None, ["EV-154"]), |
| 555 | ("Fee_Letting", "Letting fee", None, ["EV-154"]), |
| 556 | ("Fee_Renewal", "Lease renewal fee", None, ["EV-154"]), |
| 557 | ("Fee_Advertising", "Advertising fee", None, ["EV-154"]), |
| 558 | ("Fee_Ancillary", "Ancillary / referral fees", None, ["EV-154"]), |
| 559 | ]), |
| 560 | "CapabilitySourcingScheme": ("Capability sourcing scheme", "How capabilities are obtained.", "CapabilitySourcing", ["EV-162"], [ |
| 561 | ("Sourcing_InternalControl", "Owned and controlled internally", None, ["EV-161"]), |
| 562 | ("Sourcing_Centralised", "Centralised", None, ["EV-163"]), |
| 563 | ("Sourcing_Localised", "Localised", None, ["EV-163"]), |
| 564 | ("Sourcing_Outsourced", "Outsourced", None, ["EV-162"]), |
| 565 | ("Sourcing_Network", "Shared through a network", None, ["EV-160"]), |
| 566 | ("Sourcing_InboundOpenInnovation", "Inbound open innovation", "Bringing external knowledge, services or technology in.", ["EV-162"]), |
| 567 | ("Sourcing_OutboundOpenInnovation", "Outbound open innovation", "Using external organisations to perform or commercialise functions.", ["EV-162"]), |
| 568 | ]), |
| 569 | "PropertyClassScheme": ("Property class scheme", "Property classes for tax rules.", "PropertyClass", ["EV-130"], [ |
| 570 | ("PropertyClass_NewResidentialBuild", "New residential build", None, ["EV-130"]), |
| 571 | ("PropertyClass_EstablishedResidential", "Established residential", None, ["EV-130"]), |
| 572 | ("PropertyClass_CommercialResidentialPremises", "Commercial residential premises", None, ["EV-133"]), |
| 573 | ("PropertyClass_BuildToRentProject", "Build-to-rent project (50+ dwellings)", None, ["EV-134"]), |
| 574 | ("PropertyClass_AffordableHousing", "Qualifying affordable housing", None, ["EV-134"]), |
| 575 | ("PropertyClass_ResidentialRental", "Residential rental property (any)", None, ["EV-099", "EV-131"]), |
| 576 | ]), |
| 577 | "ProjectPhaseScheme": ("Project phase scheme", "Phases of an acquisition-to-operation pathway.", "ProjectPhase", ["EV-105"], [ |
| 578 | ("Phase_AcquisitionScreening", "Acquisition screening", None, ["EV-105"]), |
| 579 | ("Phase_ConditionalDueDiligence", "Conditional due diligence", None, ["EV-105"]), |
| 580 | ("Phase_ConceptAndApprovals", "Concept and approvals", None, ["EV-105"]), |
| 581 | ("Phase_Construction", "Construction", None, ["EV-105"]), |
| 582 | ("Phase_Completion", "Completion", None, ["EV-105"]), |
| 583 | ("Phase_OperatingApprovals", "Operating approvals", None, ["EV-105"]), |
| 584 | ("Phase_LeaseUp", "Lease-up", None, ["EV-105"]), |
| 585 | ("Phase_OngoingOperation", "Ongoing operation", None, ["EV-105"]), |
| 586 | ]), |
| 587 | } |
| 588 | |
| 589 | # --------------------------------------------------------------------------- |
| 590 | # Additional axioms |
| 591 | # --------------------------------------------------------------------------- |
| 592 | DISJOINT_SETS = [ |
| 593 | (["Person", "Organisation"], "source_supported", ["EV-041", "EV-042"], None), |
| 594 | (["HeadLease", "Sublease", "ManagementAgreement"], "source_supported", ["EV-060", "EV-064"], None), |
| 595 | (["Agreement", "Authorisation", "PropertyAsset", "Party", "Participation", "MetricValue"], "modelling_construct", [], "Core structural categories are pairwise disjoint to catch category errors in fixtures."), |
| 596 | ] |
| 597 | |
| 598 | MAPPINGS = [ |
| 599 | ("MAP-001", "pbo:Organisation", "http://www.w3.org/ns/org#Organization", "W3C ORG", "skos:closeMatch", "proposed", "Label and intent align, but ORG's formal-organisation axioms were not compared against a pinned version; no equivalence asserted (DEC-002)."), |
| 600 | ("MAP-002", "pbo:Party", "http://www.w3.org/ns/prov#Agent", "PROV-O", "rdfs:subClassOf", "accepted", "Every party can be responsible for activities/entities in the sense of PROV-O; asserted as a subclass in ontology.ttl (DEC-002)."), |
| 601 | ("MAP-003", "pbo:InformationArtefact", "http://www.w3.org/ns/prov#Entity", "PROV-O", "rdfs:subClassOf", "accepted", "Documents, datasets and plans are PROV entities; used for derivation of synthesis documents (DEC-002)."), |
| 602 | ("MAP-004", "pbo:DevelopmentProject", "http://www.w3.org/ns/prov#Activity", "PROV-O", "rdfs:subClassOf", "accepted", "Projects are activities that generate artefacts and buildings (DEC-002)."), |
| 603 | ("MAP-005", "pbo:Address", "https://schema.org/PostalAddress", "schema.org", "skos:closeMatch", "proposed", "Similar intent; schema.org has no pinned version IRI and models an address as a structured value, whereas pbo:Address is an identifier bearer."), |
| 604 | ("MAP-006", "pbo:LandParcel", "http://www.opengis.net/ont/geosparql#Feature", "GeoSPARQL 1.1", "rdfs:seeAlso", "proposed", "Parcels have geometry in the cadastre; geometry modelling deferred, cross-reference only."), |
| 605 | ("MAP-007", "pbo:Jurisdiction", "https://schema.org/AdministrativeArea", "schema.org", "skos:closeMatch", "proposed", "Close in intent; not pinned or compared formally."), |
| 606 | ("MAP-008", "pbo:Legislation", "http://data.europa.eu/eli/ontology#LegalResource", "ELI", "skos:closeMatch", "proposed", "ELI models legal resources with versions; potential future alignment for Australian legislation IRIs."), |
| 607 | ] |
| 608 | |
| 609 | PATTERNS = [ |
| 610 | ("PAT-001", "participation_role", "Party -> Participation(inRole Role, participationContext X) instead of typing parties by role.", ["DEC-003"]), |
| 611 | ("PAT-002", "first_class_agreement", "Agreements and authorisations are nodes with parties, jurisdiction, validity and clauses.", ["DEC-004"]), |
| 612 | ("PAT-003", "kind_class_with_skos_individuals", "Classification kinds (InvestmentStrategy, OperatingModel, ...) are OWL classes whose named individuals are also skos:Concept members of a scheme; OWL subclassing is not used for these values.", ["DEC-005"]), |
| 613 | ("PAT-004", "metric_value_node", "MetricValue(metric, numericValue, unit, basisNote, assertedIn) attached via assumes/yields/hasMetricValue.", ["DEC-006"]), |
| 614 | ("PAT-005", "occupancy_threshold_node", "OccupancyThreshold(thresholdKind, comparator, value, unit, effect) attached to RegulatoryRegime.", ["DEC-007"]), |
| 615 | ("PAT-006", "outgoing_allocation_node", "OutgoingAllocation(outgoingCategory, borneByRole) attached to LeaseType.", ["CQ-010"]), |
| 616 | ("PAT-007", "temporal_validity_literals", "effectiveFrom / effectiveUntil / cutoffDate xsd literals on rules, authorisations and agreements.", ["DEC-011"]), |
| 617 | ] |
| 618 | |
| 619 | UNRESOLVED = [ |
| 620 | ("ISSUE-001", "source_conflict", "What gross yield does a rooming house achieve?", ["EV-110"], ["EV-111", "EV-112", "EV-113", "EV-114"], "Figures range from 5% (standard) to 15-18% gross (regional, 2011). Each is a publisher claim on a different basis, price and vacancy assumption; none is a measured market dataset. Preserved as distinct MetricValue instances (DEC-008).", "resolved", "No universal yield is asserted. CQ-011 returns each source-attributed MetricValue with its basis, authority, jurisdiction and date.", ["CQ-011"]), |
| 621 | ("ISSUE-002", "source_conflict", "Does room-by-room letting lower or raise vacancy?", ["EV-115"], ["EV-116"], "Buyers Agency Co and investment-offer pages claim lower vacancy and vacancy protection; YIP and CT Real Estate report higher turnover and vacancy gaps. Not drawn from a common dataset.", "resolved", "The opposed claims remain separate evidence records and risk fixtures; the ontology makes no universal vacancy-direction axiom.", ["CQ-007", "CQ-011"]), |
| 622 | ("ISSUE-003", "source_conflict", "What is the master-lease break-even period for coliving?", ["EV-104"], ["EV-117"], "Everything Coliving states both 6-12 months and 12-18 months; the combined summary preserved both.", "resolved", "Both ranges are preserved as source-attributed metric claims; no canonical break-even duration is asserted.", ["CQ-011"]), |
| 623 | ("ISSUE-004", "definition_ambiguity", "What counts as a rooming house?", ["EV-071", "EV-092", "EV-093"], ["EV-072", "EV-076", "EV-077"], "CT Real Estate: four or more unrelated tenants managed by an operator; Queensland residential-service regime: four or more residents paying separately; Consumer Affairs Victoria: four or more people in rented rooms; New Property Australia: up to five lets and 300 m2 (Brisbane); Indigo: six-bedroom layout. The AccommodationType concept records the variance in its scope note; jurisdiction-specific thresholds are on regimes.", "resolved", "Rooming house remains a broad accommodation concept; jurisdiction-specific triggers are represented as RegulatoryRegime and OccupancyThreshold instances, not as one universal OWL definition.", ["CQ-002", "CQ-006"]), |
| 624 | ("ISSUE-005", "unverifiable_synthesis_claim", "Are the regulatory details in the deep-research report (QDC MP 5.7, accreditation levels, Clause 52.23 limits, smoke-alarm dates) current and correct?", ["EV-092", "EV-093", "EV-094"], [], "The report cites external sources through opaque tokens that are not present in the corpus. Recorded as explicit evidence against SRC-201 with a verification flag (DEC-016).", "resolved", "These are modelled only as claims made by secondary source SRC-201 and are explicitly not certified as current legal truth. Production legal decisions require primary-source verification outside this corpus.", ["CQ-001", "CQ-002", "CQ-012"]), |
| 625 | ("ISSUE-006", "unverifiable_synthesis_claim", "Are the 1 July 2027 negative-gearing and CGT reforms and the 12 May 2026 cut-off enacted as described?", ["EV-130", "EV-131"], ["EV-034"], "SRC-201 states the reforms are law; SRC-025 (July 2026) refers to a Federal Budget announcement. Both are secondary; no primary legislation is in the corpus.", "resolved", "The dates remain source-attributed claim fixtures rather than accepted current-law axioms; CQ-012 exposes their sources and the README warns that primary verification is required.", ["CQ-012"]), |
| 626 | ("ISSUE-007", "jurisdiction_boundary", "Which foreign-sourced concepts (Spanish rent-to-rent contracts, Canadian lease guidance, European coliving benchmarks, Swedish business model) apply in Australia?", ["EV-118"], [], "Modelled as generic concepts with source jurisdiction on the evidence; no Australian applicability asserted.", "resolved", "Foreign concepts are retained only as generic patterns and carry source jurisdiction; no appliesIn Australia assertion is made from those sources.", ["CQ-003", "CQ-010"]), |
| 627 | ("ISSUE-008", "manifest_inconsistency", "Manifest entries for the RTA and New Property Australia pages are marked failed with re-used indices 1 and 2, yet files 0035 and 0036 exist.", [], [], "Files treated as valid sources SRC-035 and SRC-036; the manifest anomaly is recorded in SRC-300 notes.", "resolved", "The recovered local files are registered explicitly as SRC-035 and SRC-036; SRC-300 retains the manifest anomaly for provenance.", []), |
| 628 | ("ISSUE-009", "modelling_choice", "Should ownedBy / managedBy / operatedBy shortcuts be inferred from participations by rule?", [], [], "Kept as independent convenience properties; a SPARQL CONSTRUCT or SHACL rule could derive them later. Fixtures assert both where relevant.", "resolved", "The release deliberately keeps the shortcuts independently asserted and does not claim a derivation rule; DEC-003 remains the canonical role model.", ["CQ-003"]), |
| 629 | ("ISSUE-010", "scope_gap", "Seven manifest URLs (19, 26-31) failed to scrape; their topics (whole-property vs room-by-room, Melbourne co-living yields, multi-lease finance, Brisbane yield rankings) are absent.", [], [], "No evidence recorded; ontology may under-represent Victorian coliving economics and multi-lease lending.", "resolved", "The failed pages are an explicit corpus exclusion for version 0.1.0. No unseen claims were inferred; future recovered sources require a versioned evidence and CQ regression update.", ["CQ-006", "CQ-011"]), |
| 630 | ] |
| 631 | |
| 632 | # --------------------------------------------------------------------------- |
| 633 | # Emission |
| 634 | # --------------------------------------------------------------------------- |
| 635 | |
| 636 | def ttl_str(s: str) -> str: |
| 637 | return json.dumps(s, ensure_ascii=False) |
| 638 | |
| 639 | |
| 640 | def qn(name: str) -> str: |
| 641 | return name if ":" in name else f"pbo:{name}" |
| 642 | |
| 643 | |
| 644 | def build_model() -> dict: |
| 645 | terms, axioms = [], [] |
| 646 | n = 0 |
| 647 | for local, label, definition, parents, support, evidence, rationale in CLASSES: |
| 648 | n += 1 |
| 649 | terms.append({"id": f"TERM-{local}", "iri": f"pbo:{local}", "kind": "class", "label": label, "definition": definition, |
| 650 | "status": "accepted", "support": support, "evidence": evidence, "rationale": rationale}) |
| 651 | for p in parents: |
| 652 | axioms.append({"id": f"AX-SUB-{local}-{p.split(':')[-1]}", "type": "subClassOf", "subject": f"pbo:{local}", "object": qn(p), |
| 653 | "status": "accepted", "support": support if support != "modelling_construct" else "modelling_construct", |
| 654 | "evidence": evidence, "rationale": rationale or f"{local} is a specialisation of {p} in every source use."}) |
| 655 | for name, label, definition, dom, rng, support, evidence, rationale, chars in OBJ_PROPS: |
| 656 | terms.append({"id": f"TERM-{name}", "iri": f"pbo:{name}", "kind": "object_property", "label": label, "definition": definition, |
| 657 | "domain": qn(dom) if dom else None, "range": qn(rng) if rng else None, |
| 658 | "status": "accepted", "support": support, "evidence": evidence, "rationale": rationale, "characteristics": chars or None}) |
| 659 | if dom: |
| 660 | axioms.append({"id": f"AX-DOM-{name}", "type": "domain", "subject": f"pbo:{name}", "object": qn(dom), "status": "accepted", |
| 661 | "support": support, "evidence": evidence, "rationale": rationale or "Domain is safe for every corpus use (DEC-009)."}) |
| 662 | if rng: |
| 663 | axioms.append({"id": f"AX-RNG-{name}", "type": "range", "subject": f"pbo:{name}", "object": qn(rng), "status": "accepted", |
| 664 | "support": support, "evidence": evidence, "rationale": rationale or "Range is safe for every corpus use (DEC-009)."}) |
| 665 | for name, label, definition, dom, rng, support, evidence, rationale, functional in DATA_PROPS: |
| 666 | terms.append({"id": f"TERM-{name}", "iri": f"pbo:{name}", "kind": "data_property", "label": label, "definition": definition, |
| 667 | "domain": qn(dom) if dom else None, "range": rng, "functional": functional, |
| 668 | "status": "accepted", "support": support, "evidence": evidence, "rationale": rationale}) |
| 669 | for scheme, (slabel, sdef, kind, sev, concepts) in SCHEMES.items(): |
| 670 | terms.append({"id": f"TERM-{scheme}", "iri": f"pbo:{scheme}", "kind": "individual", "label": slabel, "definition": sdef, |
| 671 | "rdf_type": "skos:ConceptScheme", "status": "accepted", |
| 672 | "support": "source_supported" if sev else "modelling_construct", "evidence": sev, |
| 673 | "rationale": None if sev else "Controlled vocabulary introduced to bind a modelling construct (DEC-005/DEC-007)."}) |
| 674 | for local, plabel, cdef, cev in concepts: |
| 675 | terms.append({"id": f"TERM-{local}", "iri": f"pbo:{local}", "kind": "skos_concept", "label": plabel, |
| 676 | "definition": cdef or f"{plabel}: a {slabel.replace(' scheme','').lower()} value named in the corpus.", |
| 677 | "in_scheme": f"pbo:{scheme}", "also_instance_of": f"pbo:{kind}", "status": "accepted", |
| 678 | "support": "source_supported", "evidence": cev, "rationale": None}) |
| 679 | for i, (members, support, evidence, rationale) in enumerate(DISJOINT_SETS, 1): |
| 680 | axioms.append({"id": f"AX-DISJ-{i:03d}", "type": "disjointClasses", "members": [f"pbo:{m}" for m in members], "status": "accepted", |
| 681 | "support": support, "evidence": evidence, "rationale": rationale}) |
| 682 | axioms.append({"id": "AX-INV-001", "type": "inverseOf", "subject": "pbo:hasParticipation", "object": "pbo:participationContext", |
| 683 | "status": "accepted", "support": "modelling_construct", "evidence": [], "rationale": "Navigation in both directions for CQ-003."}) |
| 684 | axioms.append({"id": "AX-RES-001", "type": "restriction", "subject": "pbo:Participation", "predicate": "pbo:participant", "object": "pbo:Party", "restriction": "someValuesFrom", |
| 685 | "status": "accepted", "support": "modelling_construct", "evidence": [], "rationale": "A participation without a participant is meaningless."}) |
| 686 | axioms.append({"id": "AX-RES-002", "type": "restriction", "subject": "pbo:Participation", "predicate": "pbo:inRole", "object": "pbo:Role", "restriction": "someValuesFrom", |
| 687 | "status": "accepted", "support": "modelling_construct", "evidence": [], "rationale": "A participation without a role is meaningless."}) |
| 688 | axioms.append({"id": "AX-RES-003", "type": "restriction", "subject": "pbo:MetricValue", "predicate": "pbo:metric", "object": "pbo:Metric", "restriction": "someValuesFrom", |
| 689 | "status": "accepted", "support": "modelling_construct", "evidence": [], "rationale": "A value must measure a metric (DEC-006)."}) |
| 690 | axioms.append({"id": "AX-RES-004", "type": "restriction", "subject": "pbo:HeadLease", "predicate": "pbo:fixedRent", "object": "true", "restriction": "hasValue", |
| 691 | "status": "accepted", "support": "source_supported", "evidence": ["EV-060", "EV-062"], "rationale": "Sources define the master lease by fixed rent owed regardless of occupancy."}) |
| 692 | mappings = [{"id": i, "local": l, "external": e, "external_ontology": o, "relation": r, "status": s, "rationale": ra, "evidence": []} for i, l, e, o, r, s, ra in MAPPINGS] |
| 693 | patterns = [{"id": i, "name": nm, "description": d, "decisions": dec} for i, nm, d, dec in PATTERNS] |
| 694 | unresolved = [{"id": i, "type": t, "question": q, "evidence_for": ef, "evidence_against": ea, "authority_analysis": a, "status": s, "resolution": r, "affects": af} |
| 695 | for i, t, q, ef, ea, a, s, r, af in UNRESOLVED] |
| 696 | return {"terms": terms, "axioms": axioms, "mappings": mappings, "patterns": patterns, "unresolved_issues": unresolved} |
| 697 | |
| 698 | |
| 699 | def build_ontology_ttl() -> str: |
| 700 | out = [PREFIXES, f""" |
| 701 | <{ONT}> a owl:Ontology ; |
| 702 | rdfs:label "Australian Property Investment, Accommodation and Operations Ontology"@en ; |
| 703 | dcterms:title "Australian Property Investment, Accommodation and Operations Ontology"@en ; |
| 704 | dcterms:description "Evidence-first ontology derived from the property-pages corpus: property assets and identifiers, parties and roles, agreements, accommodation and operating models, ownership structures, investment strategies, Australian regulatory regimes and authorisations with occupancy thresholds, tax rules with effective dates, business-planning artefacts, financial scenarios and metric values, risks and decision gates, property-management operations, agency business models and property data sources. Generated from build/build_model.py; see model.yaml for the term ledger."@en ; |
| 705 | dcterms:creator "Ryan Ballantyne" ; |
| 706 | dcterms:created "{TODAY}"^^xsd:date ; |
| 707 | dcterms:modified "{TODAY}"^^xsd:date ; |
| 708 | dcterms:license <https://creativecommons.org/licenses/by/4.0/> ; |
| 709 | dcterms:source <file://property-pages/> ; |
| 710 | owl:versionInfo "{VERSION}" ; |
| 711 | owl:versionIRI <{ONT}/{VERSION}> ; |
| 712 | rdfs:comment "OWL 2 DL. PROV-O, SKOS and DCTERMS are referenced by IRI without owl:imports (DEC-002)."@en . |
| 713 | |
| 714 | # ---- Classes ---- |
| 715 | """] |
| 716 | for local, label, definition, parents, *_ in CLASSES: |
| 717 | lines = [f"pbo:{local} a owl:Class ;", f" rdfs:label {ttl_str(label)}@en ;", f" rdfs:comment {ttl_str(definition)}@en ;", |
| 718 | f" rdfs:isDefinedBy <{ONT}> ;"] |
| 719 | for p in parents: |
| 720 | lines.append(f" rdfs:subClassOf {qn(p)} ;") |
| 721 | lines[-1] = lines[-1].rstrip(" ;") + " ." |
| 722 | out.append("\n".join(lines) + "\n\n") |
| 723 | out.append("# ---- Restrictions ----\n") |
| 724 | out.append("pbo:Participation rdfs:subClassOf [ a owl:Restriction ; owl:onProperty pbo:participant ; owl:someValuesFrom pbo:Party ] ,\n [ a owl:Restriction ; owl:onProperty pbo:inRole ; owl:someValuesFrom pbo:Role ] .\n") |
| 725 | out.append("pbo:MetricValue rdfs:subClassOf [ a owl:Restriction ; owl:onProperty pbo:metric ; owl:someValuesFrom pbo:Metric ] .\n") |
| 726 | out.append("pbo:HeadLease rdfs:subClassOf [ a owl:Restriction ; owl:onProperty pbo:fixedRent ; owl:hasValue true ] .\n\n") |
| 727 | out.append("# ---- Disjointness ----\n") |
| 728 | for members, *_ in DISJOINT_SETS: |
| 729 | out.append("[] a owl:AllDisjointClasses ; owl:members ( " + " ".join(f"pbo:{m}" for m in members) + " ) .\n") |
| 730 | out.append("\n# ---- Object properties ----\n") |
| 731 | for name, label, definition, dom, rng, support, evidence, rationale, chars in OBJ_PROPS: |
| 732 | types = ["owl:ObjectProperty"] |
| 733 | if chars.get("functional"): |
| 734 | types.append("owl:FunctionalProperty") |
| 735 | if chars.get("transitive"): |
| 736 | types.append("owl:TransitiveProperty") |
| 737 | lines = [f"pbo:{name} a {', '.join(types)} ;", f" rdfs:label {ttl_str(label)}@en ;", f" rdfs:comment {ttl_str(definition)}@en ;", f" rdfs:isDefinedBy <{ONT}> ;"] |
| 738 | if dom: |
| 739 | lines.append(f" rdfs:domain {qn(dom)} ;") |
| 740 | if rng: |
| 741 | lines.append(f" rdfs:range {qn(rng)} ;") |
| 742 | if chars.get("inverse"): |
| 743 | lines.append(f" owl:inverseOf pbo:{chars['inverse']} ;") |
| 744 | lines[-1] = lines[-1].rstrip(" ;") + " ." |
| 745 | out.append("\n".join(lines) + "\n\n") |
| 746 | out.append("# ---- Datatype properties ----\n") |
| 747 | for name, label, definition, dom, rng, support, evidence, rationale, functional in DATA_PROPS: |
| 748 | types = ["owl:DatatypeProperty"] + (["owl:FunctionalProperty"] if functional else []) |
| 749 | lines = [f"pbo:{name} a {', '.join(types)} ;", f" rdfs:label {ttl_str(label)}@en ;", f" rdfs:comment {ttl_str(definition)}@en ;", f" rdfs:isDefinedBy <{ONT}> ;"] |
| 750 | if dom: |
| 751 | lines.append(f" rdfs:domain {qn(dom)} ;") |
| 752 | lines.append(f" rdfs:range {rng} ;") |
| 753 | lines[-1] = lines[-1].rstrip(" ;") + " ." |
| 754 | out.append("\n".join(lines) + "\n\n") |
| 755 | out.append("# ---- Candidate mappings (annotation strength unless stated in model.yaml) ----\n") |
| 756 | for i, l, e, o, r, s, ra in MAPPINGS: |
| 757 | if r in ("rdfs:subClassOf",): |
| 758 | continue # already asserted via parents |
| 759 | out.append(f"{l} {r} <{e}> .\n") |
| 760 | return "".join(out) |
| 761 | |
| 762 | |
| 763 | def build_taxonomy_ttl() -> str: |
| 764 | out = [PREFIXES, "\n# SKOS concept schemes. Each concept is also an individual of its kind class (PAT-003).\n\n"] |
| 765 | for scheme, (slabel, sdef, kind, sev, concepts) in SCHEMES.items(): |
| 766 | out.append(f"pbo:{scheme} a skos:ConceptScheme ;\n rdfs:label {ttl_str(slabel)}@en ;\n skos:prefLabel {ttl_str(slabel)}@en ;\n skos:definition {ttl_str(sdef)}@en ;\n rdfs:isDefinedBy <{ONT}> ;\n") |
| 767 | out.append(" skos:hasTopConcept " + " , ".join(f"pbo:{c[0]}" for c in concepts) + " .\n\n") |
| 768 | for local, plabel, cdef, cev in concepts: |
| 769 | d = cdef or f"{plabel}: a {slabel.replace(' scheme','').lower()} value named in the corpus." |
| 770 | out.append(f"pbo:{local} a skos:Concept , pbo:{kind} ;\n skos:prefLabel {ttl_str(plabel)}@en ;\n rdfs:label {ttl_str(plabel)}@en ;\n skos:definition {ttl_str(d)}@en ;\n skos:inScheme pbo:{scheme} ;\n skos:topConceptOf pbo:{scheme} .\n\n") |
| 771 | return "".join(out) |
| 772 | |
| 773 | |
| 774 | def main() -> None: |
| 775 | model = build_model() |
| 776 | (ROOT / "model.yaml").write_text(yaml.safe_dump(model, sort_keys=False, allow_unicode=True, width=110), encoding="utf-8") |
| 777 | (ROOT / "ontology.ttl").write_text(build_ontology_ttl(), encoding="utf-8") |
| 778 | (ROOT / "taxonomy.ttl").write_text(build_taxonomy_ttl(), encoding="utf-8") |
| 779 | ev = sorted({e for t in model["terms"] for e in t.get("evidence") or []} | {e for a in model["axioms"] for e in a.get("evidence") or []} |
| 780 | | {e for u in model["unresolved_issues"] for e in u["evidence_for"] + u["evidence_against"]}) |
| 781 | print(f"terms={len(model['terms'])} axioms={len(model['axioms'])} evidence_ids_referenced={len(ev)}") |
| 782 | (ROOT / "build" / "referenced_evidence_ids.txt").write_text("\n".join(ev) + "\n") |
| 783 | |
| 784 | |
| 785 | if __name__ == "__main__": |
| 786 | main() |