# RDF Ontology generated by @inferal-relay/rdf-emitter

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix tspv: <https://relay.inferal.com/ontology/typespec/versioning/> .
@prefix relay: <https://relay.inferal.com/ontology/> .
@prefix schema: <https://schema.org/> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix ldes: <https://w3id.org/ldes#> .
@prefix tree: <https://w3id.org/tree#> .
@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix http: <http://www.w3.org/2011/http#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix vann: <http://purl.org/vocab/vann/> .
@prefix ontology: <https://relay.inferal.com/ontology/> .

# Ontology metadata
<https://relay.inferal.com/ontology/>
  rdfs:label "Inferal Relay Ontology" ;
  dcterms:title "Inferal Relay Ontology" ;
  dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
  dcterms:publisher <https://inferal.com/> ;
  vann:preferredNamespacePrefix "ontology" ;
  vann:preferredNamespaceUri "https://relay.inferal.com/ontology/" .

# Class: Relay Error
relay:Error a rdfs:Class ;
  rdfs:label "Relay Error" ;
  rdfs:comment "Standard error response for Relay APIs." ;
  rdfs:subClassOf schema:Thing .

# Class: Unauthorized Error
relay:UnauthorizedError a rdfs:Class ;
  rdfs:label "Unauthorized Error" ;
  rdfs:comment "Unauthorized error (401)." .

# Class: Not Found Error
relay:NotFoundError a rdfs:Class ;
  rdfs:label "Not Found Error" ;
  rdfs:comment "Not found error (404)." .

# Class: Forbidden Error
relay:ForbiddenError a rdfs:Class ;
  rdfs:label "Forbidden Error" ;
  rdfs:comment "Forbidden error (403)." .

# Class: Bad Request Error
relay:BadRequestError a rdfs:Class ;
  rdfs:label "Bad Request Error" ;
  rdfs:comment "Bad request error (400)." .

# Class: Not Acceptable Error
relay:NotAcceptableError a rdfs:Class ;
  rdfs:label "Not Acceptable Error" ;
  rdfs:comment "Not Acceptable error (406)." .

# Class: Stream Health Info
relay:StreamHealth a rdfs:Class ;
  rdfs:label "Stream Health Info" ;
  rdfs:comment "Stream health information including gap detection status.\n\nReturned when `includeHealth=true` query parameter is set." .

# Class: Webhook Event
relay:WebhookEvent a rdfs:Class ;
  rdfs:label "Webhook Event" ;
  rdfs:comment "A captured webhook event.\n\nRepresents the full HTTP request including method, path, headers, and body." ;
  rdfs:subClassOf prov:Activity ;
  rdfs:subClassOf http:Request .

# Class: Events Response
relay:EventsResponse a rdfs:Class ;
  rdfs:label "Events Response" ;
  rdfs:comment "Response for event polling endpoint." .

# Class: Endpoint Info
relay:Endpoint a rdfs:Class ;
  rdfs:label "Endpoint Info" ;
  rdfs:comment "Endpoint information.\n\nRepresents a provisioned webhook endpoint with its metadata." ;
  rdfs:subClassOf schema:EntryPoint .

# Class: Provision Request
relay:ProvisionRequest a rdfs:Class ;
  rdfs:label "Provision Request" ;
  rdfs:comment "Request to provision a new endpoint." .

# Class: Provision Response
relay:ProvisionResponse a rdfs:Class ;
  rdfs:label "Provision Response" ;
  rdfs:comment "Response from endpoint provisioning." .

# Class: Endpoints List Response
relay:EndpointsListResponse a rdfs:Class ;
  rdfs:label "Endpoints List Response" ;
  rdfs:comment "Response listing all endpoints for a tenant." .

# Class: Archive Response
relay:ArchiveResponse a rdfs:Class ;
  rdfs:label "Archive Response" ;
  rdfs:comment "Response from archive operation." .

# Class: Format Config
relay:FormatConfig a rdfs:Class ;
  rdfs:label "Format Config" ;
  rdfs:comment "Format configuration for a stream." ;
  rdfs:subClassOf dcat:Distribution .

# Class: Stream Info
relay:Stream a rdfs:Class ;
  rdfs:label "Stream Info" ;
  rdfs:comment "Stream information and metadata." ;
  rdfs:subClassOf ldes:EventStream ;
  rdfs:subClassOf dcat:Dataset .

# Class: Stream List Response
relay:StreamListResponse a rdfs:Class ;
  rdfs:label "Stream List Response" ;
  rdfs:comment "Response listing available streams." .

# Class: Ingest Request
relay:IngestRequest a rdfs:Class ;
  rdfs:label "Ingest Request" ;
  rdfs:comment "Request body for live event ingestion.\n\nSubmits a single LDES member to a stream facet." .

# Class: Ingest Response
relay:IngestResponse a rdfs:Class ;
  rdfs:label "Ingest Response" ;
  rdfs:comment "Response from a successful live event ingestion." .

# Class: LDESMember
ldes:Member a rdfs:Class ;
  rdfs:label "LDESMember" ;
  rdfs:comment "An LDES member representing a single item in the event stream." .

# Class: Tree Relation
tree:Relation a rdfs:Class ;
  rdfs:label "Tree Relation" ;
  rdfs:comment "A TREE relation for navigating between pages/nodes." .

# Class: LDESNode Response
tree:Node a rdfs:Class ;
  rdfs:label "LDESNode Response" ;
  rdfs:comment "LDES node response following the TREE specification.\n\nRepresents a page of members with navigation relations." ;
  rdfs:subClassOf ldes:EventStream .

# Generated Record classes for InferalRelay.IngestRequest.member
<https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/Container> a rdfs:Class ;
  rdfs:label "Member Record" .
<https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/Entry> a rdfs:Class ;
  rdfs:label "Member Entry" .

# Generated Record classes for InferalRelay.WebhookEvent.headers
<https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/Container> a rdfs:Class ;
  rdfs:label "Headers Record" .
<https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/Entry> a rdfs:Class ;
  rdfs:label "Headers Entry" .

# Query parent property: accepted
<https://relay.inferal.com/ontology/property/accepted> a rdf:Property ;
  rdfs:label "accepted" ;
  rdfs:comment "Query alias: 1 model declares accepted." .

# Query parent property: body
<https://relay.inferal.com/ontology/property/body> a rdf:Property ;
  rdfs:label "body" ;
  rdfs:comment "Query alias: 1 model declares body." .

# Query parent property: content type
<https://relay.inferal.com/ontology/property/contentType> a rdf:Property ;
  rdfs:label "content type" ;
  rdfs:comment "Query alias: 1 model declares contentType." .

# Query parent property: created
<https://relay.inferal.com/ontology/property/created> a rdf:Property ;
  rdfs:label "created" ;
  rdfs:comment "Query alias: 1 model declares created." .

# Query parent property: created at
<https://relay.inferal.com/ontology/property/createdAt> a rdf:Property ;
  rdfs:label "created at" ;
  rdfs:comment "Query alias: 1 model declares createdAt." .

# Query parent property: cursor
<https://relay.inferal.com/ontology/property/cursor> a rdf:Property ;
  rdfs:label "cursor" ;
  rdfs:comment "Query alias: 1 model declares cursor." .

# Query parent property: endpoints
<https://relay.inferal.com/ontology/property/endpoints> a rdf:Property ;
  rdfs:label "endpoints" ;
  rdfs:comment "Query alias: 1 model declares endpoints." .

# Query parent property: error
<https://relay.inferal.com/ontology/property/error> a rdf:Property ;
  rdfs:label "error" ;
  rdfs:comment "Query alias: 6 models declare error." .

# Query parent property: event id
<https://relay.inferal.com/ontology/property/eventId> a rdf:Property ;
  rdfs:label "event id" ;
  rdfs:comment "Query alias: 1 model declares eventId." .

# Query parent property: events
<https://relay.inferal.com/ontology/property/events> a rdf:Property ;
  rdfs:label "events" ;
  rdfs:comment "Query alias: 1 model declares events." .

# Query parent property: events archived
<https://relay.inferal.com/ontology/property/eventsArchived> a rdf:Property ;
  rdfs:label "events archived" ;
  rdfs:comment "Query alias: 1 model declares eventsArchived." .

# Query parent property: extension
<https://relay.inferal.com/ontology/property/extension> a rdf:Property ;
  rdfs:label "extension" ;
  rdfs:comment "Query alias: 1 model declares extension." .

# Query parent property: formats
<https://relay.inferal.com/ontology/property/formats> a rdf:Property ;
  rdfs:label "formats" ;
  rdfs:comment "Query alias: 1 model declares formats." .

# Query parent property: gap detection enabled
<https://relay.inferal.com/ontology/property/gapDetectionEnabled> a rdf:Property ;
  rdfs:label "gap detection enabled" ;
  rdfs:comment "Query alias: 1 model declares gapDetectionEnabled." .

# Query parent property: generated at time
<https://relay.inferal.com/ontology/property/generatedAtTime> a rdf:Property ;
  rdfs:label "generated at time" ;
  rdfs:comment "Query alias: 1 model declares generatedAtTime." .

# Query parent property: has more
<https://relay.inferal.com/ontology/property/hasMore> a rdf:Property ;
  rdfs:label "has more" ;
  rdfs:comment "Query alias: 1 model declares hasMore." .

# Query parent property: headers
<https://relay.inferal.com/ontology/property/headers> a rdf:Property ;
  rdfs:label "headers" ;
  rdfs:comment "Query alias: 1 model declares headers." .

# Query parent property: highest tracked window
<https://relay.inferal.com/ontology/property/highestTrackedWindow> a rdf:Property ;
  rdfs:label "highest tracked window" ;
  rdfs:comment "Query alias: 1 model declares highestTrackedWindow." .

# Query parent property: hostname
<https://relay.inferal.com/ontology/property/hostname> a rdf:Property ;
  rdfs:label "hostname" ;
  rdfs:comment "Query alias: 4 models declare hostname." .

# Query parent property: known gaps
<https://relay.inferal.com/ontology/property/knownGaps> a rdf:Property ;
  rdfs:label "known gaps" ;
  rdfs:comment "Query alias: 1 model declares knownGaps." .

# Query parent property: latest timestamp
<https://relay.inferal.com/ontology/property/latestTimestamp> a rdf:Property ;
  rdfs:label "latest timestamp" ;
  rdfs:comment "Query alias: 1 model declares latestTimestamp." .

# Query parent property: member
<https://relay.inferal.com/ontology/property/member> a rdf:Property ;
  rdfs:label "member" ;
  rdfs:comment "Query alias: 1 model declares member." .

# Query parent property: message
<https://relay.inferal.com/ontology/property/message> a rdf:Property ;
  rdfs:label "message" ;
  rdfs:comment "Query alias: 6 models declare message." .

# Query parent property: method
<https://relay.inferal.com/ontology/property/method> a rdf:Property ;
  rdfs:label "method" ;
  rdfs:comment "Query alias: 1 model declares method." .

# Query parent property: node
<https://relay.inferal.com/ontology/property/node> a rdf:Property ;
  rdfs:label "node" ;
  rdfs:comment "Query alias: 1 model declares node." .

# Query parent property: oldest tracked window
<https://relay.inferal.com/ontology/property/oldestTrackedWindow> a rdf:Property ;
  rdfs:label "oldest tracked window" ;
  rdfs:comment "Query alias: 1 model declares oldestTrackedWindow." .

# Query parent property: path
<https://relay.inferal.com/ontology/property/path> a rdf:Property ;
  rdfs:label "path" ;
  rdfs:comment "Query alias: 2 models declare path." .

# Query parent property: read key
<https://relay.inferal.com/ontology/property/readKey> a rdf:Property ;
  rdfs:label "read key" ;
  rdfs:comment "Query alias: 1 model declares readKey." .

# Query parent property: shard count
<https://relay.inferal.com/ontology/property/shardCount> a rdf:Property ;
  rdfs:label "shard count" ;
  rdfs:comment "Query alias: 1 model declares shardCount." .

# Query parent property: status
<https://relay.inferal.com/ontology/property/status> a rdf:Property ;
  rdfs:label "status" ;
  rdfs:comment "Query alias: 1 model declares status." .

# Query parent property: status code
<https://relay.inferal.com/ontology/property/statusCode> a rdf:Property ;
  rdfs:label "status code" ;
  rdfs:comment "Query alias: 5 models declare statusCode." .

# Query parent property: streams
<https://relay.inferal.com/ontology/property/streams> a rdf:Property ;
  rdfs:label "streams" ;
  rdfs:comment "Query alias: 1 model declares streams." .

# Query parent property: timestamp
<https://relay.inferal.com/ontology/property/timestamp> a rdf:Property ;
  rdfs:label "timestamp" ;
  rdfs:comment "Query alias: 1 model declares timestamp." .

# Query parent property: value
<https://relay.inferal.com/ontology/property/value> a rdf:Property ;
  rdfs:label "value" ;
  rdfs:comment "Query alias: 1 model declares value." .

# Query parent property: window epoch
<https://relay.inferal.com/ontology/property/windowEpoch> a rdf:Property ;
  rdfs:label "window epoch" ;
  rdfs:comment "Query alias: 1 model declares windowEpoch." .

# Property: error
<https://relay.inferal.com/ontology/property/InferalRelay.RelayError/error> a rdf:Property ;
  rdfs:label "error" ;
  rdfs:comment "Error code (e.g., 'unauthorized', 'not_found')" ;
  schema:alternateName "error" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/error> ;
  rdfs:domain relay:Error ;
  rdfs:range xsd:string .

# Property: message
<https://relay.inferal.com/ontology/property/InferalRelay.RelayError/message> a rdf:Property ;
  rdfs:label "message" ;
  rdfs:comment "Human-readable error message" ;
  schema:alternateName "message" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/message> ;
  rdfs:subPropertyOf schema:description ;
  rdfs:domain relay:Error ;
  rdfs:range xsd:string .

# Property: status code
<https://relay.inferal.com/ontology/property/InferalRelay.UnauthorizedError/statusCode> a rdf:Property ;
  rdfs:label "status code" ;
  schema:alternateName "statusCode" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/statusCode> ;
  rdfs:domain relay:UnauthorizedError ;
  rdfs:range xsd:integer .

# Property: error
<https://relay.inferal.com/ontology/property/InferalRelay.UnauthorizedError/error> a rdf:Property ;
  rdfs:label "error" ;
  rdfs:comment "Error code" ;
  schema:alternateName "error" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/error> ;
  rdfs:domain relay:UnauthorizedError ;
  rdfs:range xsd:string .

# Property: message
<https://relay.inferal.com/ontology/property/InferalRelay.UnauthorizedError/message> a rdf:Property ;
  rdfs:label "message" ;
  rdfs:comment "Error message" ;
  schema:alternateName "message" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/message> ;
  rdfs:domain relay:UnauthorizedError ;
  rdfs:range xsd:string .

# Property: status code
<https://relay.inferal.com/ontology/property/InferalRelay.NotFoundError/statusCode> a rdf:Property ;
  rdfs:label "status code" ;
  schema:alternateName "statusCode" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/statusCode> ;
  rdfs:domain relay:NotFoundError ;
  rdfs:range xsd:integer .

# Property: error
<https://relay.inferal.com/ontology/property/InferalRelay.NotFoundError/error> a rdf:Property ;
  rdfs:label "error" ;
  rdfs:comment "Error code" ;
  schema:alternateName "error" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/error> ;
  rdfs:domain relay:NotFoundError ;
  rdfs:range xsd:string .

# Property: message
<https://relay.inferal.com/ontology/property/InferalRelay.NotFoundError/message> a rdf:Property ;
  rdfs:label "message" ;
  rdfs:comment "Error message" ;
  schema:alternateName "message" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/message> ;
  rdfs:domain relay:NotFoundError ;
  rdfs:range xsd:string .

# Property: status code
<https://relay.inferal.com/ontology/property/InferalRelay.ForbiddenError/statusCode> a rdf:Property ;
  rdfs:label "status code" ;
  schema:alternateName "statusCode" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/statusCode> ;
  rdfs:domain relay:ForbiddenError ;
  rdfs:range xsd:integer .

# Property: error
<https://relay.inferal.com/ontology/property/InferalRelay.ForbiddenError/error> a rdf:Property ;
  rdfs:label "error" ;
  rdfs:comment "Error code" ;
  schema:alternateName "error" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/error> ;
  rdfs:domain relay:ForbiddenError ;
  rdfs:range xsd:string .

# Property: message
<https://relay.inferal.com/ontology/property/InferalRelay.ForbiddenError/message> a rdf:Property ;
  rdfs:label "message" ;
  rdfs:comment "Error message" ;
  schema:alternateName "message" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/message> ;
  rdfs:domain relay:ForbiddenError ;
  rdfs:range xsd:string .

# Property: status code
<https://relay.inferal.com/ontology/property/InferalRelay.BadRequestError/statusCode> a rdf:Property ;
  rdfs:label "status code" ;
  schema:alternateName "statusCode" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/statusCode> ;
  rdfs:domain relay:BadRequestError ;
  rdfs:range xsd:integer .

# Property: error
<https://relay.inferal.com/ontology/property/InferalRelay.BadRequestError/error> a rdf:Property ;
  rdfs:label "error" ;
  rdfs:comment "Error code" ;
  schema:alternateName "error" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/error> ;
  rdfs:domain relay:BadRequestError ;
  rdfs:range xsd:string .

# Property: message
<https://relay.inferal.com/ontology/property/InferalRelay.BadRequestError/message> a rdf:Property ;
  rdfs:label "message" ;
  rdfs:comment "Error message" ;
  schema:alternateName "message" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/message> ;
  rdfs:domain relay:BadRequestError ;
  rdfs:range xsd:string .

# Property: status code
<https://relay.inferal.com/ontology/property/InferalRelay.NotAcceptableError/statusCode> a rdf:Property ;
  rdfs:label "status code" ;
  schema:alternateName "statusCode" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/statusCode> ;
  rdfs:domain relay:NotAcceptableError ;
  rdfs:range xsd:integer .

# Property: error
<https://relay.inferal.com/ontology/property/InferalRelay.NotAcceptableError/error> a rdf:Property ;
  rdfs:label "error" ;
  rdfs:comment "Error code" ;
  schema:alternateName "error" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/error> ;
  rdfs:domain relay:NotAcceptableError ;
  rdfs:range xsd:string .

# Property: message
<https://relay.inferal.com/ontology/property/InferalRelay.NotAcceptableError/message> a rdf:Property ;
  rdfs:label "message" ;
  rdfs:comment "Error message" ;
  schema:alternateName "message" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/message> ;
  rdfs:domain relay:NotAcceptableError ;
  rdfs:range xsd:string .

# Property: gap detection enabled
<https://relay.inferal.com/ontology/property/InferalRelay.StreamHealthInfo/gapDetectionEnabled> a rdf:Property ;
  rdfs:label "gap detection enabled" ;
  rdfs:comment "Whether gap detection is enabled for this stream" ;
  schema:alternateName "gapDetectionEnabled" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/gapDetectionEnabled> ;
  rdfs:domain relay:StreamHealth ;
  rdfs:range xsd:boolean .

# Property: known gaps
<https://relay.inferal.com/ontology/property/InferalRelay.StreamHealthInfo/knownGaps> a rdf:Property ;
  rdfs:label "known gaps" ;
  rdfs:comment "List of known gap window epochs in seconds" ;
  schema:alternateName "knownGaps" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/knownGaps> ;
  rdfs:domain relay:StreamHealth ;
  rdfs:range xsd:long .

# Property: oldest tracked window
<https://relay.inferal.com/ontology/property/InferalRelay.StreamHealthInfo/oldestTrackedWindow> a rdf:Property ;
  rdfs:label "oldest tracked window" ;
  rdfs:comment "Oldest window still being tracked (epoch in seconds)" ;
  schema:alternateName "oldestTrackedWindow" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/oldestTrackedWindow> ;
  rdfs:domain relay:StreamHealth ;
  rdfs:range xsd:long .

# Property: highest tracked window
<https://relay.inferal.com/ontology/property/InferalRelay.StreamHealthInfo/highestTrackedWindow> a rdf:Property ;
  rdfs:label "highest tracked window" ;
  rdfs:comment "Highest window seen so far (epoch in seconds)" ;
  schema:alternateName "highestTrackedWindow" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/highestTrackedWindow> ;
  rdfs:domain relay:StreamHealth ;
  rdfs:range xsd:long .

# Property: id
<https://relay.inferal.com/ontology/property/InferalRelay.WebhookEvent/id> a rdf:Property ;
  rdfs:label "id" ;
  rdfs:comment "Auto-incrementing event ID" ;
  schema:alternateName "id" ;
  rdfs:domain relay:WebhookEvent ;
  rdfs:range xsd:long .

# Property: timestamp
<https://relay.inferal.com/ontology/property/InferalRelay.WebhookEvent/timestamp> a rdf:Property ;
  rdfs:label "timestamp" ;
  rdfs:comment "Timestamp when the event was received (epoch milliseconds)" ;
  schema:alternateName "timestamp" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/timestamp> ;
  rdfs:domain relay:WebhookEvent ;
  rdfs:range xsd:long .

# Property: method
<https://relay.inferal.com/ontology/property/InferalRelay.WebhookEvent/method> a rdf:Property ;
  rdfs:label "method" ;
  rdfs:comment "HTTP method of the request" ;
  schema:alternateName "method" ;
  rdfs:subPropertyOf http:methodName ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/method> ;
  rdfs:domain relay:WebhookEvent ;
  rdfs:range xsd:string .

# Property: path
<https://relay.inferal.com/ontology/property/InferalRelay.WebhookEvent/path> a rdf:Property ;
  rdfs:label "path" ;
  rdfs:comment "Request path including query string" ;
  schema:alternateName "path" ;
  rdfs:subPropertyOf http:requestURI ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/path> ;
  rdfs:domain relay:WebhookEvent ;
  rdfs:range xsd:string .

# Property: headers
<https://relay.inferal.com/ontology/property/InferalRelay.WebhookEvent/headers> a rdf:Property ;
  rdfs:label "headers" ;
  rdfs:comment "HTTP headers as a map of header name to array of values" ;
  schema:alternateName "headers" ;
  rdfs:subPropertyOf http:headers ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/headers> ;
  rdfs:domain relay:WebhookEvent ;
  rdfs:range <https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/Container> .

# Property: body
<https://relay.inferal.com/ontology/property/InferalRelay.WebhookEvent/body> a rdf:Property ;
  rdfs:label "body" ;
  rdfs:comment "Request body (may be null for GET/DELETE requests)" ;
  schema:alternateName "body" ;
  rdfs:subPropertyOf http:body ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/body> ;
  rdfs:domain relay:WebhookEvent ;
  rdfs:range xsd:string .

# Property: events
<https://relay.inferal.com/ontology/property/InferalRelay.EventsResponse/events> a rdf:Property ;
  rdfs:label "events" ;
  rdfs:comment "Array of events matching the query" ;
  schema:alternateName "events" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/events> ;
  rdfs:domain relay:EventsResponse ;
  rdfs:range relay:WebhookEvent .

# Property: cursor
<https://relay.inferal.com/ontology/property/InferalRelay.EventsResponse/cursor> a rdf:Property ;
  rdfs:label "cursor" ;
  rdfs:comment "Cursor for pagination - use as 'cursor' param in next request" ;
  schema:alternateName "cursor" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/cursor> ;
  rdfs:domain relay:EventsResponse ;
  rdfs:range xsd:long .

# Property: has more
<https://relay.inferal.com/ontology/property/InferalRelay.EventsResponse/hasMore> a rdf:Property ;
  rdfs:label "has more" ;
  rdfs:comment "Whether there are more events available" ;
  schema:alternateName "has_more" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/hasMore> ;
  rdfs:domain relay:EventsResponse ;
  rdfs:range xsd:boolean .

# Property: hostname
<https://relay.inferal.com/ontology/property/InferalRelay.EndpointInfo/hostname> a rdf:Property ;
  rdfs:label "hostname" ;
  rdfs:comment "Full hostname of the endpoint" ;
  schema:alternateName "hostname" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/hostname> ;
  rdfs:domain relay:Endpoint ;
  rdfs:range xsd:string .

# Property: created at
<https://relay.inferal.com/ontology/property/InferalRelay.EndpointInfo/createdAt> a rdf:Property ;
  rdfs:label "created at" ;
  rdfs:comment "When the endpoint was created (ISO8601)" ;
  schema:alternateName "created_at" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/createdAt> ;
  rdfs:subPropertyOf schema:dateCreated ;
  rdfs:domain relay:Endpoint ;
  rdfs:range xsd:dateTime .

# Property: hostname
<https://relay.inferal.com/ontology/property/InferalRelay.ProvisionRequest/hostname> a rdf:Property ;
  rdfs:label "hostname" ;
  rdfs:comment "Full hostname for the endpoint (e.g., 'a.foo.tenant.wh.relay.inferal.com')" ;
  schema:alternateName "hostname" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/hostname> ;
  rdfs:domain relay:ProvisionRequest ;
  rdfs:range xsd:string .

# Property: read key
<https://relay.inferal.com/ontology/property/InferalRelay.ProvisionRequest/readKey> a rdf:Property ;
  rdfs:label "read key" ;
  rdfs:comment "Read key for accessing events from this endpoint" ;
  schema:alternateName "read_key" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/readKey> ;
  rdfs:domain relay:ProvisionRequest ;
  rdfs:range xsd:string .

# Property: hostname
<https://relay.inferal.com/ontology/property/InferalRelay.ProvisionResponse/hostname> a rdf:Property ;
  rdfs:label "hostname" ;
  rdfs:comment "The provisioned hostname" ;
  schema:alternateName "hostname" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/hostname> ;
  rdfs:domain relay:ProvisionResponse ;
  rdfs:range xsd:string .

# Property: created
<https://relay.inferal.com/ontology/property/InferalRelay.ProvisionResponse/created> a rdf:Property ;
  rdfs:label "created" ;
  rdfs:comment "Whether a new endpoint was created (vs updated)" ;
  schema:alternateName "created" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/created> ;
  rdfs:domain relay:ProvisionResponse ;
  rdfs:range xsd:boolean .

# Property: endpoints
<https://relay.inferal.com/ontology/property/InferalRelay.EndpointsListResponse/endpoints> a rdf:Property ;
  rdfs:label "endpoints" ;
  rdfs:comment "Array of endpoint information" ;
  schema:alternateName "endpoints" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/endpoints> ;
  rdfs:domain relay:EndpointsListResponse ;
  rdfs:range relay:Endpoint .

# Property: status
<https://relay.inferal.com/ontology/property/InferalRelay.ArchiveResponse/status> a rdf:Property ;
  rdfs:label "status" ;
  rdfs:comment "Status of the operation" ;
  schema:alternateName "status" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/status> ;
  rdfs:domain relay:ArchiveResponse ;
  rdfs:range xsd:string .

# Property: hostname
<https://relay.inferal.com/ontology/property/InferalRelay.ArchiveResponse/hostname> a rdf:Property ;
  rdfs:label "hostname" ;
  rdfs:comment "Hostname that was archived" ;
  schema:alternateName "hostname" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/hostname> ;
  rdfs:domain relay:ArchiveResponse ;
  rdfs:range xsd:string .

# Property: events archived
<https://relay.inferal.com/ontology/property/InferalRelay.ArchiveResponse/eventsArchived> a rdf:Property ;
  rdfs:label "events archived" ;
  rdfs:comment "Number of events archived" ;
  schema:alternateName "events_archived" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/eventsArchived> ;
  rdfs:domain relay:ArchiveResponse ;
  rdfs:range xsd:long .

# Property: content type
<https://relay.inferal.com/ontology/property/InferalRelay.FormatConfig/contentType> a rdf:Property ;
  rdfs:label "content type" ;
  rdfs:comment "MIME content type for this format" ;
  schema:alternateName "contentType" ;
  rdfs:subPropertyOf dcat:mediaType ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/contentType> ;
  rdfs:domain relay:FormatConfig ;
  rdfs:range xsd:string .

# Property: extension
<https://relay.inferal.com/ontology/property/InferalRelay.FormatConfig/extension> a rdf:Property ;
  rdfs:label "extension" ;
  rdfs:comment "File extension for this format (e.g., '.jsonld', '.ttl')" ;
  schema:alternateName "extension" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/extension> ;
  rdfs:domain relay:FormatConfig ;
  rdfs:range xsd:string .

# Property: id
<https://relay.inferal.com/ontology/property/InferalRelay.StreamInfo/id> a rdf:Property ;
  rdfs:label "id" ;
  rdfs:comment "Stream identifier" ;
  schema:alternateName "id" ;
  rdfs:subPropertyOf schema:identifier ;
  rdfs:domain relay:Stream ;
  rdfs:range xsd:string .

# Property: formats
<https://relay.inferal.com/ontology/property/InferalRelay.StreamInfo/formats> a rdf:Property ;
  rdfs:label "formats" ;
  rdfs:comment "Available format names (e.g., 'jsonld', 'turtle', 'ntriples', 'json')" ;
  schema:alternateName "formats" ;
  rdfs:subPropertyOf dcat:distribution ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/formats> ;
  rdfs:domain relay:Stream ;
  rdfs:range xsd:string .

# Property: shard count
<https://relay.inferal.com/ontology/property/InferalRelay.StreamInfo/shardCount> a rdf:Property ;
  rdfs:label "shard count" ;
  rdfs:comment "Shard count for WebSocket connections" ;
  schema:alternateName "shardCount" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/shardCount> ;
  rdfs:domain relay:Stream ;
  rdfs:range xsd:int .

# Property: latest timestamp
<https://relay.inferal.com/ontology/property/InferalRelay.StreamInfo/latestTimestamp> a rdf:Property ;
  rdfs:label "latest timestamp" ;
  rdfs:comment "Latest timestamp of data in the stream (epoch ms)" ;
  schema:alternateName "latestTimestamp" ;
  rdfs:subPropertyOf dcat:modified ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/latestTimestamp> ;
  rdfs:domain relay:Stream ;
  rdfs:range xsd:long .

# Property: streams
<https://relay.inferal.com/ontology/property/InferalRelay.StreamListResponse/streams> a rdf:Property ;
  rdfs:label "streams" ;
  rdfs:comment "Array of accessible streams" ;
  schema:alternateName "streams" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/streams> ;
  rdfs:domain relay:StreamListResponse ;
  rdfs:range relay:Stream .

# Property: member
<https://relay.inferal.com/ontology/property/InferalRelay.IngestRequest/member> a rdf:Property ;
  rdfs:label "member" ;
  rdfs:comment "LDES member to ingest (arbitrary JSON-LD object)" ;
  schema:alternateName "member" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/member> ;
  rdfs:domain relay:IngestRequest ;
  rdfs:range <https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/Container> .

# Property: accepted
<https://relay.inferal.com/ontology/property/InferalRelay.IngestResponse/accepted> a rdf:Property ;
  rdfs:label "accepted" ;
  rdfs:comment "Whether the event was accepted" ;
  schema:alternateName "accepted" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/accepted> ;
  rdfs:domain relay:IngestResponse ;
  rdfs:range xsd:boolean .

# Property: event id
<https://relay.inferal.com/ontology/property/InferalRelay.IngestResponse/eventId> a rdf:Property ;
  rdfs:label "event id" ;
  rdfs:comment "UUIDv7 event ID assigned to the ingested member" ;
  schema:alternateName "eventId" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/eventId> ;
  rdfs:domain relay:IngestResponse ;
  rdfs:range xsd:string .

# Property: window epoch
<https://relay.inferal.com/ontology/property/InferalRelay.IngestResponse/windowEpoch> a rdf:Property ;
  rdfs:label "window epoch" ;
  rdfs:comment "Window epoch (seconds) the event was assigned to" ;
  schema:alternateName "windowEpoch" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/windowEpoch> ;
  rdfs:domain relay:IngestResponse ;
  rdfs:range xsd:long .

# Property: generated at time
<https://relay.inferal.com/ontology/property/InferalRelay.LDESMember/generatedAtTime> a rdf:Property ;
  rdfs:label "generated at time" ;
  rdfs:comment "When this member was generated" ;
  schema:alternateName "generatedAtTime" ;
  rdfs:subPropertyOf prov:generatedAtTime ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/generatedAtTime> ;
  rdfs:domain ldes:Member ;
  rdfs:range xsd:dateTime .

# Property: event id
relay:eventId a rdf:Property ;
  rdfs:label "event id" ;
  rdfs:comment "UUIDv7 event ID for pagination (lexicographic order = temporal order)" ;
  schema:alternateName "relay:eventId" ;
  rdfs:domain ldes:Member ;
  rdfs:range xsd:string .

# Property: path
relay:path a rdf:Property ;
  rdfs:label "path" ;
  rdfs:comment "Hierarchical path for this member (e.g., 'us-east/prod'). Omit for root level." ;
  schema:alternateName "relay:path" ;
  rdfs:domain ldes:Member ;
  rdfs:range xsd:string .

# Property: node
<https://relay.inferal.com/ontology/property/InferalRelay.TreeRelation/node> a rdf:Property ;
  rdfs:label "node" ;
  rdfs:comment "URL to the related node" ;
  schema:alternateName "node" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/node> ;
  rdfs:subPropertyOf tree:node ;
  rdfs:domain tree:Relation ;
  rdfs:range xsd:string .

# Property: path
<https://relay.inferal.com/ontology/property/InferalRelay.TreeRelation/path> a rdf:Property ;
  rdfs:label "path" ;
  rdfs:comment "Property path this relation applies to" ;
  schema:alternateName "path" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/path> ;
  rdfs:subPropertyOf tree:path ;
  rdfs:domain tree:Relation ;
  rdfs:range xsd:string .

# Property: value
<https://relay.inferal.com/ontology/property/InferalRelay.TreeRelation/value> a rdf:Property ;
  rdfs:label "value" ;
  rdfs:comment "Value for comparison" ;
  schema:alternateName "value" ;
  rdfs:subPropertyOf <https://relay.inferal.com/ontology/property/value> ;
  rdfs:subPropertyOf tree:value ;
  rdfs:domain tree:Relation ;
  rdfs:range xsd:string .

# Property: members
tree:member a rdf:Property ;
  rdfs:label "members" ;
  rdfs:comment "Members in this node/page" ;
  schema:alternateName "tree:member" ;
  rdfs:range ldes:Member .

# Property: relations
tree:relation a rdf:Property ;
  rdfs:label "relations" ;
  rdfs:comment "Relations to other nodes for pagination" ;
  schema:alternateName "tree:relation" ;
  rdfs:range tree:Relation .

# Property: timestamp path
ldes:timestampPath a rdf:Property ;
  rdfs:label "timestamp path" ;
  rdfs:comment "Timestamp path for LDES members (always {\"@id\": \"prov:generatedAtTime\"})" ;
  schema:alternateName "ldes:timestampPath" .

# Property: stream health
relay:streamHealth a rdf:Property ;
  rdfs:label "stream health" ;
  rdfs:comment "Stream health info (when includeHealth=true)" ;
  schema:alternateName "relay:streamHealth" ;
  rdfs:domain tree:Node ;
  rdfs:range relay:StreamHealth .

# Generated Record properties for InferalRelay.IngestRequest.member
<https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/entry> a rdf:Property ;
  rdfs:label "entry" ;
  rdfs:domain <https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/Container> ;
  rdfs:range <https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/Entry> .
<https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/key> a rdf:Property ;
  rdfs:label "key" ;
  rdfs:domain <https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/Entry> ;
  rdfs:range xsd:string .
<https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/value> a rdf:Property ;
  rdfs:label "value" ;
  rdfs:domain <https://relay.inferal.com/ontology/record/InferalRelay.IngestRequest/member/Entry> ;
  rdfs:range rdf:JSON .

# Generated Record properties for InferalRelay.WebhookEvent.headers
<https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/entry> a rdf:Property ;
  rdfs:label "entry" ;
  rdfs:domain <https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/Container> ;
  rdfs:range <https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/Entry> .
<https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/key> a rdf:Property ;
  rdfs:label "key" ;
  rdfs:domain <https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/Entry> ;
  rdfs:range xsd:string .
<https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/value> a rdf:Property ;
  rdfs:label "value" ;
  rdfs:domain <https://relay.inferal.com/ontology/record/InferalRelay.WebhookEvent/headers/Entry> ;
  rdfs:range xsd:string .
