SEO. JSONLD. Review
(SEO v0.3.0-rc.0)
View Source
A review of an item - for example, of a restaurant, movie, or store.

Example
SEO.JSONLD.Review.build(%{
item_reviewed:
SEO.JSONLD.Product.build(%{
name: "Widget",
image: "https://example.com/widget.jpg",
offers:
SEO.JSONLD.Offer.build(%{
price: "19.99",
price_currency: "USD",
availability: :in_stock
})
}),
review_rating:
SEO.JSONLD.Rating.build(%{
rating_value: 5,
best_rating: 5
}),
author: SEO.JSONLD.Person.build(%{name: "Jane Doe"}),
date_published: ~D[2024-02-12],
review_body: "Excellent widget — does exactly what it promises."
})Helper for building a Schema.org Review JSON-LD structure.
Summary
Types
A JSON-LD map ready to be nested or rendered. String-keyed, always
includes "@type" set to "Review", plus any camelCased
field keys the caller provided (see build/1). "@context" is added
at render time by SEO.JSONLD.meta/1 on the top-level node only.
Functions
Build a Review JSON-LD map.
Types
@type attrs() :: %{ optional(:associated_claim_review) => t() | map(), optional(:associated_media_review) => t() | map(), optional(:associated_review) => t() | map(), :item_reviewed => SEO.JSONLD.Thing.t() | map(), optional(:negative_notes) => SEO.JSONLD.ItemList.t() | map() | SEO.JSONLD.ListItem.t() | String.t() | SEO.JSONLD.WebContent.t(), optional(:positive_notes) => SEO.JSONLD.WebContent.t() | map() | SEO.JSONLD.ItemList.t() | SEO.JSONLD.ListItem.t() | String.t(), optional(:review_aspect) => SEO.JSONLD.StructuredValue.t() | map() | String.t(), optional(:review_body) => String.t(), :review_rating => SEO.JSONLD.Rating.t() | map(), optional(:about) => SEO.JSONLD.Thing.t() | map(), optional(:abstract) => String.t(), optional(:access_mode) => String.t(), optional(:access_mode_sufficient) => SEO.JSONLD.ItemList.t() | map(), optional(:accessibility_api) => String.t(), optional(:accessibility_control) => String.t(), optional(:accessibility_feature) => String.t(), optional(:accessibility_hazard) => String.t(), optional(:accessibility_summary) => String.t(), optional(:accountable_person) => SEO.JSONLD.Person.t() | map(), optional(:acquire_license_page) => SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), optional(:aggregate_rating) => SEO.JSONLD.AggregateRating.t() | map(), optional(:alternative_headline) => String.t(), optional(:archived_at) => SEO.JSONLD.WebPage.t() | map() | URI.t() | String.t(), optional(:assesses) => String.t() | SEO.JSONLD.DefinedTerm.t() | map(), optional(:associated_media) => SEO.JSONLD.MediaObject.t() | map(), optional(:audience) => SEO.JSONLD.Audience.t() | map(), optional(:audio) => SEO.JSONLD.Clip.t() | map() | SEO.JSONLD.MusicRecording.t() | SEO.JSONLD.AudioObject.t(), :author => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:award) => String.t(), optional(:awards) => String.t(), optional(:character) => SEO.JSONLD.Person.t() | map(), optional(:citation) => SEO.JSONLD.CreativeWork.t() | map() | String.t(), optional(:comment) => SEO.JSONLD.Comment.t() | map(), optional(:comment_count) => integer(), optional(:conditions_of_access) => String.t(), optional(:content_location) => SEO.JSONLD.Place.t() | map(), optional(:content_rating) => String.t() | SEO.JSONLD.Rating.t() | map(), optional(:content_reference_time) => DateTime.t() | NaiveDateTime.t() | String.t(), optional(:contributor) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:copyright_holder) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:copyright_notice) => String.t(), optional(:copyright_year) => number(), optional(:correction) => SEO.JSONLD.CorrectionComment.t() | map() | String.t() | URI.t(), optional(:country_of_origin) => SEO.JSONLD.Country.t() | map(), optional(:creative_work_status) => SEO.JSONLD.DefinedTerm.t() | map() | String.t(), optional(:creator) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:credit_text) => String.t(), optional(:date_created) => DateTime.t() | NaiveDateTime.t() | String.t() | Date.t(), optional(:date_modified) => DateTime.t() | NaiveDateTime.t() | String.t() | Date.t(), optional(:date_published) => Date.t() | String.t() | DateTime.t() | NaiveDateTime.t(), optional(:digital_source_type) => :algorithmic_media_digital_source | :algorithmically_enhanced_digital_source | :composite_capture_digital_source | :composite_digital_source | :composite_synthetic_digital_source | :composite_with_trained_algorithmic_media_digital_source | :data_driven_media_digital_source | :digital_art_digital_source | :digital_capture_digital_source | :minor_human_edits_digital_source | :multi_frame_computational_capture_digital_source | :negative_film_digital_source | :positive_film_digital_source | :print_digital_source | :screen_capture_digital_source | :trained_algorithmic_media_digital_source | :virtual_recording_digital_source, optional(:discussion_url) => URI.t() | String.t(), optional(:display_location) => SEO.JSONLD.Place.t() | map(), optional(:edit_eidr) => String.t() | URI.t(), optional(:editor) => SEO.JSONLD.Person.t() | map(), optional(:educational_alignment) => SEO.JSONLD.AlignmentObject.t() | map(), optional(:educational_level) => String.t() | URI.t() | SEO.JSONLD.DefinedTerm.t() | map(), optional(:educational_use) => SEO.JSONLD.DefinedTerm.t() | map() | String.t(), optional(:encoding) => SEO.JSONLD.MediaObject.t() | map(), optional(:encoding_format) => String.t() | URI.t(), optional(:encodings) => SEO.JSONLD.MediaObject.t() | map(), optional(:example_of_work) => SEO.JSONLD.CreativeWork.t() | map(), optional(:expires) => Date.t() | String.t() | DateTime.t() | NaiveDateTime.t(), optional(:file_format) => String.t() | URI.t(), optional(:funder) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:funding) => SEO.JSONLD.Grant.t() | map(), optional(:genre) => String.t() | URI.t() | SEO.JSONLD.DefinedTerm.t() | map(), optional(:has_part) => SEO.JSONLD.CreativeWork.t() | map(), optional(:headline) => String.t(), optional(:in_language) => String.t() | SEO.JSONLD.Language.t() | map(), optional(:interaction_statistic) => SEO.JSONLD.InteractionCounter.t() | map(), optional(:interactivity_type) => String.t(), optional(:interpreted_as_claim) => SEO.JSONLD.Claim.t() | map(), optional(:is_accessible_for_free) => boolean(), optional(:is_based_on) => SEO.JSONLD.CreativeWork.t() | map() | SEO.JSONLD.Product.t() | URI.t() | String.t(), optional(:is_based_on_url) => SEO.JSONLD.CreativeWork.t() | map() | SEO.JSONLD.Product.t() | URI.t() | String.t(), optional(:is_family_friendly) => boolean(), optional(:is_part_of) => SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), optional(:keywords) => SEO.JSONLD.DefinedTerm.t() | map() | String.t() | URI.t(), optional(:learning_resource_type) => String.t() | SEO.JSONLD.DefinedTerm.t() | map(), optional(:license) => SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), optional(:location_created) => SEO.JSONLD.Place.t() | map(), optional(:main_entity) => SEO.JSONLD.Thing.t() | map(), optional(:maintainer) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:material) => String.t() | SEO.JSONLD.Product.t() | map() | URI.t(), optional(:material_extent) => SEO.JSONLD.QuantitativeValue.t() | map() | String.t(), optional(:mentions) => SEO.JSONLD.Thing.t() | map(), optional(:offers) => SEO.JSONLD.Offer.t() | map() | SEO.JSONLD.Demand.t(), optional(:pattern) => SEO.JSONLD.DefinedTerm.t() | map() | String.t(), optional(:position) => String.t() | integer(), optional(:producer) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:provider) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:publication) => SEO.JSONLD.PublicationEvent.t() | map(), optional(:publisher) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:publisher_imprint) => SEO.JSONLD.Organization.t() | map(), optional(:publishing_principles) => SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), optional(:recorded_at) => SEO.JSONLD.Event.t() | map(), optional(:released_event) => SEO.JSONLD.PublicationEvent.t() | map(), optional(:review) => t() | map(), optional(:reviews) => t() | map(), optional(:schema_version) => String.t() | URI.t(), optional(:sd_date_published) => Date.t() | String.t(), optional(:sd_license) => URI.t() | String.t() | SEO.JSONLD.CreativeWork.t() | map(), optional(:sd_publisher) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:size) => SEO.JSONLD.DefinedTerm.t() | map() | SEO.JSONLD.QuantitativeValue.t() | String.t(), optional(:source_organization) => SEO.JSONLD.Organization.t() | map(), optional(:spatial) => SEO.JSONLD.Place.t() | map(), optional(:spatial_coverage) => SEO.JSONLD.Place.t() | map(), optional(:sponsor) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:teaches) => SEO.JSONLD.DefinedTerm.t() | map() | String.t(), optional(:temporal) => String.t() | DateTime.t() | NaiveDateTime.t(), optional(:temporal_coverage) => String.t() | URI.t() | DateTime.t() | NaiveDateTime.t(), optional(:text) => String.t(), optional(:thumbnail) => SEO.JSONLD.ImageObject.t() | map(), optional(:thumbnail_url) => URI.t() | String.t(), optional(:time_required) => Duration.t() | String.t(), optional(:translation_of_work) => SEO.JSONLD.CreativeWork.t() | map(), optional(:translator) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:typical_age_range) => String.t(), optional(:usage_info) => SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), optional(:version) => String.t() | number(), optional(:video) => SEO.JSONLD.VideoObject.t() | map() | SEO.JSONLD.Clip.t(), optional(:word_count) => integer(), optional(:work_example) => SEO.JSONLD.CreativeWork.t() | map(), optional(:work_translation) => SEO.JSONLD.CreativeWork.t() | map(), optional(:additional_type) => String.t() | URI.t(), optional(:alternate_name) => String.t(), optional(:description) => SEO.JSONLD.TextObject.t() | map() | String.t(), optional(:disambiguating_description) => String.t(), optional(:identifier) => String.t() | URI.t() | SEO.JSONLD.PropertyValue.t() | map(), optional(:image) => URI.t() | String.t() | SEO.JSONLD.ImageObject.t() | map(), optional(:main_entity_of_page) => SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), optional(:name) => String.t(), optional(:owner) => SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), optional(:potential_action) => SEO.JSONLD.Action.t() | map(), optional(:same_as) => URI.t() | String.t(), optional(:subject_of) => SEO.JSONLD.Event.t() | map() | SEO.JSONLD.CreativeWork.t(), optional(:url) => URI.t() | String.t() } | [ associated_claim_review: t() | map(), associated_media_review: t() | map(), associated_review: t() | map(), item_reviewed: SEO.JSONLD.Thing.t() | map(), negative_notes: SEO.JSONLD.ItemList.t() | map() | SEO.JSONLD.ListItem.t() | String.t() | SEO.JSONLD.WebContent.t(), positive_notes: SEO.JSONLD.WebContent.t() | map() | SEO.JSONLD.ItemList.t() | SEO.JSONLD.ListItem.t() | String.t(), review_aspect: SEO.JSONLD.StructuredValue.t() | map() | String.t(), review_body: String.t(), review_rating: SEO.JSONLD.Rating.t() | map(), about: SEO.JSONLD.Thing.t() | map(), abstract: String.t(), access_mode: String.t(), access_mode_sufficient: SEO.JSONLD.ItemList.t() | map(), accessibility_api: String.t(), accessibility_control: String.t(), accessibility_feature: String.t(), accessibility_hazard: String.t(), accessibility_summary: String.t(), accountable_person: SEO.JSONLD.Person.t() | map(), acquire_license_page: SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), aggregate_rating: SEO.JSONLD.AggregateRating.t() | map(), alternative_headline: String.t(), archived_at: SEO.JSONLD.WebPage.t() | map() | URI.t() | String.t(), assesses: String.t() | SEO.JSONLD.DefinedTerm.t() | map(), associated_media: SEO.JSONLD.MediaObject.t() | map(), audience: SEO.JSONLD.Audience.t() | map(), audio: SEO.JSONLD.Clip.t() | map() | SEO.JSONLD.MusicRecording.t() | SEO.JSONLD.AudioObject.t(), author: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), award: String.t(), awards: String.t(), character: SEO.JSONLD.Person.t() | map(), citation: SEO.JSONLD.CreativeWork.t() | map() | String.t(), comment: SEO.JSONLD.Comment.t() | map(), comment_count: integer(), conditions_of_access: String.t(), content_location: SEO.JSONLD.Place.t() | map(), content_rating: String.t() | SEO.JSONLD.Rating.t() | map(), content_reference_time: DateTime.t() | NaiveDateTime.t() | String.t(), contributor: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), copyright_holder: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), copyright_notice: String.t(), copyright_year: number(), correction: SEO.JSONLD.CorrectionComment.t() | map() | String.t() | URI.t(), country_of_origin: SEO.JSONLD.Country.t() | map(), creative_work_status: SEO.JSONLD.DefinedTerm.t() | map() | String.t(), creator: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), credit_text: String.t(), date_created: DateTime.t() | NaiveDateTime.t() | String.t() | Date.t(), date_modified: DateTime.t() | NaiveDateTime.t() | String.t() | Date.t(), date_published: Date.t() | String.t() | DateTime.t() | NaiveDateTime.t(), digital_source_type: :algorithmic_media_digital_source | :algorithmically_enhanced_digital_source | :composite_capture_digital_source | :composite_digital_source | :composite_synthetic_digital_source | :composite_with_trained_algorithmic_media_digital_source | :data_driven_media_digital_source | :digital_art_digital_source | :digital_capture_digital_source | :minor_human_edits_digital_source | :multi_frame_computational_capture_digital_source | :negative_film_digital_source | :positive_film_digital_source | :print_digital_source | :screen_capture_digital_source | :trained_algorithmic_media_digital_source | :virtual_recording_digital_source, discussion_url: URI.t() | String.t(), display_location: SEO.JSONLD.Place.t() | map(), edit_eidr: String.t() | URI.t(), editor: SEO.JSONLD.Person.t() | map(), educational_alignment: SEO.JSONLD.AlignmentObject.t() | map(), educational_level: String.t() | URI.t() | SEO.JSONLD.DefinedTerm.t() | map(), educational_use: SEO.JSONLD.DefinedTerm.t() | map() | String.t(), encoding: SEO.JSONLD.MediaObject.t() | map(), encoding_format: String.t() | URI.t(), encodings: SEO.JSONLD.MediaObject.t() | map(), example_of_work: SEO.JSONLD.CreativeWork.t() | map(), expires: Date.t() | String.t() | DateTime.t() | NaiveDateTime.t(), file_format: String.t() | URI.t(), funder: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), funding: SEO.JSONLD.Grant.t() | map(), genre: String.t() | URI.t() | SEO.JSONLD.DefinedTerm.t() | map(), has_part: SEO.JSONLD.CreativeWork.t() | map(), headline: String.t(), in_language: String.t() | SEO.JSONLD.Language.t() | map(), interaction_statistic: SEO.JSONLD.InteractionCounter.t() | map(), interactivity_type: String.t(), interpreted_as_claim: SEO.JSONLD.Claim.t() | map(), is_accessible_for_free: boolean(), is_based_on: SEO.JSONLD.CreativeWork.t() | map() | SEO.JSONLD.Product.t() | URI.t() | String.t(), is_based_on_url: SEO.JSONLD.CreativeWork.t() | map() | SEO.JSONLD.Product.t() | URI.t() | String.t(), is_family_friendly: boolean(), is_part_of: SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), keywords: SEO.JSONLD.DefinedTerm.t() | map() | String.t() | URI.t(), learning_resource_type: String.t() | SEO.JSONLD.DefinedTerm.t() | map(), license: SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), location_created: SEO.JSONLD.Place.t() | map(), main_entity: SEO.JSONLD.Thing.t() | map(), maintainer: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), material: String.t() | SEO.JSONLD.Product.t() | map() | URI.t(), material_extent: SEO.JSONLD.QuantitativeValue.t() | map() | String.t(), mentions: SEO.JSONLD.Thing.t() | map(), offers: SEO.JSONLD.Offer.t() | map() | SEO.JSONLD.Demand.t(), pattern: SEO.JSONLD.DefinedTerm.t() | map() | String.t(), position: String.t() | integer(), producer: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), provider: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), publication: SEO.JSONLD.PublicationEvent.t() | map(), publisher: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), publisher_imprint: SEO.JSONLD.Organization.t() | map(), publishing_principles: SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), recorded_at: SEO.JSONLD.Event.t() | map(), released_event: SEO.JSONLD.PublicationEvent.t() | map(), review: t() | map(), reviews: t() | map(), schema_version: String.t() | URI.t(), sd_date_published: Date.t() | String.t(), sd_license: URI.t() | String.t() | SEO.JSONLD.CreativeWork.t() | map(), sd_publisher: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), size: SEO.JSONLD.DefinedTerm.t() | map() | SEO.JSONLD.QuantitativeValue.t() | String.t(), source_organization: SEO.JSONLD.Organization.t() | map(), spatial: SEO.JSONLD.Place.t() | map(), spatial_coverage: SEO.JSONLD.Place.t() | map(), sponsor: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), teaches: SEO.JSONLD.DefinedTerm.t() | map() | String.t(), temporal: String.t() | DateTime.t() | NaiveDateTime.t(), temporal_coverage: String.t() | URI.t() | DateTime.t() | NaiveDateTime.t(), text: String.t(), thumbnail: SEO.JSONLD.ImageObject.t() | map(), thumbnail_url: URI.t() | String.t(), time_required: Duration.t() | String.t(), translation_of_work: SEO.JSONLD.CreativeWork.t() | map(), translator: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), typical_age_range: String.t(), usage_info: SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), version: String.t() | number(), video: SEO.JSONLD.VideoObject.t() | map() | SEO.JSONLD.Clip.t(), word_count: integer(), work_example: SEO.JSONLD.CreativeWork.t() | map(), work_translation: SEO.JSONLD.CreativeWork.t() | map(), additional_type: String.t() | URI.t(), alternate_name: String.t(), description: SEO.JSONLD.TextObject.t() | map() | String.t(), disambiguating_description: String.t(), identifier: String.t() | URI.t() | SEO.JSONLD.PropertyValue.t() | map(), image: URI.t() | String.t() | SEO.JSONLD.ImageObject.t() | map(), main_entity_of_page: SEO.JSONLD.CreativeWork.t() | map() | URI.t() | String.t(), name: String.t(), owner: SEO.JSONLD.Organization.t() | map() | SEO.JSONLD.Person.t(), potential_action: SEO.JSONLD.Action.t() | map(), same_as: URI.t() | String.t(), subject_of: SEO.JSONLD.Event.t() | map() | SEO.JSONLD.CreativeWork.t(), url: URI.t() | String.t() ]
A JSON-LD map ready to be nested or rendered. String-keyed, always
includes "@type" set to "Review", plus any camelCased
field keys the caller provided (see build/1). "@context" is added
at render time by SEO.JSONLD.meta/1 on the top-level node only.
Functions
Build a Review JSON-LD map.
Fields
:associated_claim_review- An associatedSEO.JSONLD.ClaimReview, related by specific common content, topic or claim. The expectation is that this property would be most typically used in cases where a single activity is conducting both claim reviews and media reviews, in which caserelatedMediaReviewwould commonly be used on aSEO.JSONLD.ClaimReview, whileassociatedClaimReviewwould be used onSEO.JSONLD.MediaReview.:associated_media_review- An associatedSEO.JSONLD.MediaReview, related by specific common content, topic or claim. The expectation is that this property would be most typically used in cases where a single activity is conducting both claim reviews and media reviews, in which caserelatedMediaReviewwould commonly be used on aSEO.JSONLD.ClaimReview, whileassociatedClaimReviewwould be used onSEO.JSONLD.MediaReview.:associated_review- An associatedSEO.JSONLD.Review.:item_reviewed- The item that is being reviewed/rated.:negative_notes- Provides negative considerations regarding something, most typically in pro/con lists for reviews (alongsidepositiveNotes). For symmetry
In the case of a SEO.JSONLD.Review, the property describes the itemReviewed from the perspective of the review; in the case of a SEO.JSONLD.Product, the product itself is being described. Since product descriptions
tend to emphasise positive claims, it may be relatively unusual to find negativeNotes used in this way. Nevertheless for the sake of symmetry, negativeNotes can be used on SEO.JSONLD.Product.
The property values can be expressed either as unstructured text (repeated as necessary), or if ordered, as a list (in which case the most negative is at the beginning of the list).
:positive_notes- Provides positive considerations regarding something, for example product highlights or (alongsidenegativeNotes) pro/con lists for reviews.
In the case of a SEO.JSONLD.Review, the property describes the itemReviewed from the perspective of the review; in the case of a SEO.JSONLD.Product, the product itself is being described.
The property values can be expressed either as unstructured text (repeated as necessary), or if ordered, as a list (in which case the most positive is at the beginning of the list).
:review_aspect- This Review or Rating is relevant to this part or facet of the itemReviewed.:review_body- The actual body of the review.:review_rating- The rating given in this review. Note that reviews can themselves be rated. ThereviewRatingapplies to rating given by the review. TheaggregateRatingproperty applies to the review itself, as a creative work.
Inherited properties
Additional properties are available through the inheritance chain. See each ancestor's docs for its properties: