glam/schemas/20251121/linkml/modules/classes/SocialMediaPost.yaml
kempersc fcd1c21c63 Add aliases and enhance slot definitions across various modules
- Added new aliases for existing slots to improve clarity and usability, including:
  - has_deadline: has_embargo_end_date
  - has_extent: has_extent_text
  - has_fonds: has_fond
  - has_laboratory: conservation_lab
  - has_language: has_iso_code639_1, has_iso_code639_3
  - has_legal_basis: legal_basis
  - has_light_exposure: max_light_lux
  - has_measurement_unit: has_unit
  - has_note: has_custodian_observation
  - has_occupation: occupation
  - has_operating_hours: has_operating_hours
  - has_position: position
  - has_quantity: has_artwork_count, link_count
  - has_roadmap: review_date
  - has_skill: skill
  - has_speaker: speaker_label
  - has_specification: specification_url
  - has_statement: rights_statement_url, rights_statement
  - has_type: custodian_only
  - has_user_category: serves_visitors_only
  - hold_record_set: record_count
  - identified_by: has_index_number
  - in_period: has_period
  - in_place: has_place
  - in_series: has_series
  - measure: has_measurement
  - measured_on: measurement_date
  - organized_by: has_organizer
  - originate_from: has_origin
  - part_of: suborganization_of
  - published_on: has_publication_date
  - receive_investment: has_investment
  - related_to: connection_heritage_type
  - require: preservation_requirement
  - safeguarded_by: current_keeper, record_holder_note
  - state: states_or_stated
  - take_comission: takes_or_took_comission
  - take_place_at: takes_or_took_place_at
  - transmit_through: transmits_or_transmitted_through
  - warrant: warrants_or_warranted

- Introduced a new slot definition for evaluated_through to capture evaluation methodologies and review statuses.
2026-02-14 14:41:49 +01:00

170 lines
8.4 KiB
YAML

id: https://nde.nl/ontology/hc/class/SocialMediaPost
name: social_media_post_class
title: Social Media Post Class
imports:
- linkml:types
- ../slots/has_content
- ../slots/has_description
- ../slots/has_endpoint
- ../slots/has_label
- ../slots/has_score
- ../slots/has_url
- ../slots/published_by
- ../slots/categorized_as
- ../slots/updated_at
- ../slots/published_at
- ../slots/in_language
- ../slots/has_type
- ../slots/identified_by
- ../slots/posted_by
- ../slots/retrieved_at
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
foaf: http://xmlns.com/foaf/0.1/
dcterms: http://purl.org/dc/terms/
prov: http://www.w3.org/ns/prov#
crm: http://www.cidoc-crm.org/cidoc-crm/
skos: http://www.w3.org/2004/02/skos/core#
as: https://www.w3.org/ns/activitystreams#
default_prefix: hc
classes:
SocialMediaPost:
class_uri: as:Object
abstract: false
description: "Concrete class for social media posts/content items.\n\n**DEFINITION**:\n\nSocialMediaPost represents a discrete piece of content published on a social media\nplatform. This includes videos, images, text posts, stories, carousels, threads,\nand other content types. Each post is published by a SocialMediaProfile (account/channel).\n\n**CRITICAL: MULTIVALUED POST TYPES**:\n\nA single SocialMediaPost can have **multiple** post types via the `post_types` slot.\nThis reflects the reality that social media content often combines formats:\n\n| Post Example | Primary Type | Secondary Types |\n|--------------|--------------|-----------------|\n| Instagram carousel with videos | CarouselPost | ImagePost, VideoPost |\n| Twitter thread with images | ThreadPost | TextPost, ImagePost |\n| YouTube Live archived as video | LiveStreamPost | VideoPost |\n| Podcast with video recording | AudioPost | VideoPost |\n| Story highlight (saved) | StoryPost\
\ | ImagePost, VideoPost |\n\n**TYPE ORDERING CONVENTION**:\n- First type in list = primary/dominant format\n- Subsequent types = secondary characteristics\n- Order matters for display and categorization\n\n**CRITICAL: POST vs PROFILE vs PLATFORM**:\n\n| Class | Represents | Example | Cardinality |\n|-------|------------|---------|-------------|\n| SocialMediaPlatformType | Platform category | YouTube | ~25 types |\n| SocialMediaProfile | Account/channel | @rijksmuseum | Thousands |\n| **SocialMediaPost** | Individual content | A video, post | Millions |\n\n**ACTIVITY STREAMS 2.0 ALIGNMENT**:\n\nMaps to `as:Object` from W3C Activity Streams 2.0 vocabulary:\n- as:Object is the base type for content in social media\n- Individual posts may also map to as:Video, as:Image, as:Note based on post_types\n- Enables federation with ActivityPub-based platforms (Mastodon, PeerTube)\n\n**HERITAGE INSTITUTION CONTEXT**:\n\nSocial media content from heritage institutions includes:\n\n1. **Official\
\ content** (posted by the institution):\n - Collection highlights (ImagePost)\n - Exhibition announcements (TextPost)\n - Educational videos (VideoPost)\n - Behind-the-scenes content (ShortVideoPost, StoryPost)\n - Event recordings (LiveStreamPost \u2192 VideoPost)\n - Curator interviews (VideoPost, AudioPost)\n - Multi-image collection stories (CarouselPost)\n\n2. **Third-party content** (about the institution):\n - Visitor videos/photos\n - News coverage\n - Academic discussions\n - Review content\n\n3. **User-generated content** (mentions):\n - Tagged posts\n - Check-ins\n - Comments/discussions\n\n**PROVENANCE TRACKING**:\n\nContent items are OBSERVATIONAL data retrieved via:\n- Platform APIs (YouTube Data API, Twitter API, etc.)\n- Web scraping (when API unavailable)\n- Manual archival\n\nEach content record includes:\n- `retrieval_timestamp`: When content was fetched\n- `api_endpoint`: Which API/method was used\n\
- `metrics_observed_date`: When engagement metrics were recorded\n\n**TEMPORAL CONSIDERATIONS**:\n\\nContent has multiple temporal dimensions:\\n- `published_at`: When originally posted\\n- `last_updated_at`: Last modification\\\n \\ by author\\n- `retrieval_timestamp`: When we fetched it\\n- `metrics_observed_date`: When metrics (views, likes) were\\ recorded\n\nEngagement metrics change constantly; always record observation timestamp.\n\n**SUBCLASSES FOR SPECIALIZED CONTENT**:\n\nWhile SocialMediaPost can represent any content with post_types,\nspecialized subclasses provide additional platform-specific slots:\n\n- **VideoPost**: YouTube, TikTok, Vimeo videos (duration, definition, captions)\n- **ImagePost**: Instagram, Pinterest posts (dimensions, alt_text) [future]\n- **TextPost**: Twitter/X, Mastodon posts (character_count) [future]\n- **StoryPost**: Instagram/Facebook stories (ephemeral, segments) [future]\n"
exact_mappings:
- as:Object
close_mappings:
- schema:CreativeWork
- crm:E73_Information_Object
related_mappings:
- schema:SocialMediaPosting
- dcterms:BibliographicResource
slots:
- has_endpoint
- has_content
- has_description
- published_by
- in_language
- has_type
- identified_by
- has_url
- posted_by
- published_at
- retrieved_at
- has_type
- has_score
- has_url
- has_label
- updated_at
slot_usage:
identified_by:
# range: string
required: true
identifier: true
examples:
- value: FbIoC-Owy-M
- value: '1234567890123456789'
has_url:
range: uri
required: true
pattern: ^https?://
examples:
- value: https://www.youtube.com/watch?v=FbIoC-Owy-M
- value: '[CarouselPost, ImagePost, VideoPost]'
has_type:
# range: string # uriorcurie
required: true
inlined: false
examples:
- value: YouTube
posted_by:
range: SocialMediaProfile
required: false
inlined: false
examples:
- value: https://nde.nl/ontology/hc/social-media/nationaal-onderduikmuseum-youtube
has_label:
# range: string
required: false
examples:
- value: "De Vrijheidsroute (aflevering 3) \u2013 Zevenaar, Duiven, Westervoort"
published_at:
range: PublicationEvent
required: true
inlined: true
examples:
- value:
temporal_extent:
begin_of_the_begin: '2025-07-30T18:05:15Z'
end_of_the_begin: '2025-07-30T18:05:15Z'
begin_of_the_end: '2025-07-30T18:05:15Z'
end_of_the_end: '2025-07-30T18:05:15Z'
updated_at:
range: datetime
required: false
examples:
- value: '2025-08-01T10:30:00Z'
in_language:
# range: string
required: false
examples:
- value: nl
has_type:
range: Tag
multivalued: true
inlined_as_list: true
required: false
examples:
- value:
- tag_value: 80 jaar vrijheid
- tag_value: wo2
- tag_value: vrijheidsroute
has_url:
range: uri
required: false
examples:
- value: https://i.ytimg.com/vi/FbIoC-Owy-M/hqdefault.jpg
published_by:
range: boolean
required: false
ifabsent: 'true'
examples:
- value: true
has_content:
# range: string
required: false
examples:
- value: '22'
retrieved_at:
range: datetime
required: true
examples:
- value: '2025-12-01T23:16:22.294232+00:00'
has_endpoint:
range: APIEndpoint
inlined: true
examples:
- value:
has_url: https://www.googleapis.com/youtube/v3
has_description: YouTube Data API v3
comments:
- Concrete class for social media posts
- post_types is MULTIVALUED - a post can have multiple content types
- First type in post_types list is the primary format
- Use specialized subclasses (VideoPost) for platform-specific properties
- Activity Streams 2.0 alignment enables ActivityPub federation
- Metrics are observational - always include retrieval_timestamp
see_also:
- https://www.w3.org/ns/activitystreams#Object
- https://schema.org/CreativeWork
- https://schema.org/SocialMediaPosting
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"