Packages

A framework for services over RDF repositories based on the DCAT-R vocabulary.

Current section

Files

Jump to
dcatr lib dcatr.ex
Raw

lib/dcatr.ex

defmodule DCATR do
@moduledoc """
A framework for services over RDF repositories that implements the DCAT-R specification.
## What is DCAT-R?
[DCAT-R](https://w3id.org/dcatr) (DCAT for RDF Repositories) is an OWL vocabulary extending DCAT 3
for representing RDF datasets as hierarchical catalog structures.
It is designed primarily for building specialized RDF repository services - systems that provide
operations (versioning, validation, inference, API access) over datasets.
While DCAT-R can also be useful for simpler use cases like cataloging or organizing read-only data,
its full power emerges when extended to create custom service types with domain-specific operations
and supporting infrastructure.
**How does DCAT-R extend DCAT?**
1. **Domain specialization**: While DCAT is designed for cataloging data generally, DCAT-R applies
DCAT's catalog model specifically to **RDF 1.1 datasets** - cataloging the individual graphs
within RDF datasets rather than arbitrary data files.
2. **Service as configuration**: While DCAT treats `dcat:DataService` primarily as a catalogable
metadata object, DCAT-R uses it as **configuration for implementing services**. A DCAT-R service
is not just described by metadata; it IS the runtime configuration that service implementations
use to provide operations.
## Core Concepts
DCAT-R organizes RDF repositories through a **multi-layer catalog hierarchy**:
![DCAT-R Overview](https://dcat-r.github.io/spec/diagrams/overview.svg)
### Service Layer
The **operations layer** - what you can DO with the data. Services define and implement operations
like querying, committing changes, validating, or transforming data. A service aggregates both
distributable repository data and local instance-specific configuration.
See `DCATR.Service` for details.
### Repository Layer
The **distributable data catalog** - global/static content that can be replicated across service
instances. Contains the dataset (user data) plus metadata and optional distributed system graphs
(e.g., history, provenance, shared indexes).
See `DCATR.Repository` for details.
### ServiceData Layer
The **local data catalog** - instance-specific data that is never distributed. Contains service
manifests (configuration), working graphs (temporary/draft data), and optional local system
graphs (e.g., caches, logs, local indexes).
See `DCATR.ServiceData` for details.
### Dataset Layer
The **pure user data catalog** - free from operational concerns. A dataset is simply a catalog
of data graphs, always contained within a repository and always distributed.
See `DCATR.Dataset` for details.
## Graph Taxonomy
DCAT-R defines a complete taxonomy of graph types. Every graph belongs to **exactly one** of four
disjoint classes:
### DataGraph
Primary user data - the actual content of the dataset. Always contained in the dataset catalog,
always distributed with the repository.
See `DCATR.DataGraph` for details.
### ManifestGraph
Configuration that DCAT-R understands and processes. Contains DCAT-R-specific metadata like
graph name mappings and service settings. Two concrete types:
- **RepositoryManifestGraph**: Repository metadata (distributed)
- **ServiceManifestGraph**: Service configuration (local)
See `DCATR.ManifestGraph` for details.
### SystemGraph
Infrastructure data supporting service operations. Can be deployed in two modes:
- **Distributed** (in Repository): History, provenance, shared indexes
- **Local** (in ServiceData): Caches, logs, local indexes
See `DCATR.SystemGraph` for details.
### WorkingGraph
Temporary/draft data for service-local operations. Always in ServiceData, never distributed.
Analogous to a working directory in version control systems.
See `DCATR.WorkingGraph` for details.
### Primary Graph
DCAT-R supports designating a **primary graph** in two ways:
- `dcatr:repositoryDataGraph` - for single-graph repositories (provides both containment and designation)
- `dcatr:repositoryPrimaryGraph` - for multi-graph repositories (pure designator, no containment)
See `DCATR.Repository` for details.
## Manifest System
Services are typically loaded from RDF manifest files via `DCATR.Manifest`, which provides
hierarchical, environment-aware configuration loading. See `DCATR.Manifest` for details.
## Extending DCAT-R
DCAT-R provides extension points for building specialized service types, from simple cataloging
to complex operational services.
The framework is designed primarily for the latter - building specialized services - but remains
useful for simpler cases without extension.
### Extension Pattern
When building specialized services, the extension pattern is:
1. **Define operations** - What can users DO with the data? (commit, validate, transform, query, etc.)
2. **Define SystemGraphs** - What infrastructure do operations need? (history, caches, indexes, etc.)
3. **Implement via Type behaviours** - Custom types for Service, Repository, and/or ServiceData
**Example**: A versioning service (like Ontogen) defines commit operations, which require history
graphs (distributed SystemGraphs). A validation service defines validation operations, which may
need validation report graphs (could be distributed or local).
The complete technical pattern is documented in `DCATR.Service.Type`.
### Key Extension Points
- **`DCATR.Service.Type`** - Define service operations and override repository/service-data types
- **`DCATR.Repository.Type`** - Add distributed SystemGraphs for repository-level infrastructure
- **`DCATR.ServiceData.Type`** - Add local SystemGraphs for instance-specific infrastructure
- **`DCATR.GraphResolver`** - Custom graph selectors via `resolve_graph_selector/2`
## Further Reading
- [DCAT-R specification](https://w3id.org/dcatr) - Formal specification
- [DCAT-R term reference](https://dcat-r.github.io/spec/terms/) - Vocabulary term definitions
"""
import RDF.Namespace
act_as_namespace DCATR.NS.DCATR
@doc """
Returns the configured manifest type for the application.
Applications with custom manifest types (implementing `DCATR.Manifest.Type`) can set
this in their config to use their manifest type as the default in tasks like `mix dcatr.init`.
## Example
# config/config.exs
config :dcatr, :manifest_type, MyApp.Manifest
"""
def manifest_type, do: Application.get_env(:dcatr, :manifest_type, DCATR.Manifest)
defdelegate manifest(opts \\ []), to: DCATR.Manifest
defdelegate manifest!(opts \\ []), to: DCATR.Manifest
defdelegate service(opts \\ []), to: DCATR.Manifest
defdelegate service!(opts \\ []), to: DCATR.Manifest
defdelegate repository(opts \\ []), to: DCATR.Manifest
defdelegate repository!(opts \\ []), to: DCATR.Manifest
end