glam/schemas/20251121/linkml/modules/classes/SocialMediaContent.yaml
kempersc fc405445c6 Refactor and update schema definitions
- Removed obsolete slots: `has_or_had_custodian_observation`, `provider`, and `specificity_annotation`.
- Updated `has_or_had_score` slot to use `SpecificityScore` class and modified its description and examples.
- Added new slots: `end_seconds`, `end_time`, `has_archive_path`, `has_or_had_custodian_name`, `protocol_name`, and `protocol_version`.
- Introduced a script `check_annotation_types.py` to validate the presence and structure of `custodian_types` in YAML files.
- Added a script `update_specificity.py` to automate updates related to `SpecificityAnnotation` to `SpecificityScore`.
2026-02-01 19:55:38 +01:00

165 lines
7.2 KiB
YAML

id: https://nde.nl/ontology/hc/class/SocialMediaContent
name: social_media_content_class
title: Social Media Content Base Class
imports:
- linkml:types
- ../slots/content_category
- ../slots/content_id
- ../slots/content_url
- ../slots/has_or_had_description
- ../slots/has_or_had_endpoint
- ../slots/has_or_had_label
- ../slots/has_or_had_score
- ../slots/has_or_had_url
- ../slots/is_official_content
- ../slots/is_or_was_categorized_as
- ../slots/is_or_was_last_updated_at
- ../slots/is_or_was_published_at
- ../slots/language
- ../slots/platform_type
- ../slots/posted_by_profile
- ../slots/retrieval_timestamp
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:
SocialMediaContent:
class_uri: as:Object
abstract: true
description: "Abstract base class for all social media content items.\n\n**DEFINITION**:\n\nSocialMediaContent represents discrete pieces of content published on social media\nplatforms. This includes videos, images, text posts, stories, and other content types.\nEach content item is posted by a SocialMediaProfile (the channel/account).\n\n**CRITICAL: CONTENT 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| **SocialMediaContent** | 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- Subclasses map to as:Video, as:Image, as:Note, etc.\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\n - Exhibition announcements\n - Educational videos\n - Behind-the-scenes content\n - Event recordings\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- `is_or_was_last_updated_at`: Last modification 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**:\n\n- VideoPost: YouTube, TikTok, Vimeo videos\n- ImagePost: Instagram, Pinterest posts (future)\n- TextPost: Twitter/X, Mastodon posts (future)\n- StoryPost: Instagram/Facebook stories (future)\n"
exact_mappings:
- as:Object
close_mappings:
- schema:CreativeWork
- crm:E73_Information_Object
related_mappings:
- schema:SocialMediaPosting
- dcterms:BibliographicResource
slots:
- has_or_had_endpoint
- content_category
- content_id
- content_url
- has_or_had_description
- is_official_content
- language
- platform_type
- posted_by_profile
- is_or_was_published_at
- retrieval_timestamp
- is_or_was_categorized_as
- has_or_had_score
- has_or_had_url
- has_or_had_label
- is_or_was_last_updated_at
slot_usage:
content_id:
range: string
required: true
identifier: true
examples:
- value: FbIoC-Owy-M
content_url:
range: uri
required: true
pattern: ^https?://
examples:
- value: https://www.youtube.com/watch?v=FbIoC-Owy-M
platform_type:
range: uriorcurie
required: true
examples:
- value: YouTube
posted_by_profile:
range: SocialMediaProfile
required: false
examples:
- value: https://nde.nl/ontology/hc/social-media/nationaal-onderduikmuseum-youtube
has_or_had_label:
range: string
required: false
examples:
- value: "De Vrijheidsroute (aflevering 3) \u2013 Zevenaar, Duiven, Westervoort"
is_or_was_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'
is_or_was_last_updated_at:
range: datetime
required: false
examples:
- value: '2025-08-01T10:30:00Z'
language:
range: string
required: false
examples:
- value: nl
is_or_was_categorized_as:
range: Tag
multivalued: true
inlined_as_list: true
required: false
examples:
- value:
- tag_value: 80 jaar vrijheid
- tag_value: wo2
- tag_value: vrijheidsroute
has_or_had_url:
range: uri
required: false
examples:
- value: https://i.ytimg.com/vi/FbIoC-Owy-M/hqdefault.jpg
is_official_content:
range: boolean
required: false
ifabsent: 'true'
examples:
- value: true
content_category:
range: string
required: false
examples:
- value: '22'
retrieval_timestamp:
range: datetime
required: true
examples:
- value: '2025-12-01T23:16:22.294232+00:00'
has_or_had_endpoint:
range: APIEndpoint
inlined: true
examples:
- value:
has_or_had_url: https://www.googleapis.com/youtube/v3
has_or_had_description: YouTube Data API v3
comments:
- Abstract base class - use specific subclasses (VideoPost, ImagePost, etc.)
- Represents individual CONTENT items, not profiles or platforms
- Activity Streams 2.0 alignment enables ActivityPub federation
- Metrics are observational - always include retrieval_timestamp
- Supports both official institutional content and third-party coverage
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: "['*']"