RDF DataHub Ingestion Source
This module implements a DataHub ingestion source plugin for RDF, allowing RDF ontologies to be ingested using DataHub's native ingestion framework.
Architecture
The ingestion source follows DataHub's Source API pattern:
RDF Files → RDFSource → MetadataWorkUnits → DataHub
Key Components
RDFSourceConfig - Pydantic configuration model
- Defines all configuration parameters
- Validates input values
- Provides configuration for RDF source
RDFSource - Main source class
- Implements
datahub.ingestion.api.source.Source - Decorated with
@config_class,@platform_name,@support_status - Yields
MetadataWorkUnitobjects containing MCPs
- Implements
RDFSourceReport - Ingestion report
- Tracks statistics (files processed, entities emitted, etc.)
- Reports errors and warnings
- Extends
SourceReportfrom DataHub SDK
How It Works
Configuration - DataHub parses recipe YAML and creates
RDFSourceConfigInitialization -
RDFSourceis created with config and pipeline contextWork Unit Generation -
get_workunits()is called:- Loads RDF graph from source (file, folder, URL)
- Converts RDF to DataHub AST using entity extractors
- Generates MCPs directly from entity MCP builders
- Wraps MCPs in
MetadataWorkUnitobjects - Yields work units to DataHub ingestion framework
Ingestion - DataHub ingestion framework:
- Receives work units from source
- Applies transformers (if configured)
- Sends to DataHub GMS via sink
Plugin Registration
The source is registered as a DataHub plugin in pyproject.toml:
[project.entry-points."datahub.ingestion.source.plugins"]
rdf = "rdf.ingestion:RDFSource"
This makes it available as type: rdf in recipe files.
Configuration Parameters
See RDFSourceConfig class for all available parameters. Key parameters:
source- RDF source (file, folder, URL, comma-separated files)environment- DataHub environment (PROD, DEV, TEST)format- RDF format (turtle, xml, n3, etc.) - auto-detected if not specifieddialect- RDF dialect (default, fibo, generic) - auto-detected if not specifiedexport_only- Export only specified entity typesskip_export- Skip specified entity types
Example Recipe
source:
type: rdf
config:
source: examples/bcbs239/
environment: PROD
export_only:
- glossary
sink:
type: datahub-rest
config:
server: "http://localhost:8080"
token: "${DATAHUB_TOKEN}"
Development
Testing the Source
# Install in development mode
pip install -e .
# Verify plugin is registered
datahub check plugins
# Run with a recipe
datahub ingest -c examples/recipe_basic.yml --dry-run
Adding New Configuration Parameters
- Add field to
RDFSourceConfigclass - Add validator if needed (using pydantic's
@field_validator) - Use parameter in
get_workunits()orast_converter.convert() - Update example recipes
- Update documentation
Debugging
Enable debug logging:
datahub ingest -c examples/recipe_basic.yml --debug
Check logs in the source:
import logging
logger = logging.getLogger(__name__)
logger.debug("Debug message")
logger.info("Info message")
logger.warning("Warning message")
logger.error("Error message")
Design Decisions
MCP Generation
MCPs are generated directly by entity MCP builders in WorkUnitGenerator.generate(), ensuring:
- Single source of truth for MCP generation
- Easier maintenance (fix once, works everywhere)
- No unnecessary abstraction layers
Configuration Parameters
The configuration parameters provide: 2. Convert to recipes for production 3. Use the same parameters in both interfaces
Future Enhancements
Potential improvements for future development:
- Incremental Ingestion - Track last modified times, only process changed files
- Parallel Processing - Process multiple files in parallel
- Caching - Cache parsed RDF graphs to avoid re-parsing
- Custom Transformers - RDF-specific transformers for common operations
- Source Status - Report detailed statistics about processed entities
- Validation - Validate RDF before ingestion with detailed error reports
Related Files
src/rdf/core/rdf_loader.py- RDF graph loadingsrc/rdf/core/ast.py- DataHub AST classessrc/rdf/entities/*/mcp_builder.py- Entity-specific MCP builderssrc/rdf/entities/registry.py- Entity registry