glam/schemas/20251121/linkml/modules/classes/SocialMediaPost.yaml
kempersc 47663e7c79 Refactor schema definitions and slots for improved temporal modeling and publisher representation
- Migrated `published_at` to `is_or_was_published_at` with structured `PublicationEvent` class for enhanced temporal accuracy.
- Introduced `has_or_had_publisher` slot to replace the string-based `publisher` slot, allowing for detailed publisher information.
- Added new slots: `deduction_percentage`, `regulatory_body`, `expiration_date`, and `jurisdiction` to support tax scheme documentation.
- Archived outdated slots: `published_by` and `publisher`, ensuring compliance with updated naming conventions and ontology alignment.
- Updated `Database` types to `DatabaseSystem` for consistency in technological infrastructure classification.
- Broadened range types for slots `allows_or_allowed` and `includes_or_included` from `string` to `uriorcurie` to resolve OWL ambiguities.
- Enhanced documentation and examples across various classes and slots to clarify usage and improve understanding.
2026-01-17 21:10:50 +01:00

266 lines
12 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

id: https://nde.nl/ontology/hc/class/SocialMediaPost
name: social_media_post_class
title: Social Media Post Class
imports:
- linkml:types
- ./SocialMediaProfile
- ./SocialMediaPlatformType
- ./SocialMediaPostType
- ./TimeSpan
- ./WebObservation
- ../slots/language
- ../slots/has_or_had_api_endpoint
- ../slots/description
- ../slots/platform_type
- ../slots/has_or_had_label # was: title - migrated per Rule 53
- ../slots/has_api_version
- ../slots/content_category
- ../slots/is_official_content
- ../slots/post_id
- ../slots/has_or_had_post_type
- ../slots/post_url
- ../slots/posted_by_profile
# - ../slots/published_at # ARCHIVED 2026-01-17 - migrated per Rule 53/56
- ../slots/is_or_was_published_at # was: published_at - migrated per Rule 53/56 (2026-01-17)
- ./PublicationEvent # for is_or_was_published_at range
- ./TimeSpan # for PublicationEvent.temporal_extent
- ../slots/retrieval_timestamp
- ../slots/specificity_annotation
- ../slots/is_or_was_categorized_as # was: tag - migrated per Rule 53/56 (2026-01-16)
- ./Tag
- ../slots/has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- ../slots/has_or_had_url # was: thumbnail_url - migrated per Rule 53 (2026-01-15)
- ../slots/was_last_updated_at # was: updated_at - migrated per Rule 53
- ./SpecificityAnnotation
- ./TemplateSpecificityScore # was: TemplateSpecificityScores - migrated per Rule 53 (2026-01-17)
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
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 | CarouselPostType\
\ | ImagePostType, VideoPostType |\n| Twitter thread with images | ThreadPostType | TextPostType, ImagePostType |\n\
| YouTube Live archived as video | LiveStreamPostType | VideoPostType |\n| Podcast with video recording | AudioPostType\
\ | VideoPostType |\n| Story highlight (saved) | StoryPostType | ImagePostType, VideoPostType |\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 (ImagePostType)\n - Exhibition announcements (TextPostType)\n\
\ - Educational videos (VideoPostType)\n - Behind-the-scenes content (ShortVideoPostType, StoryPostType)\n - Event\
\ recordings (LiveStreamPostType → VideoPostType)\n - Curator interviews (VideoPostType, AudioPostType)\n - Multi-image\
\ collection stories (CarouselPostType)\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- `is_or_was_published_at`: When originally posted\\n- `was_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_or_had_api_endpoint
- has_api_version
- content_category
- description
- is_official_content
- language
- platform_type
- post_id
- has_or_had_post_type
- post_url
- posted_by_profile
- is_or_was_published_at # was: published_at - migrated per Rule 53/56 (2026-01-17)
- retrieval_timestamp
- specificity_annotation
- is_or_was_categorized_as # was: tag - migrated per Rule 53/56 (2026-01-16)
- has_or_had_score # was: template_specificity - migrated per Rule 53 (2026-01-17)
- has_or_had_url # was: thumbnail_url - migrated per Rule 53 (2026-01-15)
- has_or_had_label # was: title
- was_last_updated_at # was: updated_at - migrated per Rule 53
slot_usage:
post_id:
range: string
required: true
identifier: true
examples:
- value: FbIoC-Owy-M
description: YouTube video ID
- value: '1234567890123456789'
description: Twitter/X tweet ID
post_url:
range: uri
required: true
pattern: ^https?://
examples:
- value: https://www.youtube.com/watch?v=FbIoC-Owy-M
description: YouTube video URL
has_or_had_post_type:
range: SocialMediaPostType
multivalued: true
required: true
inlined: false
examples:
- value: '[VideoPostType]'
description: Standard video content
- value: '[CarouselPostType, ImagePostType, VideoPostType]'
description: Instagram carousel with mixed media
platform_type:
range: SocialMediaPlatformType
required: true
inlined: false
examples:
- value: YouTube
description: Posted on YouTube
posted_by_profile:
range: SocialMediaProfile
required: false
inlined: false
examples:
- value: https://nde.nl/ontology/hc/social-media/nationaal-onderduikmuseum-youtube
description: Museum's YouTube channel profile
has_or_had_label: # was: title
range: string
required: false
examples:
- value: De Vrijheidsroute (aflevering 3) Zevenaar, Duiven, Westervoort
description: YouTube video title
description:
range: string
required: false
examples:
- value: De videoreeks De Vrijheidsroute is gebaseerd op de gelijknamige fietsroute...
description: YouTube video description
is_or_was_published_at: # was: published_at - migrated per Rule 53/56 (2026-01-17)
range: PublicationEvent
required: true
inlined: true
description: |
Publication event with temporal extent. For precise timestamps,
set all four TimeSpan boundaries to the same instant.
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'
description: Published July 30, 2025 (precise timestamp)
was_last_updated_at: # was: updated_at - migrated per Rule 53
range: datetime
required: false
examples:
- value: '2025-08-01T10:30:00Z'
description: Last edited August 1, 2025
language:
range: string
required: false
examples:
- value: nl
description: Dutch language content
# was: tag - migrated per Rule 53/56 (2026-01-16)
is_or_was_categorized_as:
range: Tag
multivalued: true
inlined_as_list: true
required: false
description: |
Tags, hashtags, or keywords associated with the post.
MIGRATED from tag slot per slot_fixes.yaml (Rule 53/56, 2026-01-16).
examples:
- value:
- tag_value: "80 jaar vrijheid"
is_hashtag: false
tag_platform: YouTube
- tag_value: "wo2"
is_hashtag: false
tag_platform: YouTube
- tag_value: "vrijheidsroute"
is_hashtag: false
tag_platform: YouTube
description: YouTube video tags (migrated to structured Tag format)
has_or_had_url: # was: thumbnail_url - migrated per Rule 53 (2026-01-15)
range: uri
required: false
description: |
Thumbnail URL for this social media post.
MIGRATED from thumbnail_url slot per slot_fixes.yaml (Rule 53, 2026-01-15).
examples:
- value: https://i.ytimg.com/vi/FbIoC-Owy-M/hqdefault.jpg
description: YouTube video thumbnail
is_official_content:
range: boolean
required: false
ifabsent: 'true'
examples:
- value: true
description: Posted by official museum channel
content_category:
range: string
required: false
examples:
- value: '22'
description: YouTube category ID for People & Blogs
retrieval_timestamp:
range: datetime
required: true
examples:
- value: '2025-12-01T23:16:22.294232+00:00'
description: Retrieved December 1, 2025
has_or_had_api_endpoint:
range: string
required: false
examples:
- value: https://www.googleapis.com/youtube/v3
description: YouTube Data API v3
has_api_version:
range: string
required: false
examples:
- value: v3
description: YouTube API version 3
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