@prefix : <https://github.com/hzmarrou/truck-ontology-bench/blob/main/input/schema/ontology.md#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .

# Ontology Declaration
<> a owl:Ontology ;
    schema:name "Long-Haul Trucking Ontology"@en ;
    schema:description "Ontology schema for long-haul trucking operations including terminals, trucks, trailers, drivers, routes, loads, trips, maintenance, and HOS compliance."@en ;
    schema:identifier "https://github.com/hzmarrou/truck-ontology-bench/blob/main/input/schema/ontology.md"@en ;
    rdfs:label "Truck Ontology"@en ;
    rdfs:comment "Entity definitions and relationships for trucking fleet management."@en ;
    rdfs:isDefinedBy <> .

# === CLASSES ===

:Terminal a rdfs:Class ;
    rdfs:label "Terminal"@en ;
    rdfs:comment "Physical hub or yard location where trucks are dispatched, loaded, and serviced."@en ;
    rdfs:isDefinedBy <> .

:Truck a rdfs:Class ;
    rdfs:label "Truck"@en ;
    rdfs:comment "Tractor unit, also known as a Class 8 semi-truck."@en ;
    rdfs:isDefinedBy <> .

:Trailer a rdfs:Class ;
    rdfs:label "Trailer"@en ;
    rdfs:comment "Trailer unit that is pulled by a tractor truck."@en ;
    rdfs:isDefinedBy <> .

:Driver a rdfs:Class ;
    rdfs:label "Driver"@en ;
    rdfs:comment "CDL-holding truck driver authorized to operate commercial motor vehicles."@en ;
    rdfs:isDefinedBy <> .

:Customer a rdfs:Class ;
    rdfs:label "Customer"@en ;
    rdfs:comment "Shipping customer who contracts loads for transportation."@en ;
    rdfs:isDefinedBy <> .

:Route a rdfs:Class ;
    rdfs:label "Route"@en ;
    rdfs:comment "Predefined shipping lane between two terminals."@en ;
    rdfs:isDefinedBy <> .

:Load a rdfs:Class ;
    rdfs:label "Load"@en ;
    rdfs:comment "A shipment of freight to be transported from one location to another."@en ;
    rdfs:isDefinedBy <> .

:Trip a rdfs:Class ;
    rdfs:label "Trip"@en ;
    rdfs:comment "Operational dispatch record linking all entities for a single haul."@en ;
    rdfs:isDefinedBy <> .

:MaintenanceEvent a rdfs:Class ;
    rdfs:label "MaintenanceEvent"@en ;
    rdfs:comment "Scheduled or completed maintenance on a truck."@en ;
    rdfs:isDefinedBy <> .

:ServiceTicket a rdfs:Class ;
    rdfs:label "ServiceTicket"@en ;
    rdfs:comment "Breakdown or roadside repair record for a truck."@en ;
    rdfs:isDefinedBy <> .

:DriverHOSLog a rdfs:Class ;
    rdfs:label "DriverHOSLog"@en ;
    rdfs:comment "Electronic Logging Device (ELD) duty status record per FMCSA regulations."@en ;
    rdfs:isDefinedBy <> .

# === TERMINAL PROPERTIES ===

:terminalId a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:string ;
    rdfs:label "terminalId"@en ;
    rdfs:comment "Unique identifier for the terminal."@en ;
    rdfs:isDefinedBy <> .

:terminalName a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:string ;
    rdfs:label "name"@en ;
    rdfs:comment "Terminal name, for example 'Atlanta Hub'."@en ;
    rdfs:isDefinedBy <> .

:terminalCity a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:string ;
    rdfs:label "city"@en ;
    rdfs:comment "City where the terminal is located."@en ;
    rdfs:isDefinedBy <> .

:terminalState a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:string ;
    rdfs:label "state"@en ;
    rdfs:comment "Two-letter state code where the terminal is located."@en ;
    rdfs:isDefinedBy <> .

:terminalLatitude a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:float ;
    rdfs:label "latitude"@en ;
    rdfs:comment "GPS latitude coordinate of the terminal."@en ;
    rdfs:isDefinedBy <> .

:terminalLongitude a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:float ;
    rdfs:label "longitude"@en ;
    rdfs:comment "GPS longitude coordinate of the terminal."@en ;
    rdfs:isDefinedBy <> .

:terminalTimezone a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:string ;
    rdfs:label "timezone"@en ;
    rdfs:comment "IANA timezone identifier, for example 'America/New_York'."@en ;
    rdfs:isDefinedBy <> .

:terminalCapacityTrucks a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:integer ;
    rdfs:label "capacityTrucks"@en ;
    rdfs:comment "Maximum truck parking capacity at the terminal."@en ;
    rdfs:isDefinedBy <> .

:terminalHasMaintenanceBay a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:boolean ;
    rdfs:label "hasMaintenanceBay"@en ;
    rdfs:comment "Whether maintenance can be performed at this terminal."@en ;
    rdfs:isDefinedBy <> .

:terminalAddress a owl:DatatypeProperty ;
    rdfs:domain :Terminal ;
    rdfs:range xsd:string ;
    rdfs:label "address"@en ;
    rdfs:comment "Street address of the terminal."@en ;
    rdfs:isDefinedBy <> .

# === TRUCK PROPERTIES ===

:truckId a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:string ;
    rdfs:label "truckId"@en ;
    rdfs:comment "Unique identifier for the truck."@en ;
    rdfs:isDefinedBy <> .

:truckNumber a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:string ;
    rdfs:label "truckNumber"@en ;
    rdfs:comment "Fleet number, for example 'TRK-1042'."@en ;
    rdfs:isDefinedBy <> .

:truckVin a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:string ;
    rdfs:label "vin"@en ;
    rdfs:comment "17-character Vehicle Identification Number."@en ;
    rdfs:isDefinedBy <> .

:truckMake a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:string ;
    rdfs:label "make"@en ;
    rdfs:comment "Manufacturer such as Freightliner, Kenworth, or Peterbilt."@en ;
    rdfs:isDefinedBy <> .

:truckModel a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:string ;
    rdfs:label "model"@en ;
    rdfs:comment "Model name such as Cascadia, T680, or 579."@en ;
    rdfs:isDefinedBy <> .

:truckYear a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:integer ;
    rdfs:label "year"@en ;
    rdfs:comment "Model year of the truck."@en ;
    rdfs:isDefinedBy <> .

:truckOdometerMiles a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:integer ;
    rdfs:label "odometerMiles"@en ;
    rdfs:comment "Current odometer reading in miles."@en ;
    rdfs:isDefinedBy <> .

:truckFuelCapacityGallons a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:float ;
    rdfs:label "fuelCapacityGallons"@en ;
    rdfs:comment "Fuel tank capacity in gallons."@en ;
    rdfs:isDefinedBy <> .

:truckStatus a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:string ;
    rdfs:label "status"@en ;
    rdfs:comment "Current status: available, en_route, maintenance, or out_of_service."@en ;
    rdfs:isDefinedBy <> .

:truckNextMaintenanceMiles a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:integer ;
    rdfs:label "nextMaintenanceMiles"@en ;
    rdfs:comment "Odometer reading for next scheduled maintenance."@en ;
    rdfs:isDefinedBy <> .

:truckNextMaintenanceType a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:string ;
    rdfs:label "nextMaintenanceType"@en ;
    rdfs:comment "Type of next maintenance due."@en ;
    rdfs:isDefinedBy <> .

:truckLastDotInspectionDate a owl:DatatypeProperty ;
    rdfs:domain :Truck ;
    rdfs:range xsd:date ;
    rdfs:label "lastDotInspectionDate"@en ;
    rdfs:comment "Date of last DOT inspection."@en ;
    rdfs:isDefinedBy <> .

:truckHomeTerminal a owl:ObjectProperty ;
    rdfs:domain :Truck ;
    rdfs:range :Terminal ;
    rdfs:label "homeTerminalId"@en ;
    rdfs:comment "Assigned home terminal for the truck."@en ;
    rdfs:isDefinedBy <> .

# === TRAILER PROPERTIES ===

:trailerId a owl:DatatypeProperty ;
    rdfs:domain :Trailer ;
    rdfs:range xsd:string ;
    rdfs:label "trailerId"@en ;
    rdfs:comment "Unique identifier for the trailer."@en ;
    rdfs:isDefinedBy <> .

:trailerNumber a owl:DatatypeProperty ;
    rdfs:domain :Trailer ;
    rdfs:range xsd:string ;
    rdfs:label "trailerNumber"@en ;
    rdfs:comment "Fleet number, for example 'TRL-2001'."@en ;
    rdfs:isDefinedBy <> .

:trailerType a owl:DatatypeProperty ;
    rdfs:domain :Trailer ;
    rdfs:range xsd:string ;
    rdfs:label "type"@en ;
    rdfs:comment "Trailer type: dry_van, reefer, flatbed, or tanker."@en ;
    rdfs:isDefinedBy <> .

:trailerLengthFt a owl:DatatypeProperty ;
    rdfs:domain :Trailer ;
    rdfs:range xsd:integer ;
    rdfs:label "lengthFt"@en ;
    rdfs:comment "Trailer length in feet, typically 48 or 53 feet."@en ;
    rdfs:isDefinedBy <> .

:trailerMaxWeightLbs a owl:DatatypeProperty ;
    rdfs:domain :Trailer ;
    rdfs:range xsd:integer ;
    rdfs:label "maxWeightLbs"@en ;
    rdfs:comment "Maximum cargo weight in pounds."@en ;
    rdfs:isDefinedBy <> .

:trailerStatus a owl:DatatypeProperty ;
    rdfs:domain :Trailer ;
    rdfs:range xsd:string ;
    rdfs:label "status"@en ;
    rdfs:comment "Current status: available, loaded, en_route, or maintenance."@en ;
    rdfs:isDefinedBy <> .

:trailerYear a owl:DatatypeProperty ;
    rdfs:domain :Trailer ;
    rdfs:range xsd:integer ;
    rdfs:label "year"@en ;
    rdfs:comment "Model year of the trailer."@en ;
    rdfs:isDefinedBy <> .

:trailerLastInspectionDate a owl:DatatypeProperty ;
    rdfs:domain :Trailer ;
    rdfs:range xsd:date ;
    rdfs:label "lastInspectionDate"@en ;
    rdfs:comment "Date of last inspection."@en ;
    rdfs:isDefinedBy <> .

:trailerHomeTerminal a owl:ObjectProperty ;
    rdfs:domain :Trailer ;
    rdfs:range :Terminal ;
    rdfs:label "homeTerminalId"@en ;
    rdfs:comment "Assigned home terminal for the trailer."@en ;
    rdfs:isDefinedBy <> .

# === DRIVER PROPERTIES ===

:driverId a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "driverId"@en ;
    rdfs:comment "Unique identifier for the driver."@en ;
    rdfs:isDefinedBy <> .

:driverEmployeeId a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "employeeId"@en ;
    rdfs:comment "Employee number, for example 'DRV-5001'."@en ;
    rdfs:isDefinedBy <> .

:driverFirstName a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "firstName"@en ;
    rdfs:comment "Driver's first name."@en ;
    rdfs:isDefinedBy <> .

:driverLastName a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "lastName"@en ;
    rdfs:comment "Driver's last name."@en ;
    rdfs:isDefinedBy <> .

:driverCdlNumber a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "cdlNumber"@en ;
    rdfs:comment "Commercial Driver's License number."@en ;
    rdfs:isDefinedBy <> .

:driverCdlState a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "cdlState"@en ;
    rdfs:comment "State of CDL issuance."@en ;
    rdfs:isDefinedBy <> .

:driverCdlEndorsements a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "cdlEndorsements"@en ;
    rdfs:comment "List of endorsements: H (hazmat), N (tanker), T (doubles/triples), X (hazmat+tanker)."@en ;
    rdfs:isDefinedBy <> .

:driverCdlExpirationDate a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:date ;
    rdfs:label "cdlExpirationDate"@en ;
    rdfs:comment "CDL expiration date."@en ;
    rdfs:isDefinedBy <> .

:driverHireDate a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:date ;
    rdfs:label "hireDate"@en ;
    rdfs:comment "Date of hire."@en ;
    rdfs:isDefinedBy <> .

:driverStatus a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "status"@en ;
    rdfs:comment "Current status: available, driving, off_duty, or on_leave."@en ;
    rdfs:isDefinedBy <> .

:driverPhone a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "phone"@en ;
    rdfs:comment "Contact phone number."@en ;
    rdfs:isDefinedBy <> .

:driverEmail a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "email"@en ;
    rdfs:comment "Contact email address."@en ;
    rdfs:isDefinedBy <> .

:driverSupervisorEmail a owl:DatatypeProperty ;
    rdfs:domain :Driver ;
    rdfs:range xsd:string ;
    rdfs:label "supervisorEmail"@en ;
    rdfs:comment "Supervisor's email for HOS alerts."@en ;
    rdfs:isDefinedBy <> .

:driverHomeTerminal a owl:ObjectProperty ;
    rdfs:domain :Driver ;
    rdfs:range :Terminal ;
    rdfs:label "homeTerminalId"@en ;
    rdfs:comment "Assigned home terminal for the driver."@en ;
    rdfs:isDefinedBy <> .

# === CUSTOMER PROPERTIES ===

:customerId a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "customerId"@en ;
    rdfs:comment "Unique identifier for the customer."@en ;
    rdfs:isDefinedBy <> .

:customerName a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "name"@en ;
    rdfs:comment "Company name of the customer."@en ;
    rdfs:isDefinedBy <> .

:customerContactName a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "contactName"@en ;
    rdfs:comment "Primary contact person's name."@en ;
    rdfs:isDefinedBy <> .

:customerContactEmail a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "contactEmail"@en ;
    rdfs:comment "Contact email address."@en ;
    rdfs:isDefinedBy <> .

:customerContactPhone a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "contactPhone"@en ;
    rdfs:comment "Contact phone number."@en ;
    rdfs:isDefinedBy <> .

:customerAddress a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "address"@en ;
    rdfs:comment "Business address of the customer."@en ;
    rdfs:isDefinedBy <> .

:customerCity a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "city"@en ;
    rdfs:comment "City of the customer's business location."@en ;
    rdfs:isDefinedBy <> .

:customerState a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "state"@en ;
    rdfs:comment "State of the customer's business location."@en ;
    rdfs:isDefinedBy <> .

:customerIndustry a owl:DatatypeProperty ;
    rdfs:domain :Customer ;
    rdfs:range xsd:string ;
    rdfs:label "industry"@en ;
    rdfs:comment "Industry vertical such as manufacturing, retail, or agriculture."@en ;
    rdfs:isDefinedBy <> .

# === ROUTE PROPERTIES ===

:routeId a owl:DatatypeProperty ;
    rdfs:domain :Route ;
    rdfs:range xsd:string ;
    rdfs:label "routeId"@en ;
    rdfs:comment "Unique identifier for the route."@en ;
    rdfs:isDefinedBy <> .

:routeName a owl:DatatypeProperty ;
    rdfs:domain :Route ;
    rdfs:range xsd:string ;
    rdfs:label "routeName"@en ;
    rdfs:comment "Human-readable name such as 'ATL→CHI'."@en ;
    rdfs:isDefinedBy <> .

:routeDistanceMiles a owl:DatatypeProperty ;
    rdfs:domain :Route ;
    rdfs:range xsd:float ;
    rdfs:label "distanceMiles"@en ;
    rdfs:comment "Total route distance in miles."@en ;
    rdfs:isDefinedBy <> .

:routeEstimatedHours a owl:DatatypeProperty ;
    rdfs:domain :Route ;
    rdfs:range xsd:float ;
    rdfs:label "estimatedHours"@en ;
    rdfs:comment "Estimated driving time in hours, not including breaks."@en ;
    rdfs:isDefinedBy <> .

:routeEstimatedHoursWithStops a owl:DatatypeProperty ;
    rdfs:domain :Route ;
    rdfs:range xsd:float ;
    rdfs:label "estimatedHoursWithStops"@en ;
    rdfs:comment "Estimated total time including fuel and rest stops."@en ;
    rdfs:isDefinedBy <> .

:routeWaypoints a owl:DatatypeProperty ;
    rdfs:domain :Route ;
    rdfs:range xsd:string ;
    rdfs:label "waypoints"@en ;
    rdfs:comment "JSON array of intermediate lat/lon waypoints."@en ;
    rdfs:isDefinedBy <> .

:routeTollCostEstimate a owl:DatatypeProperty ;
    rdfs:domain :Route ;
    rdfs:range xsd:float ;
    rdfs:label "tollCostEstimate"@en ;
    rdfs:comment "Estimated toll costs for the route."@en ;
    rdfs:isDefinedBy <> .

:routeFuelStopsRecommended a owl:DatatypeProperty ;
    rdfs:domain :Route ;
    rdfs:range xsd:integer ;
    rdfs:label "fuelStopsRecommended"@en ;
    rdfs:comment "Recommended number of fuel stops."@en ;
    rdfs:isDefinedBy <> .

:routeOriginTerminal a owl:ObjectProperty ;
    rdfs:domain :Route ;
    rdfs:range :Terminal ;
    rdfs:label "originTerminalId"@en ;
    rdfs:comment "Starting terminal of the route."@en ;
    rdfs:isDefinedBy <> .

:routeDestinationTerminal a owl:ObjectProperty ;
    rdfs:domain :Route ;
    rdfs:range :Terminal ;
    rdfs:label "destinationTerminalId"@en ;
    rdfs:comment "Ending terminal of the route."@en ;
    rdfs:isDefinedBy <> .

# === LOAD PROPERTIES ===

:loadId a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:string ;
    rdfs:label "loadId"@en ;
    rdfs:comment "Unique identifier for the load."@en ;
    rdfs:isDefinedBy <> .

:loadNumber a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:string ;
    rdfs:label "loadNumber"@en ;
    rdfs:comment "Reference number such as 'LD-90001'."@en ;
    rdfs:isDefinedBy <> .

:loadType a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:string ;
    rdfs:label "loadType"@en ;
    rdfs:comment "Load type: general, hazmat, refrigerated, or oversize."@en ;
    rdfs:isDefinedBy <> .

:loadDescription a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:string ;
    rdfs:label "description"@en ;
    rdfs:comment "Cargo description."@en ;
    rdfs:isDefinedBy <> .

:loadWeightLbs a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:integer ;
    rdfs:label "weightLbs"@en ;
    rdfs:comment "Cargo weight in pounds."@en ;
    rdfs:isDefinedBy <> .

:loadRequiredTrailerType a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:string ;
    rdfs:label "requiredTrailerType"@en ;
    rdfs:comment "Required trailer type: dry_van, reefer, flatbed, or tanker."@en ;
    rdfs:isDefinedBy <> .

:loadRequiredEndorsements a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:string ;
    rdfs:label "requiredEndorsements"@en ;
    rdfs:comment "Required CDL endorsements for this load."@en ;
    rdfs:isDefinedBy <> .

:loadPickupWindowStart a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:dateTime ;
    rdfs:label "pickupWindowStart"@en ;
    rdfs:comment "Earliest pickup time."@en ;
    rdfs:isDefinedBy <> .

:loadPickupWindowEnd a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:dateTime ;
    rdfs:label "pickupWindowEnd"@en ;
    rdfs:comment "Latest pickup time."@en ;
    rdfs:isDefinedBy <> .

:loadDeliveryWindowStart a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:dateTime ;
    rdfs:label "deliveryWindowStart"@en ;
    rdfs:comment "Earliest delivery time."@en ;
    rdfs:isDefinedBy <> .

:loadDeliveryWindowEnd a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:dateTime ;
    rdfs:label "deliveryWindowEnd"@en ;
    rdfs:comment "Latest delivery time."@en ;
    rdfs:isDefinedBy <> .

:loadStatus a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:string ;
    rdfs:label "status"@en ;
    rdfs:comment "Current status: pending, assigned, in_transit, delivered, or cancelled."@en ;
    rdfs:isDefinedBy <> .

:loadPriority a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:string ;
    rdfs:label "priority"@en ;
    rdfs:comment "Priority level: standard, expedited, or critical."@en ;
    rdfs:isDefinedBy <> .

:loadValueUsd a owl:DatatypeProperty ;
    rdfs:domain :Load ;
    rdfs:range xsd:float ;
    rdfs:label "valueUsd"@en ;
    rdfs:comment "Declared cargo value in USD."@en ;
    rdfs:isDefinedBy <> .

:loadCustomer a owl:ObjectProperty ;
    rdfs:domain :Load ;
    rdfs:range :Customer ;
    rdfs:label "customerId"@en ;
    rdfs:comment "Customer who owns the freight."@en ;
    rdfs:isDefinedBy <> .

:loadPickupTerminal a owl:ObjectProperty ;
    rdfs:domain :Load ;
    rdfs:range :Terminal ;
    rdfs:label "pickupTerminalId"@en ;
    rdfs:comment "Pickup location terminal."@en ;
    rdfs:isDefinedBy <> .

:loadDeliveryTerminal a owl:ObjectProperty ;
    rdfs:domain :Load ;
    rdfs:range :Terminal ;
    rdfs:label "deliveryTerminalId"@en ;
    rdfs:comment "Delivery location terminal."@en ;
    rdfs:isDefinedBy <> .

# === TRIP PROPERTIES ===

:tripId a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:string ;
    rdfs:label "tripId"@en ;
    rdfs:comment "Unique identifier for the trip."@en ;
    rdfs:isDefinedBy <> .

:tripNumber a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:string ;
    rdfs:label "tripNumber"@en ;
    rdfs:comment "Reference number such as 'TRP-70001'."@en ;
    rdfs:isDefinedBy <> .

:tripStatus a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:string ;
    rdfs:label "status"@en ;
    rdfs:comment "Current status: scheduled, in_progress, completed, cancelled, or interrupted."@en ;
    rdfs:isDefinedBy <> .

:tripScheduledDeparture a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:dateTime ;
    rdfs:label "scheduledDeparture"@en ;
    rdfs:comment "Planned departure time."@en ;
    rdfs:isDefinedBy <> .

:tripScheduledArrival a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:dateTime ;
    rdfs:label "scheduledArrival"@en ;
    rdfs:comment "Planned arrival time."@en ;
    rdfs:isDefinedBy <> .

:tripActualDeparture a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:dateTime ;
    rdfs:label "actualDeparture"@en ;
    rdfs:comment "Actual departure time, null if not started."@en ;
    rdfs:isDefinedBy <> .

:tripActualArrival a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:dateTime ;
    rdfs:label "actualArrival"@en ;
    rdfs:comment "Actual arrival time, null if not completed."@en ;
    rdfs:isDefinedBy <> .

:tripCurrentLatitude a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:float ;
    rdfs:label "currentLatitude"@en ;
    rdfs:comment "Last known latitude, null if not started."@en ;
    rdfs:isDefinedBy <> .

:tripCurrentLongitude a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:float ;
    rdfs:label "currentLongitude"@en ;
    rdfs:comment "Last known longitude, null if not started."@en ;
    rdfs:isDefinedBy <> .

:tripOdometerStart a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:integer ;
    rdfs:label "odometerStart"@en ;
    rdfs:comment "Truck odometer at trip start."@en ;
    rdfs:isDefinedBy <> .

:tripOdometerEnd a owl:DatatypeProperty ;
    rdfs:domain :Trip ;
    rdfs:range xsd:integer ;
    rdfs:label "odometerEnd"@en ;
    rdfs:comment "Truck odometer at trip end, null if in progress."@en ;
    rdfs:isDefinedBy <> .

:tripDriver a owl:ObjectProperty ;
    rdfs:domain :Trip ;
    rdfs:range :Driver ;
    rdfs:label "driverId"@en ;
    rdfs:comment "Assigned driver for the trip."@en ;
    rdfs:isDefinedBy <> .

:tripTruck a owl:ObjectProperty ;
    rdfs:domain :Trip ;
    rdfs:range :Truck ;
    rdfs:label "truckId"@en ;
    rdfs:comment "Assigned tractor for the trip."@en ;
    rdfs:isDefinedBy <> .

:tripTrailer a owl:ObjectProperty ;
    rdfs:domain :Trip ;
    rdfs:range :Trailer ;
    rdfs:label "trailerId"@en ;
    rdfs:comment "Assigned trailer for the trip."@en ;
    rdfs:isDefinedBy <> .

:tripLoad a owl:ObjectProperty ;
    rdfs:domain :Trip ;
    rdfs:range :Load ;
    rdfs:label "loadId"@en ;
    rdfs:comment "Freight being hauled on the trip."@en ;
    rdfs:isDefinedBy <> .

:tripRoute a owl:ObjectProperty ;
    rdfs:domain :Trip ;
    rdfs:range :Route ;
    rdfs:label "routeId"@en ;
    rdfs:comment "Route being followed for the trip."@en ;
    rdfs:isDefinedBy <> .

# === MAINTENANCE EVENT PROPERTIES ===

:maintenanceEventId a owl:DatatypeProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range xsd:string ;
    rdfs:label "maintenanceEventId"@en ;
    rdfs:comment "Unique identifier for the maintenance event."@en ;
    rdfs:isDefinedBy <> .

:maintenanceType a owl:DatatypeProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range xsd:string ;
    rdfs:label "maintenanceType"@en ;
    rdfs:comment "Type: oil_change, tire_replacement, brake_inspection, dpf_cleaning, transmission_service, or dot_inspection."@en ;
    rdfs:isDefinedBy <> .

:maintenanceStatus a owl:DatatypeProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range xsd:string ;
    rdfs:label "status"@en ;
    rdfs:comment "Current status: scheduled, in_progress, completed, or cancelled."@en ;
    rdfs:isDefinedBy <> .

:maintenanceScheduledDate a owl:DatatypeProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range xsd:date ;
    rdfs:label "scheduledDate"@en ;
    rdfs:comment "Planned date for maintenance."@en ;
    rdfs:isDefinedBy <> .

:maintenanceCompletedDate a owl:DatatypeProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range xsd:date ;
    rdfs:label "completedDate"@en ;
    rdfs:comment "Actual completion date."@en ;
    rdfs:isDefinedBy <> .

:maintenanceOdometerAtService a owl:DatatypeProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range xsd:integer ;
    rdfs:label "odometerAtService"@en ;
    rdfs:comment "Odometer reading at time of service."@en ;
    rdfs:isDefinedBy <> .

:maintenanceCostUsd a owl:DatatypeProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range xsd:float ;
    rdfs:label "costUsd"@en ;
    rdfs:comment "Maintenance cost in USD."@en ;
    rdfs:isDefinedBy <> .

:maintenanceTechnicianNotes a owl:DatatypeProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range xsd:string ;
    rdfs:label "technicianNotes"@en ;
    rdfs:comment "Service notes from the technician."@en ;
    rdfs:isDefinedBy <> .

:maintenanceTruck a owl:ObjectProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range :Truck ;
    rdfs:label "truckId"@en ;
    rdfs:comment "Truck being serviced."@en ;
    rdfs:isDefinedBy <> .

:maintenanceTerminal a owl:ObjectProperty ;
    rdfs:domain :MaintenanceEvent ;
    rdfs:range :Terminal ;
    rdfs:label "terminalId"@en ;
    rdfs:comment "Terminal where maintenance is performed."@en ;
    rdfs:isDefinedBy <> .

# === SERVICE TICKET PROPERTIES ===

:serviceTicketId a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:string ;
    rdfs:label "serviceTicketId"@en ;
    rdfs:comment "Unique identifier for the service ticket."@en ;
    rdfs:isDefinedBy <> .

:serviceTicketNumber a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:string ;
    rdfs:label "ticketNumber"@en ;
    rdfs:comment "Reference number such as 'SVC-40001'."@en ;
    rdfs:isDefinedBy <> .

:serviceFaultCodeSPN a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:integer ;
    rdfs:label "faultCodeSPN"@en ;
    rdfs:comment "J1939 SPN (Suspect Parameter Number)."@en ;
    rdfs:isDefinedBy <> .

:serviceFaultCodeFMI a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:integer ;
    rdfs:label "faultCodeFMI"@en ;
    rdfs:comment "J1939 FMI (Failure Mode Identifier)."@en ;
    rdfs:isDefinedBy <> .

:serviceFaultDescription a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:string ;
    rdfs:label "faultDescription"@en ;
    rdfs:comment "Human-readable fault description."@en ;
    rdfs:isDefinedBy <> .

:serviceSeverity a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:string ;
    rdfs:label "severity"@en ;
    rdfs:comment "Severity level: info, warning, or critical."@en ;
    rdfs:isDefinedBy <> .

:serviceStatus a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:string ;
    rdfs:label "status"@en ;
    rdfs:comment "Current status: open, dispatched, in_progress, resolved, or closed."@en ;
    rdfs:isDefinedBy <> .

:serviceReportedAt a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:dateTime ;
    rdfs:label "reportedAt"@en ;
    rdfs:comment "When the fault was reported."@en ;
    rdfs:isDefinedBy <> .

:serviceResolvedAt a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:dateTime ;
    rdfs:label "resolvedAt"@en ;
    rdfs:comment "When the issue was resolved."@en ;
    rdfs:isDefinedBy <> .

:serviceLatitude a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:float ;
    rdfs:label "latitude"@en ;
    rdfs:comment "Latitude where breakdown occurred."@en ;
    rdfs:isDefinedBy <> .

:serviceLongitude a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:float ;
    rdfs:label "longitude"@en ;
    rdfs:comment "Longitude where breakdown occurred."@en ;
    rdfs:isDefinedBy <> .

:serviceRepairNotes a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:string ;
    rdfs:label "repairNotes"@en ;
    rdfs:comment "Technician repair notes."@en ;
    rdfs:isDefinedBy <> .

:serviceCostUsd a owl:DatatypeProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range xsd:float ;
    rdfs:label "costUsd"@en ;
    rdfs:comment "Repair cost in USD."@en ;
    rdfs:isDefinedBy <> .

:serviceTruck a owl:ObjectProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range :Truck ;
    rdfs:label "truckId"@en ;
    rdfs:comment "Affected truck."@en ;
    rdfs:isDefinedBy <> .

:serviceTrip a owl:ObjectProperty ;
    rdfs:domain :ServiceTicket ;
    rdfs:range :Trip ;
    rdfs:label "tripId"@en ;
    rdfs:comment "Trip during which breakdown occurred, nullable."@en ;
    rdfs:isDefinedBy <> .

# === HOS LOG PROPERTIES ===

:hosLogId a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:string ;
    rdfs:label "hosLogId"@en ;
    rdfs:comment "Unique identifier for the HOS log entry."@en ;
    rdfs:isDefinedBy <> .

:hosDutyStatus a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:string ;
    rdfs:label "dutyStatus"@en ;
    rdfs:comment "Duty status: driving, on_duty_not_driving, sleeper_berth, or off_duty."@en ;
    rdfs:isDefinedBy <> .

:hosStartTime a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:dateTime ;
    rdfs:label "startTime"@en ;
    rdfs:comment "Status period start time."@en ;
    rdfs:isDefinedBy <> .

:hosEndTime a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:dateTime ;
    rdfs:label "endTime"@en ;
    rdfs:comment "Status period end time, null if current."@en ;
    rdfs:isDefinedBy <> .

:hosStartLatitude a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:float ;
    rdfs:label "startLatitude"@en ;
    rdfs:comment "Location latitude at status start."@en ;
    rdfs:isDefinedBy <> .

:hosStartLongitude a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:float ;
    rdfs:label "startLongitude"@en ;
    rdfs:comment "Location longitude at status start."@en ;
    rdfs:isDefinedBy <> .

:hosStartOdometer a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:integer ;
    rdfs:label "startOdometer"@en ;
    rdfs:comment "Odometer at status start."@en ;
    rdfs:isDefinedBy <> .

:hosDrivingHoursUsed a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:float ;
    rdfs:label "drivingHoursUsed"@en ;
    rdfs:comment "Cumulative driving hours in current 14-hour window."@en ;
    rdfs:isDefinedBy <> .

:hosDutyHoursUsed a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:float ;
    rdfs:label "dutyHoursUsed"@en ;
    rdfs:comment "Cumulative on-duty hours in current 14-hour window."@en ;
    rdfs:isDefinedBy <> .

:hosCycleHoursUsed a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:float ;
    rdfs:label "cycleHoursUsed"@en ;
    rdfs:comment "Cumulative hours in 70-hour/8-day cycle."@en ;
    rdfs:isDefinedBy <> .

:hosDrivingHoursRemaining a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:float ;
    rdfs:label "drivingHoursRemaining"@en ;
    rdfs:comment "Hours of driving time remaining."@en ;
    rdfs:isDefinedBy <> .

:hosDutyHoursRemaining a owl:DatatypeProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range xsd:float ;
    rdfs:label "dutyHoursRemaining"@en ;
    rdfs:comment "Hours of on-duty time remaining."@en ;
    rdfs:isDefinedBy <> .

:hosDriver a owl:ObjectProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range :Driver ;
    rdfs:label "driverId"@en ;
    rdfs:comment "Driver associated with this HOS log."@en ;
    rdfs:isDefinedBy <> .

:hosTrip a owl:ObjectProperty ;
    rdfs:domain :DriverHOSLog ;
    rdfs:range :Trip ;
    rdfs:label "tripId"@en ;
    rdfs:comment "Associated trip, nullable if off-duty."@en ;
    rdfs:isDefinedBy <> .

# Provenance
<> prov:wasGeneratedBy [
    a schema:SoftwareApplication ;
    schema:name "kg-generator skill"@en ;
    schema:url <https://github.com/OpenLinkSoftware/ai-agent-skills/tree/main/kg-generator> ;
    schema:description "Generates comprehensive Knowledge Graphs from content at file: or http(s): scheme URLs."@en
] .