# SHACL Shapes generated by @inferal-relay/rdf-emitter

@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tsps: <https://relay.inferal.com/ontology/typespec/shapes/> .
@prefix tspv: <https://relay.inferal.com/ontology/typespec/versioning/> .
@prefix adm: <https://ontology.inferal.com/modules/advertising-measurement/> .
@prefix aent: <https://ontology.inferal.com/modules/advertising-entity/> .
@prefix googlehotels: <https://relay.inferal.com/ontology/googlehotels/> .
@prefix schema: <https://schema.org/> .

# Class hierarchy
googlehotels:Brand rdfs:subClassOf schema:Brand .
googlehotels:HotelPricePerItinerary rdfs:subClassOf schema:PriceSpecification .
googlehotels:HotelView rdfs:subClassOf schema:LodgingBusiness .
googlehotels:Icon rdfs:subClassOf schema:ImageObject .
googlehotels:PriceRecord rdfs:subClassOf schema:PriceSpecification .
googlehotels:ParsedListing rdfs:subClassOf schema:LodgingBusiness .
googlehotels:Review rdfs:subClassOf schema:Review .

<https://relay.inferal.com/ontology/googlehotels/shapes> a tsps:ShapeGeneration ;
  tsps:shapeReferenceChainLimit 5 ;
  tsps:omittedShapeReferenceCount 0 .

# Shape for Account Link
googlehotels:AccountLinkShape a sh:NodeShape ;
  sh:targetClass googlehotels:AccountLink ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.AccountLink/accountLinkTarget> ;
    sh:name "account link target" ;
    sh:description "Required for CREATE requests. The properties in the Hotel Center account that can be managed using the linked Google Ads account." ;
    sh:node googlehotels:AccountLinkTargetShape ;
    sh:class googlehotels:AccountLinkTarget ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.AccountLink/googleAdsCustomerName> ;
    sh:name "google ads customer name" ;
    sh:description "Required for CREATE requests. The value representing the Google Ads customer ID in the format `customers/{google_ads_customer_id}`. For example: `customers/0123456789`. Note that the `googleAdsCustomerName` field is not returned in responses to GET requests." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.AccountLink/status> ;
    sh:name "status" ;
    sh:description "The current status of the account link." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "ACCOUNT_LINK_STATUS_UNSPECIFIED" "ACCOUNT_LINK_STATUS_UNKNOWN" "REQUESTED_FROM_HOTEL_CENTER" "REQUESTED_FROM_GOOGLE_ADS" "APPROVED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.AccountLink/name> ;
    sh:name "name" ;
    sh:description "The resource name for the account link in the format `accounts/{account_id}/accountLinks/{account_link_id}`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Account Link Target
googlehotels:AccountLinkTargetShape a sh:NodeShape ;
  sh:targetClass googlehotels:AccountLinkTarget ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.AccountLinkTarget/allHotels> ;
    sh:name "all hotels" ;
    sh:description "True if all properties under the Hotel Center account are made available to the account link. The default is `false`." ;
    sh:datatype xsd:boolean ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.AccountLinkTarget/hotelList> ;
    sh:name "hotel list" ;
    sh:description "List of properties that is made available to the account link." ;
    sh:node googlehotels:HotelListShape ;
    sh:class googlehotels:HotelList ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] .

# Shape for Hotel List
googlehotels:HotelListShape a sh:NodeShape ;
  sh:targetClass googlehotels:HotelList ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelList/partnerHotelIds> ;
    sh:name "partner hotel ids" ;
    sh:description "Hotel IDs." ;
    sh:datatype xsd:string ;
  ] .

# Shape for Brand
googlehotels:BrandShape a sh:NodeShape ;
  sh:targetClass googlehotels:Brand ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/propertyCount> ;
    sh:name "property count" ;
    sh:description "Output only. The number of properties with the corresponding brand ID." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/iconState> ;
    sh:name "icon state" ;
    sh:description "Output only. The brand's icon's review state. If there are both submitted and active icons, this refers to the submitted icon." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "REVIEW_STATE_UNSPECIFIED" "REVIEW_STATE_NEW" "APPROVED" "REJECTED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/name> ;
    sh:name "name" ;
    sh:description "Output only. The resource name for the brand in the format `accounts/{account_id}/brands/{brand_id}`. The `brand_id` corresponds to the partner's brand identifier used for landing page matching and the property-level brand identifier. A default brand is applied to properties that do not have a brand. The `brand_id` of the default brand is `NO_BRAND_ID`. It can be fetched and updated like any configured brand." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/iconDisapprovalReasons> ;
    sh:name "icon disapproval reasons" ;
    sh:description "Output only. The icon's disapproval reason(s). Only applies to submitted icons with `REJECTED` state." ;
    sh:datatype xsd:string ;
    sh:in ( "IMAGE_DISAPPROVAL_REASON_UNSPECIFIED" "NOT_LIKE_SITE" "OFFENSIVE" "LOW_QUALITY" "ANIMATED" "BAD_BACKGROUND" "TEXT_TOO_SMALL" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/icon> ;
    sh:name "icon" ;
    sh:description "Input only. The brand's [accounts.icon](/hotels/hotel-prices/api-reference/rest/v3/accounts.icons#resource:-iconresource) identifying the brand's icon. The value refers to the icons's resource name in the format `accounts/{account_id}/icons/{icon_id}`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/submittedIcon> ;
    sh:name "submitted icon" ;
    sh:description "Output only. The brand's submitted [accounts.icon](/hotels/hotel-prices/api-reference/rest/v3/accounts.icons#resource:-iconresource). The value refers to the icons's resource name in the format `accounts/{account_id}/icons/{icon_id}`. A submitted icon is one that is new or rejected." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/displayNameDisapprovalReason> ;
    sh:name "display name disapproval reason" ;
    sh:description "Output only. Display name's disapproval reason. Only applies to display names with the review state 'REJECTED'." ;
    sh:node googlehotels:DisplayNameDisapprovalReasonShape ;
    sh:class googlehotels:DisplayNameDisapprovalReason ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/activeDisplayNames> ;
    sh:name "active display names" ;
    sh:description "Output only. The brand's active display names in all provided languages, only present if the display name is approved for all provided languages." ;
    sh:node googlehotels:LocalizedTextShape ;
    sh:class googlehotels:LocalizedText ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/displayNames> ;
    sh:name "display names" ;
    sh:description "Input only. The name Google displays for the brand's properties. Setting the display names is only necessary if you want to override the landing page display name or account-level display name for the brand. Google reviews the display names for appropriate content. When there are multiple languages, Google will only show the display names once Google approves all the languages." ;
    sh:node googlehotels:LocalizedTextShape ;
    sh:class googlehotels:LocalizedText ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/activeIconUri> ;
    sh:name "active icon uri" ;
    sh:description "Output only. URL of the active icon, only present when the icon has been approved." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/submittedDisplayNames> ;
    sh:name "submitted display names" ;
    sh:description "Output only. The brand's submitted display names in all provided languages, only present if the display name is new or rejected for any language." ;
    sh:node googlehotels:LocalizedTextShape ;
    sh:class googlehotels:LocalizedText ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/displayNameState> ;
    sh:name "display name state" ;
    sh:description "Output only. The brand's display names review state, which applies to all display name language entries. If there are both submitted and active display names, this refers to the submitted display names." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "REVIEW_STATE_UNSPECIFIED" "REVIEW_STATE_NEW" "APPROVED" "REJECTED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Brand/activeIcon> ;
    sh:name "active icon" ;
    sh:description "Output only. The brand's active [accounts.icon](/hotels/hotel-prices/api-reference/rest/v3/accounts.icons#resource:-iconresource). The value refers to the icons's resource name in the format `accounts/{account_id}/icons/{icon_id}`. An active icon is one that has been approved." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Display Name Disapproval Reason
googlehotels:DisplayNameDisapprovalReasonShape a sh:NodeShape ;
  sh:targetClass googlehotels:DisplayNameDisapprovalReason ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.DisplayNameDisapprovalReason/languageCode> ;
    sh:name "language code" ;
    sh:description "Language of the disapproved display name." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.DisplayNameDisapprovalReason/disapprovalReason> ;
    sh:name "disapproval reason" ;
    sh:description "Disapproval reason." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "DISAPPROVAL_REASON_UNSPECIFIED" "PUNCTUATION" "MARKETING_LANGUAGE" "LANDING_PAGE_NOT_MATCHED" "NOT_BRAND_NAME" ) ;
  ] .

# Shape for Localized Text
googlehotels:LocalizedTextShape a sh:NodeShape ;
  sh:targetClass googlehotels:LocalizedText ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.LocalizedText/text> ;
    sh:name "text" ;
    sh:description "Localized string in the language corresponding to language_code below." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.LocalizedText/languageCode> ;
    sh:name "language code" ;
    sh:description "The text's BCP-47 language code, such as \"en-US\" or \"sr-Latn\". For more information, see http://www.unicode.org/reports/tr35/#Unicode_locale_identifier." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Create Reconciliation Report Response
googlehotels:CreateReconciliationReportResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:CreateReconciliationReportResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.CreateReconciliationReportResponse/issues> ;
    sh:name "issues" ;
    sh:description "Issues that were encountered when validating the file." ;
    sh:node googlehotels:ReconciliationReportValidationIssueShape ;
    sh:class googlehotels:ReconciliationReportValidationIssue ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.CreateReconciliationReportResponse/successfulRecordCount> ;
    sh:name "successful record count" ;
    sh:description "The number of commission records that were successfully saved." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.CreateReconciliationReportResponse/reconciliationReport> ;
    sh:name "reconciliation report" ;
    sh:description "Resource name of the new reconciliation report. The format is `accounts/{account_id}`." ;
    sh:node googlehotels:ReconciliationReportShape ;
    sh:class googlehotels:ReconciliationReport ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] .

# Shape for Reconciliation Report Validation Issue
googlehotels:ReconciliationReportValidationIssueShape a sh:NodeShape ;
  sh:targetClass googlehotels:ReconciliationReportValidationIssue ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ReconciliationReportValidationIssue/description> ;
    sh:name "description" ;
    sh:description "Text description of the issue, typically including what was seen and why it was invalid." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ReconciliationReportValidationIssue/lineNum> ;
    sh:name "line num" ;
    sh:description "The line number on which the issue was detected. If this field is 0, the issue applies to the whole file." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ReconciliationReportValidationIssue/fieldName> ;
    sh:name "field name" ;
    sh:description "Name of the invalid field. If no field name is given, this issue applies to the whole line (or file)." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Reconciliation Report
googlehotels:ReconciliationReportShape a sh:NodeShape ;
  sh:targetClass googlehotels:ReconciliationReport ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ReconciliationReport/name> ;
    sh:name "name" ;
    sh:description "Resource name in the format `accounts/{account_id}/reconciliationReports/{datetime}~{filename}`. The value for `{datetime}` must be from 0001-01-01T00:00:00 to 9999-12-31T23:59:59 inclusive." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ReconciliationReport/fileName> ;
    sh:name "file name" ;
    sh:description "Required. Desired filename of the reconciliation report." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ReconciliationReport/contents> ;
    sh:name "contents" ;
    sh:description "Required. The contents of the commission report. Report contents must conform to the requirements specified in [Reconciliation reports] (//support.google.com/hotelprices/answer/7019060#creating)." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Data Issue Detail
googlehotels:DataIssueDetailShape a sh:NodeShape ;
  sh:targetClass googlehotels:DataIssueDetail ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.DataIssueDetail/isSelfResolving> ;
    sh:name "is self resolving" ;
    sh:description "Whether or not the issue is self-resolving. If true, the issue is expected to resolve itself. If false or not set, action is needed to resolve the issue. Refer to documentation on the data issue’s type for further information." ;
    sh:datatype xsd:boolean ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.DataIssueDetail/dataIssueSeverity> ;
    sh:name "data issue severity" ;
    sh:description "The severity of the data issue." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "DATA_ISSUE_SEVERITY_UNSPECIFIED" "ERROR" "WARNING" "INFO" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.DataIssueDetail/dataIssueType> ;
    sh:name "data issue type" ;
    sh:description "The type of the data issue." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "FEED_DATA_ISSUE_UNSPECIFIED" "FEED_DATA_ISSUE_UNKNOWN" "NO_DATA_ISSUE" "DUPLICATE_ADDRESS" "MISSING_PHYSICAL_STREET_ADDRESS" "MISSING_STREET_NAME" "MISSING_STREET_NUMBER" "MISSING_ADDRESS" "MISSING_COUNTRY" "INVALID_POSTAL_CODE" "INVALID_POSTAL_CODE_SUFFIX" "UNEXPECTED_POSTAL_CODE_SUFFIX" "UNEXPECTED_POSTAL_CODE" "INVALID_AMENITIES" "INVALID_EMAIL_ADDRESS" "DUPLICATE_LATLONG" "LATLONG_INCONSISTENT_WITH_ADDRESS" "MISSING_LATLONG" "COULD_NOT_GEOCODE" "MISSING_HOTEL_NAME" "HOTEL_NAME_EMPTY" "INVALID_HOTEL_NAME" "HOTEL_NAME_TOO_LONG" "PARSE_ERROR_IN_XML" "UNEXPECTED_ATTRIBUTE_IN_XML" "DUPLICATE_PHONE_NUMBER" "MISSING_PHONE_NUMBER" "MISSING_VOICE_PHONE_NUMBER" "INVALID_PHONE_NUMBER_FORMAT" "INVALID_PHONE_NUMBER" "INVALID_PHONE_NUMBER_COUNTRY_CODE" "PHONE_NUMBER_TOO_LONG" "PHONE_NUMBER_TOO_SHORT" "INVALID_WEBSITE_URL" "ADWORDS_ATTRIBUTE_TOO_LONG" "FLAGGED_DUE_TO_SUSPICIOUS_METADATA" "NOT_ENOUGH_IMAGES_PROVIDED" "IMAGE_PROCESSING_IN_PROGRESS" "CANNOT_FETCH_IMAGES" "INCOMPATIBLE_IMAGE_SIZE_OR_LOW_QUALITY" "MISSING_LANG_IN_RAW_LISTING" "IS_HOTEL" "MISSING_REQ_ATTR" "MISSING_NAME" "MISSING_LANG_IN_NAME" "VR_NAME_TOO_LONG" "NAME_AND_DESCRIPTION_ABUSE_VERIFIED" "TEST_PROPERTY" "NON_VR_ACCOMMODATION_TYPE_BASED_ON_LISTING_NAME" "NON_VR_ACCOMMODATION_TYPE" "BRAND_NAME_TOO_LONG" "MISSING_BRAND_NAME" "REVIEW_MISSING_VISIT_TIMESTAMP" "VR_ADDRESS_MISSING" "VR_ADDRESS_INVALID" "VR_ADDRESS_INCOMPLETE" "VR_ADDRESS_INCOMPLETE_NO_STREET_NAME" "VR_ADDRESS_INCOMPLETE_NO_STREET_NUMBER" "VR_ADDRESS_INCOMPLETE_NO_UNIT_NUMBER" "VR_ADDRESS_LATLONG_MISMATCH" "INVALID_REVIEW_RATING" "INVALID_CHECKIN_FORMAT" "INVALID_CHECKOUT_FORMAT" "INTERNAL_BLOCKLIST" "VR_LIVE_ON_GOOGLE_INACTIVE_ERROR" "VR_XML_FAILED_PARSING" "VR_ZIP_FILE_CORRUPT" "VR_PENDING_INITIAL_PROCESSING" "VR_WEBSITE_LINK_ROBOTED" "VR_PENDING_WEBSITE_CRAWLING" "VR_WEBSITE_LINK_WITH_CRAWLING_ERROR" "VR_BRAND_MISSING_LANDING_PAGE" "VR_INVALID_ROOM_TYPE" ) ;
  ] .

# Shape for Date
googlehotels:DateShape a sh:NodeShape ;
  sh:targetClass googlehotels:Date ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Date/year> ;
    sh:name "year" ;
    sh:description "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Date/month> ;
    sh:name "month" ;
    sh:description "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Date/day> ;
    sh:name "day" ;
    sh:description "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] .

# Shape for Empty
googlehotels:EmptyShape a sh:NodeShape ;
  sh:targetClass googlehotels:Empty .

# Shape for Free Booking Links Result
googlehotels:FreeBookingLinksResultShape a sh:NodeShape ;
  sh:targetClass googlehotels:FreeBookingLinksResult ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.FreeBookingLinksResult/partnerHotelId> ;
    sh:name "partner hotel id" ;
    sh:description "Partner's hotel ID. Only present if `partnerHotelId` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.FreeBookingLinksResult/date> ;
    sh:name "date" ;
    sh:description "A date within the requested date range. Only present if `date` is specified in `aggregateBy` in the request." ;
    sh:node googlehotels:DateShape ;
    sh:class googlehotels:Date ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.FreeBookingLinksResult/partnerHotelDisplayName> ;
    sh:name "partner hotel display name" ;
    sh:description "Partner's hotel name. Only present if `partnerHotelDisplayName` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.FreeBookingLinksResult/deviceType> ;
    sh:name "device type" ;
    sh:description "The user’s device type. Only present if `deviceType` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "DEVICE_UNSPECIFIED" "DEVICE_UNKNOWN" "DESKTOP" "MOBILE" "TABLET" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.FreeBookingLinksResult/clickCount> ;
    sh:name "click count" ;
    sh:description "The total number of clicks that were recorded for this result." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.FreeBookingLinksResult/userRegionCode> ;
    sh:name "user region code" ;
    sh:description "ISO 3116 region code of the country/region of the user. Only present if `userRegionCode` is specified in `aggregateBy` in the request" ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Hotel Price Per Itinerary
googlehotels:HotelPricePerItineraryShape a sh:NodeShape ;
  sh:targetClass googlehotels:HotelPricePerItinerary ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelPricePerItinerary/currencyCode> ;
    sh:name "currency code" ;
    sh:description "Currency for `price`, `taxes`, and `fees`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelPricePerItinerary/taxes> ;
    sh:name "taxes" ;
    sh:description "Taxes for this itinerary." ;
    sh:datatype xsd:float ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelPricePerItinerary/lengthOfStayDays> ;
    sh:name "length of stay days" ;
    sh:description "Number of nights for the itinerary." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelPricePerItinerary/price> ;
    sh:name "price" ;
    sh:description "Hotel price for this itinerary." ;
    sh:datatype xsd:float ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelPricePerItinerary/updateTime> ;
    sh:name "update time" ;
    sh:description "Update timestamp for this hotel price." ;
    sh:datatype xsd:dateTime ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelPricePerItinerary/fees> ;
    sh:name "fees" ;
    sh:description "Fees for this itinerary." ;
    sh:datatype xsd:float ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelPricePerItinerary/checkinDate> ;
    sh:name "checkin date" ;
    sh:description "Check-in date." ;
    sh:node googlehotels:DateShape ;
    sh:class googlehotels:Date ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] .

# Shape for Hotel View
googlehotels:HotelViewShape a sh:NodeShape ;
  sh:targetClass googlehotels:HotelView ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/partnerHotelDisplayName> ;
    sh:name "partner hotel display name" ;
    sh:description "Partner's hotel name." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/googleHotelDisplayName> ;
    sh:name "google hotel display name" ;
    sh:description "Google's hotel name." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/matchStatus> ;
    sh:name "match status" ;
    sh:description "Current matching status of the hotel." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "MATCH_STATUS_UNSPECIFIED" "MATCH_STATUS_UNKNOWN" "NOT_MATCHED" "MATCHED" "MAP_OVERLAP" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/partnerHotelId> ;
    sh:name "partner hotel id" ;
    sh:description "The unique ID of the hotel that the partner provides in their Hotel List Feed." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/propertyDetails> ;
    sh:name "property details" ;
    sh:description "Optional. A URL to the property on Google. Only available for properties that are listed." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/primaryOverclusteredPartnerHotelId> ;
    sh:name "primary overclustered partner hotel id" ;
    sh:description "The primary hotel in the overclustered set." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/liveOnGoogleStatus> ;
    sh:name "live on google status" ;
    sh:description "Optional. Whether the hotel appears in Google's hotel booking links. Declaration & behavior to get detection of presence/absence in JSON conversion." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "LIVE_ON_GOOGLE_STATUS_UNSPECIFIED" "LIVE_ON_GOOGLE_STATUS_ACTIVE" "LIVE_ON_GOOGLE_STATUS_INACTIVE" "LIVE_ON_GOOGLE_STATUS_ACTIVE_OUTSIDE_DSA_REGION" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/matchFailureReasons> ;
    sh:name "match failure reasons" ;
    sh:description "The reasons why a hotel failed to match to a property on Maps." ;
    sh:datatype xsd:string ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/googleHotelId> ;
    sh:name "google hotel id" ;
    sh:description "Google's canonical ID for the hotel." ;
    sh:datatype xsd:unsignedLong ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/overclusteredPartnerHotelIds> ;
    sh:name "overclustered partner hotel ids" ;
    sh:description "Other hotels with which the hotel is overclustered. If your feed contains overclustered hotels, update the feed and resubmit it. To do this, you can use the manual match tool." ;
    sh:datatype xsd:string ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/dataIssues> ;
    sh:name "data issues" ;
    sh:description "DEPRECATED. Indicates that the hotel has data quality issues. The value of this field indicates the type of error. This has been replaced with the data_issue_detail field. If your feed contains data issues, update the feed and resubmit it. For more information, refer to this article." ;
    sh:datatype xsd:string ;
    sh:in ( "FEED_DATA_ISSUE_UNSPECIFIED" "FEED_DATA_ISSUE_UNKNOWN" "NO_DATA_ISSUE" "DUPLICATE_ADDRESS" "MISSING_PHYSICAL_STREET_ADDRESS" "MISSING_STREET_NAME" "MISSING_STREET_NUMBER" "MISSING_ADDRESS" "MISSING_COUNTRY" "INVALID_POSTAL_CODE" "INVALID_POSTAL_CODE_SUFFIX" "UNEXPECTED_POSTAL_CODE_SUFFIX" "UNEXPECTED_POSTAL_CODE" "INVALID_AMENITIES" "INVALID_EMAIL_ADDRESS" "DUPLICATE_LATLONG" "LATLONG_INCONSISTENT_WITH_ADDRESS" "MISSING_LATLONG" "COULD_NOT_GEOCODE" "MISSING_HOTEL_NAME" "HOTEL_NAME_EMPTY" "INVALID_HOTEL_NAME" "HOTEL_NAME_TOO_LONG" "PARSE_ERROR_IN_XML" "UNEXPECTED_ATTRIBUTE_IN_XML" "DUPLICATE_PHONE_NUMBER" "MISSING_PHONE_NUMBER" "MISSING_VOICE_PHONE_NUMBER" "INVALID_PHONE_NUMBER_FORMAT" "INVALID_PHONE_NUMBER" "INVALID_PHONE_NUMBER_COUNTRY_CODE" "PHONE_NUMBER_TOO_LONG" "PHONE_NUMBER_TOO_SHORT" "INVALID_WEBSITE_URL" "ADWORDS_ATTRIBUTE_TOO_LONG" "FLAGGED_DUE_TO_SUSPICIOUS_METADATA" "NOT_ENOUGH_IMAGES_PROVIDED" "IMAGE_PROCESSING_IN_PROGRESS" "CANNOT_FETCH_IMAGES" "INCOMPATIBLE_IMAGE_SIZE_OR_LOW_QUALITY" "MISSING_LANG_IN_RAW_LISTING" "IS_HOTEL" "MISSING_REQ_ATTR" "MISSING_NAME" "MISSING_LANG_IN_NAME" "VR_NAME_TOO_LONG" "NAME_AND_DESCRIPTION_ABUSE_VERIFIED" "TEST_PROPERTY" "NON_VR_ACCOMMODATION_TYPE_BASED_ON_LISTING_NAME" "NON_VR_ACCOMMODATION_TYPE" "BRAND_NAME_TOO_LONG" "MISSING_BRAND_NAME" "REVIEW_MISSING_VISIT_TIMESTAMP" "VR_ADDRESS_MISSING" "VR_ADDRESS_INVALID" "VR_ADDRESS_INCOMPLETE" "VR_ADDRESS_INCOMPLETE_NO_STREET_NAME" "VR_ADDRESS_INCOMPLETE_NO_STREET_NUMBER" "VR_ADDRESS_INCOMPLETE_NO_UNIT_NUMBER" "VR_ADDRESS_LATLONG_MISMATCH" "INVALID_REVIEW_RATING" "INVALID_CHECKIN_FORMAT" "INVALID_CHECKOUT_FORMAT" "INTERNAL_BLOCKLIST" "VR_LIVE_ON_GOOGLE_INACTIVE_ERROR" "VR_XML_FAILED_PARSING" "VR_ZIP_FILE_CORRUPT" "VR_PENDING_INITIAL_PROCESSING" "VR_WEBSITE_LINK_ROBOTED" "VR_PENDING_WEBSITE_CRAWLING" "VR_WEBSITE_LINK_WITH_CRAWLING_ERROR" "VR_BRAND_MISSING_LANDING_PAGE" "VR_INVALID_ROOM_TYPE" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/liveOnGoogle> ;
    sh:name "live on google" ;
    sh:description "Optional. DEPRECATED. Prefer live_on_google_status. Whether the hotel appears in Google's hotel booking links. Declaration & behavior to get detection of presence/absence in JSON conversion." ;
    sh:datatype xsd:boolean ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/googleClusterId> ;
    sh:name "google cluster id" ;
    sh:description "The Google Maps identifier for the hotel." ;
    sh:datatype xsd:unsignedLong ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.HotelView/dataIssueDetail> ;
    sh:name "data issue detail" ;
    sh:description "The type and severity of each data quality issue in the feed. If your feed contains data issues, update the feed and resubmit it. For more information, refer to this article." ;
    sh:node googlehotels:DataIssueDetailShape ;
    sh:class googlehotels:DataIssueDetail ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Icon
googlehotels:IconShape a sh:NodeShape ;
  sh:targetClass googlehotels:Icon ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Icon/name> ;
    sh:name "name" ;
    sh:description "Required. Output only. The resource name for the icon in the format `accounts/{account_id}/icons/{icon_id}`. Google generates the `icon_id` during the `create` operation. Use the `icon_id` to associate the icon with a brand using the [accounts.brands](/hotels/hotel-prices/api-reference/rest/v3/accounts.brands#resource:-brand) API." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Icon/disapprovalReasons> ;
    sh:name "disapproval reasons" ;
    sh:description "Output only. The icon's disapproval reason(s). Only applies to icons with `REJECTED` state." ;
    sh:datatype xsd:string ;
    sh:in ( "IMAGE_DISAPPROVAL_REASON_UNSPECIFIED" "NOT_LIKE_SITE" "OFFENSIVE" "LOW_QUALITY" "ANIMATED" "BAD_BACKGROUND" "TEXT_TOO_SMALL" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Icon/iconUri> ;
    sh:name "icon uri" ;
    sh:description "Output only. The approved icon's Google-hosted URI. Only applies to icons with `APPROVED` state." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Icon/state> ;
    sh:name "state" ;
    sh:description "Output only. The icon's current state." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "STATE_UNSPECIFIED" "NEW" "APPROVED" "REJECTED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Icon/reference> ;
    sh:name "reference" ;
    sh:description "Optional. Value for tracking the icon. It could be the primary key to your icon in your system, or the icon's filename. Google does not use this value." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Icon/imageData> ;
    sh:name "image data" ;
    sh:description "Required. Input only. The icon contents, which must be in PNG format, or convertible to PNG." ;
    sh:datatype xsd:base64Binary ;
    sh:maxCount 1 ;
  ] .

# Shape for Image
googlehotels:ImageShape a sh:NodeShape ;
  sh:targetClass googlehotels:Image ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Image/galleryUri> ;
    sh:name "gallery uri" ;
    sh:description "URL that is deeplink to the image in a gallery (or a webpage)." ;
    sh:node googlehotels:LocalizedTextShape ;
    sh:class googlehotels:LocalizedText ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Image/uri> ;
    sh:name "uri" ;
    sh:description "URL that points to the binary image content directly." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Image/title> ;
    sh:name "title" ;
    sh:description "Title of the image." ;
    sh:node googlehotels:LocalizedTextShape ;
    sh:class googlehotels:LocalizedText ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Key
googlehotels:KeyShape a sh:NodeShape ;
  sh:targetClass googlehotels:Key ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/partnerHotelId> ;
    sh:name "partner hotel id" ;
    sh:description "Partner's hotel ID. If `partnerHotelId` is not a value of the `aggregateBy` parameter in the request call, then the `partnerHotelId` field is not returned in the `Key`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/lengthOfStayDays> ;
    sh:name "length of stay days" ;
    sh:description "The number of nights for the itinerary. If `lengthOfStayDays` is not a value of the `aggregateBy` parameter in the request call, then the `lengthOfStayDays` field is not returned in the `Key`." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/occupancy> ;
    sh:name "occupancy" ;
    sh:description "The total occupancy of the itinerary. If `occupancy` is not a value of the `aggregateBy` parameter in the request call, then the `occupancy` field is not returned in the `Key`." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/advanceBookingWindow> ;
    sh:name "advance booking window" ;
    sh:description "The number of days in advance the user wants to book the itinerary. If `advanceBookingWindow` is not a value of the `aggregateBy` parameter in the request call, then the `advanceBookingWindow` field is not returned in the `Key`." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/checkinDate> ;
    sh:name "checkin date" ;
    sh:description "The check-in date of the itinerary. If `checkinDate` is not a value of the `aggregateBy` parameter in the request call, then the `checkinDate` field is not returned in the `Key`." ;
    sh:node googlehotels:DateShape ;
    sh:class googlehotels:Date ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/hotelRegionCode> ;
    sh:name "hotel region code" ;
    sh:description "CLDR region code of the country/region of the hotel. If `hotelRegionCode` is not a value of the `aggregateBy` parameter in the request call, then the `hotelRegionCode` field is not returned in the `Key`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/deviceType> ;
    sh:name "device type" ;
    sh:description "The user’s device type. If `deviceType` is not a value of the `aggregateBy` parameter in the request call, then the `deviceType` field is not returned in the `Key`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "DEVICE_UNSPECIFIED" "DEVICE_UNKNOWN" "DESKTOP" "MOBILE" "TABLET" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/userRegionCode> ;
    sh:name "user region code" ;
    sh:description "ISO 3116 region code of the country/region of the user. If `userRegionCode` is not a value of the `aggregateBy` parameter in the request call, then the `userRegionCode` field is not returned in the `Key`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Key/date> ;
    sh:name "date" ;
    sh:description "The date for which you are requesting metrics. If `date` is not a value of the `aggregateBy` parameter in the request call, then the `date` field is not returned in the `Key`." ;
    sh:node googlehotels:DateShape ;
    sh:class googlehotels:Date ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] .

# Shape for Lat Lng
googlehotels:LatLngShape a sh:NodeShape ;
  sh:targetClass googlehotels:LatLng ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.LatLng/longitude> ;
    sh:name "longitude" ;
    sh:description "The longitude in degrees. It must be in the range [-180.0, +180.0]." ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.LatLng/latitude> ;
    sh:name "latitude" ;
    sh:description "The latitude in degrees. It must be in the range [-90.0, +90.0]." ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
  ] .

# Shape for List Account Links Response
googlehotels:ListAccountLinksResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:ListAccountLinksResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListAccountLinksResponse/accountLinks> ;
    sh:name "account links" ;
    sh:description "A list of all account links associated with the Hotel Center account being queried." ;
    sh:node googlehotels:AccountLinkShape ;
    sh:class googlehotels:AccountLink ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for List Brands Response
googlehotels:ListBrandsResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:ListBrandsResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListBrandsResponse/brands> ;
    sh:name "brands" ;
    sh:description "A list of brands for the current page associated with the Hotel Center account being queried." ;
    sh:node googlehotels:BrandShape ;
    sh:class googlehotels:Brand ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListBrandsResponse/nextPageToken> ;
    sh:name "next page token" ;
    sh:description "Token that can be sent as `page_token` to retrieve the next page. If this field is omitted, there are no subsequent pages." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for List Hotel Views Response
googlehotels:ListHotelViewsResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:ListHotelViewsResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListHotelViewsResponse/hotelViews> ;
    sh:name "hotel views" ;
    sh:description "The list of rows that match the query." ;
    sh:node googlehotels:HotelViewShape ;
    sh:class googlehotels:HotelView ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListHotelViewsResponse/nextPageToken> ;
    sh:name "next page token" ;
    sh:description "Pagination token used to retrieve the next page of results." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for List Icons Response
googlehotels:ListIconsResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:ListIconsResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListIconsResponse/icons> ;
    sh:name "icons" ;
    sh:description "A list of all icons associated with the queried partner account." ;
    sh:node googlehotels:IconShape ;
    sh:class googlehotels:Icon ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for List Price Accuracy Views Response
googlehotels:ListPriceAccuracyViewsResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:ListPriceAccuracyViewsResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListPriceAccuracyViewsResponse/priceAccuracyViews> ;
    sh:name "price accuracy views" ;
    sh:description "The list of rows that match the query." ;
    sh:node googlehotels:PriceAccuracyViewShape ;
    sh:class googlehotels:PriceAccuracyView ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Price Accuracy View
googlehotels:PriceAccuracyViewShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceAccuracyView ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyView/name> ;
    sh:name "name" ;
    sh:description "Resource name should be in the format `accounts/{account_id}/priceAccuracyViews/{report_date}`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyView/results> ;
    sh:name "results" ;
    sh:description "The list of rows that match the query." ;
    sh:node googlehotels:PriceAccuracyRowShape ;
    sh:class googlehotels:PriceAccuracyRow ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Price Accuracy Row
googlehotels:PriceAccuracyRowShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceAccuracyRow ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/mismatchReason> ;
    sh:name "mismatch reason" ;
    sh:description "The reason why the fetched price didn't match the cached price." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "MISMATCH_REASON_UNSPECIFIED" "MISMATCH_REASON_UNKNOWN" "TAX_MISMATCH" "ROOM_UNAVAILABLE" "SITE_ERROR" "PRICE_FEED_DELAYED" "DISCOUNT_MISSING" "INCORRECT_DISCOUNT_VALUE" "WRONG_ITINERARY" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/deviceType> ;
    sh:name "device type" ;
    sh:description "The user's device type." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "DEVICE_UNSPECIFIED" "DEVICE_UNKNOWN" "DESKTOP" "MOBILE" "TABLET" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/hotel> ;
    sh:name "hotel" ;
    sh:description "Partner-defined hotel ID." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/rateRuleId> ;
    sh:name "rate rule id" ;
    sh:description "The rate rule of the advertised price for non-public rates." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/finalDomain> ;
    sh:name "final domain" ;
    sh:description "The domain of the final page from which prices are read." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/cachedPriceRecord> ;
    sh:name "cached price record" ;
    sh:description "Price as advertised." ;
    sh:node googlehotels:PriceRecordShape ;
    sh:class googlehotels:PriceRecord ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/checkinDate> ;
    sh:name "checkin date" ;
    sh:description "Check-in date." ;
    sh:node googlehotels:DateShape ;
    sh:class googlehotels:Date ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/lengthOfStayDays> ;
    sh:name "length of stay days" ;
    sh:description "Length of stay." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/hotelCountryCode> ;
    sh:name "hotel country code" ;
    sh:description "The country of the hotel (based on address)." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/fetchedPriceRecord> ;
    sh:name "fetched price record" ;
    sh:description "Price as read from the partner website." ;
    sh:node googlehotels:PriceRecordShape ;
    sh:class googlehotels:PriceRecord ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/correctionTime> ;
    sh:name "correction time" ;
    sh:description "Time at which an incorrect price is updated to a correct price." ;
    sh:datatype xsd:dateTime ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/signalSource> ;
    sh:name "signal source" ;
    sh:description "Source of the price accuracy signal." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "SIGNAL_SOURCE_UNSPECIFIED" "SIGNAL_SOURCE_UNKNOWN" "FETCHED" "PIXEL" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/url> ;
    sh:name "url" ;
    sh:description "Initial URL visited on the partner website." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/childOccupancy> ;
    sh:name "child occupancy" ;
    sh:description "The number of children in the occupancy details of the validation query. Note: This field may not be consistently populated. If missing, partners should assume a default of 0 children." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/userRegionCode> ;
    sh:name "user region code" ;
    sh:description "The user's region." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/affectsScore> ;
    sh:name "affects score" ;
    sh:description "True if this row affects the overall price accuracy score." ;
    sh:datatype xsd:boolean ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceAccuracyRow/adultOccupancy> ;
    sh:name "adult occupancy" ;
    sh:description "The number of adults in the occupancy details of the validation query. Note: This field may not be consistently populated due to technical constraints. If missing, partners should assume a default of 2 adults." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] .

# Shape for Price Record
googlehotels:PriceRecordShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceRecord ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceRecord/time> ;
    sh:name "time" ;
    sh:description "Timestamp of this price record." ;
    sh:datatype xsd:dateTime ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceRecord/taxesAndFees> ;
    sh:name "taxes and fees" ;
    sh:description "Taxes and fees." ;
    sh:datatype xsd:float ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceRecord/currencyCode> ;
    sh:name "currency code" ;
    sh:description "ISO 4217 currency code." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceRecord/basePrice> ;
    sh:name "base price" ;
    sh:description "Base price." ;
    sh:datatype xsd:float ;
    sh:maxCount 1 ;
  ] .

# Shape for List Price Coverage Views Response
googlehotels:ListPriceCoverageViewsResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:ListPriceCoverageViewsResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListPriceCoverageViewsResponse/priceCoverageViews> ;
    sh:name "price coverage views" ;
    sh:description "Hotel price coverage stats." ;
    sh:node googlehotels:PriceCoverageViewShape ;
    sh:class googlehotels:PriceCoverageView ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Price Coverage View
googlehotels:PriceCoverageViewShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceCoverageView ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageView/priceCoverageBuckets> ;
    sh:name "price coverage buckets" ;
    sh:description "Price coverage stats for combinations of advance booking window and length of stay ranges." ;
    sh:node googlehotels:PriceCoverageBucketShape ;
    sh:class googlehotels:PriceCoverageBucket ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageView/priceCoverageBinaryPercent> ;
    sh:name "price coverage binary percent" ;
    sh:description "The ratio between the number of hotels which have at least one price for the calculation period and `matched_property_count`." ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageView/matchedPropertyCount> ;
    sh:name "matched property count" ;
    sh:description "The total number of properties that have prices for the given itineraries." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageView/calculationDate> ;
    sh:name "calculation date" ;
    sh:description "The date on which the calculations were made." ;
    sh:node googlehotels:DateShape ;
    sh:class googlehotels:Date ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageView/priceCoveragePercent> ;
    sh:name "price coverage percent" ;
    sh:description "The overall price coverage for an account. This value is the ratio between the number of hotel prices for the calculation booking window and length of stay range divided by the number of all possible prices, which is `matched_property_count` times 330 (for advance book window) times 30 (for length of stay)." ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
  ] .

# Shape for Price Coverage Bucket
googlehotels:PriceCoverageBucketShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceCoverageBucket ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageBucket/advanceBookingWindowRange> ;
    sh:name "advance booking window range" ;
    sh:description "Advance booking window range." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "ADVANCE_BOOKING_WINDOW_RANGE_UNSPECIFIED" "ADVANCE_BOOKING_WINDOW_RANGE_UNKNOWN" "DAYS_0_TO_30" "DAYS_31_TO_60" "DAYS_61_TO_90" "DAYS_91_TO_120" "DAYS_121_TO_150" "DAYS_151_TO_180" "DAYS_181_TO_210" "DAYS_211_TO_240" "DAYS_241_TO_270" "DAYS_271_TO_300" "DAYS_301_TO_330" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageBucket/lengthOfStayRange> ;
    sh:name "length of stay range" ;
    sh:description "Length of stay range." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "LENGTH_OF_STAY_RANGE_UNSPECIFIED" "LENGTH_OF_STAY_RANGE_UNKNOWN" "LENGTH_OF_STAY_1_TO_7" "LENGTH_OF_STAY_8_TO_14" "LENGTH_OF_STAY_15_TO_30" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageBucket/priceCoveragePercent> ;
    sh:name "price coverage percent" ;
    sh:description "The percent of itineraries for which you have coverage for this advance booking window bucket and length of stay bucket." ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceCoverageBucket/availablePriceCount> ;
    sh:name "available price count" ;
    sh:description "Number of prices for this advance booking window bucket and length of stay bucket." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] .

# Shape for List Reconciliation Reports Response
googlehotels:ListReconciliationReportsResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:ListReconciliationReportsResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ListReconciliationReportsResponse/reconciliationReports> ;
    sh:name "reconciliation reports" ;
    sh:description "The list of names of reconciliation reports. Note that the `contents` and `fileName` fields of each `ReconciliationReport` object are not returned by this call." ;
    sh:node googlehotels:ReconciliationReportShape ;
    sh:class googlehotels:ReconciliationReport ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Missed Participation Count Details
googlehotels:MissedParticipationCountDetailsShape a sh:NodeShape ;
  sh:targetClass googlehotels:MissedParticipationCountDetails ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/priceUnavailableCountDetails> ;
    sh:name "price unavailable count details" ;
    sh:description "The reasons that contributed to the price unavailable count." ;
    sh:node googlehotels:PriceUnavailableCountDetailsShape ;
    sh:class googlehotels:PriceUnavailableCountDetails ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/noPriceCountDetails> ;
    sh:name "no price count details" ;
    sh:description "The reasons that contributed to the no price count (for example, live pricing not available) and the total count for each reason." ;
    sh:node googlehotels:NoPriceCountDetailsShape ;
    sh:class googlehotels:NoPriceCountDetails ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/priceMissingCount> ;
    sh:name "price missing count" ;
    sh:description "The total number of missed participations due to either a price not being present in Google's cache or failing to successfully respond to live pricing. Comprised of the following: * Bandwidth depleted * Cache rate missing * Itinerary blocked * Live pricing not set up * Live pricing timeout * Live pricing error" ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/noTaxBreakdownCount> ;
    sh:name "no tax breakdown count" ;
    sh:description "The total number of missed participation due to one or more of your hotels not specifying taxes and fees separately." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/priceMissingCountDetails> ;
    sh:name "price missing count details" ;
    sh:description "The reasons that contributed to the price missing count." ;
    sh:node googlehotels:PriceMissingCountDetailsShape ;
    sh:class googlehotels:PriceMissingCountDetails ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/noLandingPageCount> ;
    sh:name "no landing page count" ;
    sh:description "No landing page matched the user." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/hotelSuspendedCount> ;
    sh:name "hotel suspended count" ;
    sh:description "The total number of missed participations due to one or more of your hotels being suspended due to price accuracy violations." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/otherReasonCount> ;
    sh:name "other reason count" ;
    sh:description "Hotel did not participate for an unknown reason." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/noAvailabilityCount> ;
    sh:name "no availability count" ;
    sh:description "The total number of missed participation due to the hotel/itinerary combination being unavailable, or the traveler was ineligible for the rates. To participate in these auctions, you may need to provide more pricing information." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/priceUnavailableCount> ;
    sh:name "price unavailable count" ;
    sh:description "The total number of missed participation due to price listed as unavailable (-1) for the requested itinerary. Comprised of the following: * Price unavailable * Participation not likely * Other" ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/priceProblemCount> ;
    sh:name "price problem count" ;
    sh:description "The total number of missed participation due to an issue with the accuracy of the price provided for the itinerary. Comprised of the following: * Hotel suspended * Price unusually high * Price unusually low * Taxes and feeds missing" ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/priceProblemCountDetails> ;
    sh:name "price problem count details" ;
    sh:description "The reasons that contributed to the price problem count." ;
    sh:node googlehotels:PriceProblemCountDetailsShape ;
    sh:class googlehotels:PriceProblemCountDetails ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.MissedParticipationCountDetails/noPriceCount> ;
    sh:name "no price count" ;
    sh:description "The total number of missed participations due to a price not being offered for the requested itinerary." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] .

# Shape for Price Unavailable Count Details
googlehotels:PriceUnavailableCountDetailsShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceUnavailableCountDetails ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceUnavailableCountDetails/participationNotLikelyCount> ;
    sh:name "participation not likely count" ;
    sh:description "No price was cached for this itinerary, and no live query was done because your server usually tells us the hotel is unavailable or sold out." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceUnavailableCountDetails/priceUnavailableCount> ;
    sh:name "price unavailable count" ;
    sh:description "Hotel did not participate because it wasn't available for the itinerary dates." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] .

# Shape for No Price Count Details
googlehotels:NoPriceCountDetailsShape a sh:NodeShape ;
  sh:targetClass googlehotels:NoPriceCountDetails ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.NoPriceCountDetails/livePricingTechnicalIssueCount> ;
    sh:name "live pricing technical issue count" ;
    sh:description "The total number of missed participation due to technical issues with live pricing for any of the following reasons: * You didn’t respond quickly enough and exceeded the response deadline (around 4000 milliseconds). * You returned an error. * Your response was malformed." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.NoPriceCountDetails/livePricingNotTriggeredCount> ;
    sh:name "live pricing not triggered count" ;
    sh:description "The total number of missed participation due to live pricing not being triggered for any of the following reasons: * You didn't set a bid. * You didn't have a valid landing page. * There weren't enough prices in the cache." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.NoPriceCountDetails/livePricingConfigIssueCount> ;
    sh:name "live pricing config issue count" ;
    sh:description "The total number of missed participation due to live pricing not being triggered for any of the following reasons: * You didn't have live pricing configured for these searches. * You restricted Google from accessing the hotel itinerary in question." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.NoPriceCountDetails/livePricingOtherReasonCount> ;
    sh:name "live pricing other reason count" ;
    sh:description "The number of missed participations due to other issues with live pricing." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.NoPriceCountDetails/livePricingNotAvailableCount> ;
    sh:name "live pricing not available count" ;
    sh:description "The total number of missed participation due to live pricing being unavailable. Live pricing will not be triggered for certain default itineraries or UIs. In this scenario, partners will need a cached price to participate." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] .

# Shape for Price Missing Count Details
googlehotels:PriceMissingCountDetailsShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceMissingCountDetails ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceMissingCountDetails/livePricingErrorCount> ;
    sh:name "live pricing error count" ;
    sh:description "No price was cached for this itinerary. A live query did not time out, but your system returned an error." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceMissingCountDetails/cacheRateMissingCount> ;
    sh:name "cache rate missing count" ;
    sh:description "No price exists in the cache for this itinerary. A live query was not done due to page constraints." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceMissingCountDetails/livePricingNotSetupCount> ;
    sh:name "live pricing not setup count" ;
    sh:description "No price was cached for this itinerary, and live query was not configured for this account." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceMissingCountDetails/bandwidthDepletedCount> ;
    sh:name "bandwidth depleted count" ;
    sh:description "No price was cached for this itinerary, and there was no live query quota remaining." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceMissingCountDetails/livePricingTimeoutCount> ;
    sh:name "live pricing timeout count" ;
    sh:description "No price was cached for this itinerary, and a live query sent to your system timed out." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceMissingCountDetails/itineraryBlockedCount> ;
    sh:name "itinerary blocked count" ;
    sh:description "The itinerary was outside of your basic parameters, so no price was pulled for the itinerary from either live query or cache fill." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] .

# Shape for Price Problem Count Details
googlehotels:PriceProblemCountDetailsShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceProblemCountDetails ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceProblemCountDetails/taxesAndFeesMissingCount> ;
    sh:name "taxes and fees missing count" ;
    sh:description "Taxes and fees were missing from pricing." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceProblemCountDetails/basePriceViolationsCount> ;
    sh:name "base price violations count" ;
    sh:description "Base price too low relative to total price." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceProblemCountDetails/priceAccuracyIssueCount> ;
    sh:name "price accuracy issue count" ;
    sh:description "Price accuracy issue." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceProblemCountDetails/priceUnusuallyHighCount> ;
    sh:name "price unusually high count" ;
    sh:description "The price given for this itinerary seemed oddly high compared to regional trends." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceProblemCountDetails/hotelSuspendedCount> ;
    sh:name "hotel suspended count" ;
    sh:description "The hotel was suspended. This may be due to persistent problems in areas such as incorrect taxes and fees." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceProblemCountDetails/priceUnusuallyLowCount> ;
    sh:name "price unusually low count" ;
    sh:description "The price given for this itinerary seemed oddly low compared to regional trends." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] .

# Shape for Parsed Listing
googlehotels:ParsedListingShape a sh:NodeShape ;
  sh:targetClass googlehotels:ParsedListing ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/imprecisionRadiusMeters> ;
    sh:name "imprecision radius meters" ;
    sh:description "Represents the accuracy of the location. The listing can be anywhere within the defined circular area." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/unitAttributes> ;
    sh:name "unit attributes" ;
    sh:description "VR List attribute." ;
    sh:node <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/ContainerShape> ;
    sh:class <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/Container> ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/partnerListId> ;
    sh:name "partner list id" ;
    sh:description "The list ID on partner LEC feed, provided by partner." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/dataIssueDetail> ;
    sh:name "data issue detail" ;
    sh:description "Data issues about this listing" ;
    sh:node googlehotels:DataIssueDetailShape ;
    sh:class googlehotels:DataIssueDetail ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/location> ;
    sh:name "location" ;
    sh:description "Location of listing using latitude and longitude (degrees)." ;
    sh:node googlehotels:LatLngShape ;
    sh:class googlehotels:LatLng ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/review> ;
    sh:name "review" ;
    sh:description "Reviews associated with this listing. Each review has a single language attached to it." ;
    sh:node googlehotels:ReviewShape ;
    sh:class googlehotels:Review ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/brand> ;
    sh:name "brand" ;
    sh:description "If not empty, it indicates that this listing belongs to a brand of the feed." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/listingName> ;
    sh:name "listing name" ;
    sh:description "List of localized names." ;
    sh:node googlehotels:LocalizedTextShape ;
    sh:class googlehotels:LocalizedText ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/description> ;
    sh:name "description" ;
    sh:description "Description of the property." ;
    sh:node googlehotels:LocalizedTextShape ;
    sh:class googlehotels:LocalizedText ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/image> ;
    sh:name "image" ;
    sh:description "Images associated with this listing, localized." ;
    sh:node googlehotels:ImageShape ;
    sh:class googlehotels:Image ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/category> ;
    sh:name "category" ;
    sh:description "The partner provided category (accommodation type) of the property." ;
    sh:node googlehotels:LocalizedTextShape ;
    sh:class googlehotels:LocalizedText ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/isServed> ;
    sh:name "is served" ;
    sh:description "Whether the listing can be served based on non image data alone." ;
    sh:datatype xsd:boolean ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/regionCode> ;
    sh:name "region code" ;
    sh:description "The country code where the listing is located." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Review
googlehotels:ReviewShape a sh:NodeShape ;
  sh:targetClass googlehotels:Review ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/title> ;
    sh:name "title" ;
    sh:description "The title of the review, for example: Great three bedrooms." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/link> ;
    sh:name "link" ;
    sh:description "The url of the review." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/languageCode> ;
    sh:name "language code" ;
    sh:description "Language of the review in ISO639 format, such as \"en\", \"de\", etc." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/author> ;
    sh:name "author" ;
    sh:description "The author of the review." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/reviewTime> ;
    sh:name "review time" ;
    sh:description "Unix timestamp (in seconds) of the review, in UTC+0." ;
    sh:datatype xsd:dateTime ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/body> ;
    sh:name "body" ;
    sh:description "The body of the review." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/visitTime> ;
    sh:name "visit time" ;
    sh:description "Unix timestamp (in seconds) of when the stay was, in UTC+0." ;
    sh:datatype xsd:dateTime ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/rating> ;
    sh:name "rating" ;
    sh:description "Any ratings associated with this review. This is repeated because reviews can include ratings on different aspects of a listing, e.g. location, cleanliness, etc." ;
    sh:node googlehotels:RatingShape ;
    sh:class googlehotels:Rating ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Review/type> ;
    sh:name "type" ;
    sh:description "The type of the review." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "UNKNOWN" "EDITORIAL" "USER" ) ;
  ] .

# Shape for Rating
googlehotels:RatingShape a sh:NodeShape ;
  sh:targetClass googlehotels:Rating ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Rating/score> ;
    sh:name "score" ;
    sh:description "The rating score. (e.g. 8.5)" ;
    sh:datatype xsd:float ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Rating/ratingScale> ;
    sh:name "rating scale" ;
    sh:description "Maximum rating possible." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.Rating/type> ;
    sh:name "type" ;
    sh:description "The type of the rating." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "TYPE_UNSPECIFIED" "OVERALL" ) ;
  ] .

# Shape for Participation Result
googlehotels:ParticipationResultShape a sh:NodeShape ;
  sh:targetClass googlehotels:ParticipationResult ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParticipationResult/participationPercent> ;
    sh:name "participation percent" ;
    sh:description "The percentage rate of participation where the number of successfully participated opportunities is divided by the total number of opportunities. For example, if a property was eligible to enter the Google Ads auction 90 times out of 100 opportunities, the participation rate is 90%." ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParticipationResult/participationCount> ;
    sh:name "participation count" ;
    sh:description "The total number of opportunities for which you were eligible to enter in the Google Ads auction process." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParticipationResult/missedParticipationCount> ;
    sh:name "missed participation count" ;
    sh:description "The total number of opportunities **not** eligible for the Google Ads auction process. Comprised of the following: * Landing page missing * Price missing * Price problem * Price unavailable * Other" ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParticipationResult/partnerHotelDisplayName> ;
    sh:name "partner hotel display name" ;
    sh:description "Partner's hotel display name. This field is only populated when the result is aggregated by `partnerHotelId`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParticipationResult/opportunityCount> ;
    sh:name "opportunity count" ;
    sh:description "For a specific hotel, the total number of opportunities that were available. Opportunities are the total number of instances when a hotel ad could have been displayed to a user." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParticipationResult/key> ;
    sh:name "key" ;
    sh:description "Key of the result." ;
    sh:node googlehotels:KeyShape ;
    sh:class googlehotels:Key ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParticipationResult/missedParticipationCountDetails> ;
    sh:name "missed participation count details" ;
    sh:description "The reasons that contributed to the missed participation count (for example, no availability) and a total count for each reason." ;
    sh:node googlehotels:MissedParticipationCountDetailsShape ;
    sh:class googlehotels:MissedParticipationCountDetails ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] .

# Shape for Price View
googlehotels:PriceViewShape a sh:NodeShape ;
  sh:targetClass googlehotels:PriceView ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceView/name> ;
    sh:name "name" ;
    sh:description "Resource name in the format `accounts/{account_id}/priceViews/{partner_hotel_id}`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PriceView/perItineraryPrices> ;
    sh:name "per itinerary prices" ;
    sh:description "Price for each itinerary." ;
    sh:node googlehotels:HotelPricePerItineraryShape ;
    sh:class googlehotels:HotelPricePerItinerary ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Property Performance Result
googlehotels:PropertyPerformanceResultShape a sh:NodeShape ;
  sh:targetClass googlehotels:PropertyPerformanceResult ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/deviceType> ;
    sh:name "device type" ;
    sh:description "The user’s device type. Only present if `deviceType` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "DEVICE_UNSPECIFIED" "DEVICE_UNKNOWN" "DESKTOP" "MOBILE" "TABLET" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/propertyRegionCode> ;
    sh:name "property region code" ;
    sh:description "ISO 3116 region code of the country/region of the property. Only present if `propertyRegionCode` is specified in `aggregateBy` in the request" ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/adsImpressionCount> ;
    sh:name "ads impression count" ;
    sh:description "The total number of ad impressions that were recorded for this result." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/adsClickthroughRate> ;
    sh:name "ads clickthrough rate" ;
    sh:description "Equal to `ads_click_count` divided by `ads_impression_count`." ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/vrWebsiteButtonClicks> ;
    sh:name "vr website button clicks" ;
    sh:description "The total number of clicks on the \"Website\" button on Google for vacation rentals." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/occupancy> ;
    sh:name "occupancy" ;
    sh:description "Requested number of people staying at the property. Only present if `partnerPropertyId` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "OCCUPANCY_UNSPECIFIED" "OCCUPANCY_1" "OCCUPANCY_2" "OCCUPANCY_3" "OCCUPANCY_4" "OCCUPANCY_OVER_4" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/advanceBookingWindow> ;
    sh:name "advance booking window" ;
    sh:description "Difference in days between query date and check-in date in property's local timezone. Only present if `advanceBookingWindow` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "ADVANCE_BOOKING_WINDOW_UNSPECIFIED" "ADVANCE_BOOKING_WINDOW_SAME_DAY" "ADVANCE_BOOKING_WINDOW_NEXT_DAY" "ADVANCE_BOOKING_WINDOW_DAYS_2_TO_7" "ADVANCE_BOOKING_WINDOW_DAYS_8_TO_14" "ADVANCE_BOOKING_WINDOW_DAYS_15_TO_30" "ADVANCE_BOOKING_WINDOW_DAYS_31_TO_60" "ADVANCE_BOOKING_WINDOW_DAYS_61_TO_90" "ADVANCE_BOOKING_WINDOW_DAYS_91_TO_120" "ADVANCE_BOOKING_WINDOW_DAYS_121_TO_150" "ADVANCE_BOOKING_WINDOW_DAYS_151_TO_180" "ADVANCE_BOOKING_WINDOW_DAYS_OVER_180" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/brand> ;
    sh:name "brand" ;
    sh:description "Partner-specified brand for the property. Only present if `brand` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/partnerPropertyDisplayName> ;
    sh:name "partner property display name" ;
    sh:description "Partner's property name. Only present if `partnerPropertyDisplayName` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/userRegionCode> ;
    sh:name "user region code" ;
    sh:description "ISO 3116 region code of the country/region of the user. Only present if `userRegionCode` is specified in `aggregateBy` in the request" ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/adsClickCount> ;
    sh:name "ads click count" ;
    sh:description "The total number of ad clicks that were recorded for this result." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/clickCount> ;
    sh:name "click count" ;
    sh:description "The total number of free booking link clicks that were recorded for this result." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/highIntentUsers> ;
    sh:name "high intent users" ;
    sh:description "Whether the user’s query indicated a strong interest in booking. Only present if `highIntentUsers` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:boolean ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/impressionCount> ;
    sh:name "impression count" ;
    sh:description "The total number of free booking link impressions that were recorded for this result. This value is rounded to preserve user privacy." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/date> ;
    sh:name "date" ;
    sh:description "A date within the requested date range. Only present if `date` is specified in `aggregateBy` in the request." ;
    sh:node googlehotels:DateShape ;
    sh:class googlehotels:Date ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/lengthOfStay> ;
    sh:name "length of stay" ;
    sh:description "Number of nights between check-in and check-out dates specified by user. Only present if `lengthOfStay` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "LENGTH_OF_STAY_UNSPECIFIED" "LENGTH_OF_STAY_NIGHTS_1" "LENGTH_OF_STAY_NIGHTS_2" "LENGTH_OF_STAY_NIGHTS_3" "LENGTH_OF_STAY_NIGHTS_4_TO_7" "LENGTH_OF_STAY_NIGHTS_8_TO_14" "LENGTH_OF_STAY_NIGHTS_15_TO_21" "LENGTH_OF_STAY_NIGHTS_22_TO_30" "LENGTH_OF_STAY_NIGHTS_OVER_30" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/partnerPropertyId> ;
    sh:name "partner property id" ;
    sh:description "Partner's property ID. Only present if `partnerPropertyId` is specified in `aggregateBy` in the request." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.PropertyPerformanceResult/clickthroughRate> ;
    sh:name "clickthrough rate" ;
    sh:description "Equal to `click_count` divided by `impression_count`." ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
  ] .

# Shape for Query Free Booking Links Report Response
googlehotels:QueryFreeBookingLinksReportResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:QueryFreeBookingLinksReportResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.QueryFreeBookingLinksReportResponse/results> ;
    sh:name "results" ;
    sh:description "The list of results that match the query." ;
    sh:node googlehotels:FreeBookingLinksResultShape ;
    sh:class googlehotels:FreeBookingLinksResult ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.QueryFreeBookingLinksReportResponse/nextPageToken> ;
    sh:name "next page token" ;
    sh:description "Pagination token used to retrieve the next page of results. If this field is omitted, there are no subsequent pages." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Query Participation Report Response
googlehotels:QueryParticipationReportResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:QueryParticipationReportResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.QueryParticipationReportResponse/nextPageToken> ;
    sh:name "next page token" ;
    sh:description "Pagination token used to retrieve the next page of results." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.QueryParticipationReportResponse/results> ;
    sh:name "results" ;
    sh:description "The list of results that matches the query." ;
    sh:node googlehotels:ParticipationResultShape ;
    sh:class googlehotels:ParticipationResult ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Query Property Performance Report Response
googlehotels:QueryPropertyPerformanceReportResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:QueryPropertyPerformanceReportResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.QueryPropertyPerformanceReportResponse/results> ;
    sh:name "results" ;
    sh:description "The list of results that match the query." ;
    sh:node googlehotels:PropertyPerformanceResultShape ;
    sh:class googlehotels:PropertyPerformanceResult ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.QueryPropertyPerformanceReportResponse/nextPageToken> ;
    sh:name "next page token" ;
    sh:description "Pagination token used to retrieve the next page of results. If this field is omitted, there are no subsequent pages." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Set Live On Google Request
googlehotels:SetLiveOnGoogleRequestShape a sh:NodeShape ;
  sh:targetClass googlehotels:SetLiveOnGoogleRequest ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SetLiveOnGoogleRequest/partnerHotelIds> ;
    sh:name "partner hotel ids" ;
    sh:description "Required. Identifies the properties to update with the liveOnGoogle setting." ;
    sh:datatype xsd:string ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SetLiveOnGoogleRequest/liveOnGoogleStatus> ;
    sh:name "live on google status" ;
    sh:description "Optional. Whether the property will show on Google, with more granular controls than the original `live_on_google` boolean field. Only one of `live_on_google` or `live_on_google_status` should be set; if both are set, `live_on_google_status` will be used. **Note:** This field should be enclosed in quotes. For example, `\"LIVE_ON_GOOGLE_STATUS_INACTIVE\"`." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "LIVE_ON_GOOGLE_STATUS_UNSPECIFIED" "LIVE_ON_GOOGLE_STATUS_ACTIVE" "LIVE_ON_GOOGLE_STATUS_INACTIVE" "LIVE_ON_GOOGLE_STATUS_ACTIVE_OUTSIDE_DSA_REGION" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SetLiveOnGoogleRequest/liveOnGoogle> ;
    sh:name "live on google" ;
    sh:description "Optional. DEPRECATED. Whether the property will show on Google. When true, Google will show the properties if their integration is complete and the property is available. When false, Google will never show the properties. Superseded by `live_on_google_status`. Only one of `live_on_google` or `live_on_google_status` should be set; if both are set, `live_on_google_status` will be used." ;
    sh:datatype xsd:boolean ;
    sh:maxCount 1 ;
  ] .

# Shape for Set Live On Google Response
googlehotels:SetLiveOnGoogleResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:SetLiveOnGoogleResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SetLiveOnGoogleResponse/updatedHotelIds> ;
    sh:name "updated hotel ids" ;
    sh:description "Identifies the updated properties." ;
    sh:datatype xsd:string ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SetLiveOnGoogleResponse/failedHotelIds> ;
    sh:name "failed hotel ids" ;
    sh:description "Identifies properties that Google could not update." ;
    sh:datatype xsd:string ;
  ] .

# Shape for Summarize Hotel Views Response
googlehotels:SummarizeHotelViewsResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:SummarizeHotelViewsResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizeHotelViewsResponse/lastManifestUpdateTime> ;
    sh:name "last manifest update time" ;
    sh:description "Timestamp of the last hotel manifest update." ;
    sh:datatype xsd:dateTime ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizeHotelViewsResponse/lastFeedSubmissionTime> ;
    sh:name "last feed submission time" ;
    sh:description "Timestamp of the last hotel feed submission." ;
    sh:datatype xsd:dateTime ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizeHotelViewsResponse/unmatchedPropertyWithErrorsCount> ;
    sh:name "unmatched property with errors count" ;
    sh:description "The number of unmatched properties that have data-related errors." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizeHotelViewsResponse/overclusteredPropertyCount> ;
    sh:name "overclustered property count" ;
    sh:description "The number of hotels that are considered overclustered." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizeHotelViewsResponse/overclusteredPropertyWithErrorsCount> ;
    sh:name "overclustered property with errors count" ;
    sh:description "The number of overclustered properties that have data-related errors." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizeHotelViewsResponse/unmatchedPropertyCount> ;
    sh:name "unmatched property count" ;
    sh:description "The number of properties that are considered unmatched." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizeHotelViewsResponse/matchedPropertyCount> ;
    sh:name "matched property count" ;
    sh:description "The number of properties that match Google's manifest." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizeHotelViewsResponse/liveOnGooglePropertyCount> ;
    sh:name "live on google property count" ;
    sh:description "The number of properties that are Live on Google. This includes properties that are conditionally active, e.g. LIVE_ON_GOOGLE_STATUS_ACTIVE_OUTSIDE_DSA_REGION." ;
    sh:datatype xsd:long ;
    sh:maxCount 1 ;
  ] .

# Shape for Summarize Price Accuracy Response
googlehotels:SummarizePriceAccuracyResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:SummarizePriceAccuracyResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/predictedBookOnGoogleScore> ;
    sh:name "predicted book on google score" ;
    sh:description "The predicted Book on Google price accuracy score." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "PRICE_ACCURACY_STATE_UNSPECIFIED" "PRICE_ACCURACY_STATE_UNKNOWN" "EXCELLENT" "GOOD" "POOR" "AT_RISK" "FAILED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/currentBookOnGoogleScore> ;
    sh:name "current book on google score" ;
    sh:description "The current Book on Google price accuracy score." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "PRICE_ACCURACY_STATE_UNSPECIFIED" "PRICE_ACCURACY_STATE_UNKNOWN" "EXCELLENT" "GOOD" "POOR" "AT_RISK" "FAILED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/currentOverallScore> ;
    sh:name "current overall score" ;
    sh:description "The current price accuracy score combining both website and Book on Google scores." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "PRICE_ACCURACY_STATE_UNSPECIFIED" "PRICE_ACCURACY_STATE_UNKNOWN" "EXCELLENT" "GOOD" "POOR" "AT_RISK" "FAILED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/predictedOverallScore> ;
    sh:name "predicted overall score" ;
    sh:description "The predicted price accuracy score combining both website and Book on Google scores." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "PRICE_ACCURACY_STATE_UNSPECIFIED" "PRICE_ACCURACY_STATE_UNKNOWN" "EXCELLENT" "GOOD" "POOR" "AT_RISK" "FAILED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/updateTime> ;
    sh:name "update time" ;
    sh:description "The update timestamp for the current score." ;
    sh:datatype xsd:dateTime ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/currentWebsiteScore> ;
    sh:name "current website score" ;
    sh:description "The current website price accuracy score." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "PRICE_ACCURACY_STATE_UNSPECIFIED" "PRICE_ACCURACY_STATE_UNKNOWN" "EXCELLENT" "GOOD" "POOR" "AT_RISK" "FAILED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/predictedWebsiteScore> ;
    sh:name "predicted website score" ;
    sh:description "The predicted website price accuracy score." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "PRICE_ACCURACY_STATE_UNSPECIFIED" "PRICE_ACCURACY_STATE_UNKNOWN" "EXCELLENT" "GOOD" "POOR" "AT_RISK" "FAILED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/currentScore> ;
    sh:name "current score" ;
    sh:description "The current price accuracy score. Contains the same value as `current_website_score`. For clarity, use either `current_website_score` or 'current_overall_score` depending upon which is needed." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "PRICE_ACCURACY_STATE_UNSPECIFIED" "PRICE_ACCURACY_STATE_UNKNOWN" "EXCELLENT" "GOOD" "POOR" "AT_RISK" "FAILED" ) ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.SummarizePriceAccuracyResponse/predictedScore> ;
    sh:name "predicted score" ;
    sh:description "The predicted price accuracy score. Contains the same value as `predicted_website_score`. For clarity, use either `predicted_website_score` or 'predicted_overall_score` depending upon which is needed." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:in ( "PRICE_ACCURACY_STATE_UNSPECIFIED" "PRICE_ACCURACY_STATE_UNKNOWN" "EXCELLENT" "GOOD" "POOR" "AT_RISK" "FAILED" ) ;
  ] .

# Shape for Validate Reconciliation Report Response
googlehotels:ValidateReconciliationReportResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:ValidateReconciliationReportResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ValidateReconciliationReportResponse/successfulRecordCount> ;
    sh:name "successful record count" ;
    sh:description "The number of commission records that were successfully validated." ;
    sh:datatype xsd:int ;
    sh:maxCount 1 ;
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ValidateReconciliationReportResponse/issues> ;
    sh:name "issues" ;
    sh:description "Issues that were encountered when validating the file." ;
    sh:node googlehotels:ReconciliationReportValidationIssueShape ;
    sh:class googlehotels:ReconciliationReportValidationIssue ;
    sh:nodeKind sh:BlankNodeOrIRI ;
  ] .

# Shape for Verify Listings Request
googlehotels:VerifyListingsRequestShape a sh:NodeShape ;
  sh:targetClass googlehotels:VerifyListingsRequest ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.VerifyListingsRequest/xmlListing> ;
    sh:name "xml listing" ;
    sh:description "A listing that follows the XML format specified in https://developers.google.com/hotels/hotel-prices/xml-reference/hotel-list-feed." ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
  ] .

# Shape for Verify Listings Response
googlehotels:VerifyListingsResponseShape a sh:NodeShape ;
  sh:targetClass googlehotels:VerifyListingsResponse ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.VerifyListingsResponse/parsedListing> ;
    sh:name "parsed listing" ;
    sh:description "The parsed listing output." ;
    sh:node googlehotels:ParsedListingShape ;
    sh:class googlehotels:ParsedListing ;
    sh:nodeKind sh:BlankNodeOrIRI ;
    sh:maxCount 1 ;
  ] .

# Generated Record container shape for Googlehotels.ParsedListing.unitAttributes
<https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/ContainerShape> a sh:NodeShape ;
  sh:targetClass <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/Container> ;
  sh:property [
    sh:path [ sh:inversePath <https://relay.inferal.com/ontology/googlehotels/property/Googlehotels.ParsedListing/unitAttributes> ] ;
    sh:class googlehotels:ParsedListing ;
    sh:minCount 1 ;
    sh:maxCount 1
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/entry> ;
    sh:node <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/EntryShape> ;
    sh:class <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/Entry> ;
    sh:nodeKind sh:BlankNodeOrIRI
  ] ;
  sh:sparql [
    a sh:SPARQLConstraint ;
    sh:message "Record entry keys must be unique" ;
    sh:select """SELECT $this ?key WHERE { $this <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/entry> ?left, ?right . FILTER(?left != ?right) ?left <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/key> ?key . ?right <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/key> ?key . }"""
  ] .

# Generated Record entry shape for Googlehotels.ParsedListing.unitAttributes
<https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/EntryShape> a sh:NodeShape ;
  sh:targetClass <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/Entry> ;
  sh:property [
    sh:path [ sh:inversePath <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/entry> ] ;
    sh:class <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/Container> ;
    sh:minCount 1 ;
    sh:maxCount 1
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/key> ;
    sh:datatype xsd:string ;
    sh:minCount 1 ;
    sh:maxCount 1
  ] ;
  sh:property [
    sh:path <https://relay.inferal.com/ontology/googlehotels/record/Googlehotels.ParsedListing/unitAttributes/value> ;
    sh:datatype xsd:string ;
    sh:minCount 1 ;
    sh:maxCount 1
  ] .
