edmlib 2.6.1
Provides comprehensive mapping of all EDM classes and properties to Pydantic models and attributes, enabling robust data validation and serialization. Includes parsing capabilities for XML EDM files, allowing seamless conversion of XML data into Python objects for further processing and analysis. 
License: MIT
Requires Python: <4.0.0,>=3.10

# Python Library for Europeana Data Model

A Python library providing utilities for working with the **Europeana Data Model (EDM)**. This library maps all EDM classes and properties to Pydantic models, enabling type-safe validation, parsing, and serialization of EDM records.

## Important Notes

- This library is developed in the context of **[Kulturpool](https://kulturpool.at)** and is not affiliated with, endorsed by, or directly connected to Europeana.  
- Compared to the official EDM standard, there are some minor **deviations**:  
  - The fields **`dc:identifier`**, **`edm:isShownBy`**, and **`edm:isShownAt`** are **mandatory**.  

## Features

- **Validation**: Built-in validation for EDM record structure and property constraints
- **Type-safe EDM**: All EDM classes implemented as Pydantic models
- **XML/RDF parsing**: Parse EDM records from XML or RDF formats
- **RDF serialization**: Export EDM records back to RDF formats

## Quick Start

EDM specifications are encapsulated in `EDM_Record`. All data is validated at instantiation, ensuring compliance with EDM.

### Parse EDM Records

```python
from edmlib import EDM_Parser

# Parse from string
record = EDM_Parser.from_string("""<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:ore="http://www.openarchives.org/ore/terms/"
    xmlns:edm="http://www.europeana.eu/schemas/edm/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <edm:ProvidedCHO
        rdf:about="http://uri.test/edm123#CHO">
        <dc:type xml:lang="en">Text</dc:type>
        <dc:title xml:lang="de">Titel</dc:title>
        <dc:identifier>123</dc:identifier>
        <dc:language>de</dc:language>
        <edm:type>TEXT</edm:type>
    </edm:ProvidedCHO>
    <ore:Aggregation
        rdf:about="http://uri.test/edm123#Aggregation">
        <edm:aggregatedCHO
            rdf:resource="http://uri.test/edm123#CHO" />
        <edm:dataProvider>Test</edm:dataProvider>
        <edm:isShownAt
            rdf:resource="http://uri.test/edm123.jpg" />
        <edm:isShownBy
            rdf:resource="http://uri.test/edm123.jpg" />
        <edm:provider>Kulturpool</edm:provider>
        <edm:rights rdf:resource="http://creativecommons.org/licenses/by-nc-sa/4.0/" />
    </ore:Aggregation>
</rdf:RDF>
""").parse()

# Parse from file
record = EDM_Parser.from_file("edm_record.xml").parse()

# Parse other formats
record = EDM_Parser.from_file("edm_record.ttl", format="ttl").parse()
```

### Create EDM Records programmatically

```python
from edmlib import EDM_Record, EDM_ProvidedCHO, ORE_Aggregation, Ref, Lit

record = EDM_Record(
    provided_cho=EDM_ProvidedCHO(
        id=Ref(value="http://uri.test/edm123#CHO"),
        dc_type=[Lit(value="Text", lang="en")],
        dc_title=[Lit(value="Titel", lang="de")],
        dc_identifier=[Lit(value="123")],
        dc_language=[Lit(value="de")],
        edm_type=Lit(value="TEXT")
    ),
    aggregation=ORE_Aggregation(
        id=Ref(value="http://uri.test/edm123#Aggregation"),
        edm_aggregatedCHO=Ref(value="http://uri.test/edm123#CHO"),
        edm_dataProvider=Lit(value="Test"),
        edm_isShownAt=Ref(value="http://uri.test/edm123.jpg"),
        edm_isShownBy=Ref(value="http://uri.test/edm123.jpg"),
        edm_provider=Lit(value="Kulturpool"),
        edm_rights=Ref(value="http://creativecommons.org/licenses/by-nc-sa/4.0/")
    )
)
```

### Work with EDM Records

```python
from edmlib import EDM_ProvidedCHO, ORE_Aggregation, EDM_WebResource, EDM_Agent, EDM_Place, EDM_TimeSpan, SKOS_Concept, CC_License, SVCS_Service

# Access record components
assert record.provided_cho.id == Ref(value="http://uri.test/edm123#CHO")
assert record.aggregation.id == Ref(value="http://uri.test/edm123#Aggregation")
```

### Serialize

Multiple serialization formats for exporting EDM records are supported:

```python
# Pretty-XML format
xml_str = record.serialize()

# JSON-LD format
jsonld_str = record.serialize(format="json-ld")
```

All rdflib graph serialization formats are supported, including XML, Turtle (TTL), and others.


## Component Classes

- `EDM_ProvidedCHO` - Cultural Heritage Object (CHO)
- `ORE_Aggregation` - Resource aggregation
- `EDM_WebResource` - Web resources
- `EDM_Agent` - Agents (persons, organizations)
- `EDM_Place` - Places and locations
- `EDM_TimeSpan` - Time periods
- `SKOS_Concept` - Concepts and classifications
- `CC_License` - Creative Commons licenses
- `SVCS_Service` - SIOC Services

### Composition
```python
assert isinstance(          record.provided_cho,    EDM_ProvidedCHO)
assert isinstance(          record.aggregation,     ORE_Aggregation)

assert isinstance(next(iter(record.web_resource)),  EDM_WebResource) # optional
assert isinstance(next(iter(record.skos_concept)),  SKOS_Concept)    # optional
assert isinstance(next(iter(record.edm_agent)),     EDM_Agent)       # optional
assert isinstance(next(iter(record.edm_time_span)), EDM_TimeSpan)    # optional
assert isinstance(next(iter(record.edm_place)),     EDM_Place)       # optional
assert isinstance(next(iter(record.cc_license)),    CC_License)      # optional
assert isinstance(next(iter(record.svcs_service)),  SVCS_Service)    # optional
```

## Development

### Setup

```bash
# Clone repository
git clone <repository-url>

cd edmlib

# Install dependencies
poetry install

# Run tests
pytest .

# Generate API Documentation
poetry run update-api-docs
```

### Requirements

- Python >=3.10,<4.0.0
- Dependencies: 
  - rdflib ^7.0.0
  - lxml ^5.1.0
  - pydantic ^2.10.3
  - pyld ^2.0.3
  - requests ^2.32.3

<!--pdoc-start-->
## API documentation

*  [EDM_Record](#edm_record)             
    *  [provided_cho](#edm_recordprovided_cho)  
    *  [aggregation](#edm_recordaggregation)  
    *  [web_resource](#edm_recordweb_resource)  
    *  [skos_concept](#edm_recordskos_concept)  
    *  [edm_agent](#edm_recordedm_agent)  
    *  [edm_time_span](#edm_recordedm_time_span)  
    *  [edm_place](#edm_recordedm_place)  
    *  [cc_license](#edm_recordcc_license)  
    *  [svcs_service](#edm_recordsvcs_service)  
    *  [get_rdf_graph](#edm_recordget_rdf_graph)  
    *  [serialize](#edm_recordserialize)  
    *  [get_framed_json_ld](#edm_recordget_framed_json_ld)  
    *  [validate_provided_cho_identity](#edm_recordvalidate_provided_cho_identity)  
    *  [fetch_edm_isShownBy_head](#edm_recordfetch_edm_isshownby_head)  
    *  [has_edm_object](#edm_recordhas_edm_object)  
    *  [fetch_edm_object_head](#edm_recordfetch_edm_object_head)  
    *  [has_edm_hasView](#edm_recordhas_edm_hasview)  
    *  [fetch_edm_hasView_heads](#edm_recordfetch_edm_hasview_heads)  
    *  [fetch_edm_isShownAt_head](#edm_recordfetch_edm_isshownat_head)  
    *  [model_config](#edm_recordmodel_config)

*  [EDM_ProvidedCHO](#edm_providedcho)             
    *  [edm_type](#edm_providedchoedm_type)  
    *  [dc_contributor](#edm_providedchodc_contributor)  
    *  [dc_coverage](#edm_providedchodc_coverage)  
    *  [dc_creator](#edm_providedchodc_creator)  
    *  [dc_date](#edm_providedchodc_date)  
    *  [dc_description](#edm_providedchodc_description)  
    *  [dc_format](#edm_providedchodc_format)  
    *  [dc_identifier](#edm_providedchodc_identifier)  
    *  [dc_language](#edm_providedchodc_language)  
    *  [dc_publisher](#edm_providedchodc_publisher)  
    *  [dc_relation](#edm_providedchodc_relation)  
    *  [dc_rights](#edm_providedchodc_rights)  
    *  [dc_source](#edm_providedchodc_source)  
    *  [dc_subject](#edm_providedchodc_subject)  
    *  [dc_title](#edm_providedchodc_title)  
    *  [dc_type](#edm_providedchodc_type)  
    *  [dcterms_alternative](#edm_providedchodcterms_alternative)  
    *  [dcterms_conformsTo](#edm_providedchodcterms_conformsto)  
    *  [dcterms_created](#edm_providedchodcterms_created)  
    *  [dcterms_extent](#edm_providedchodcterms_extent)  
    *  [dcterms_hasFormat](#edm_providedchodcterms_hasformat)  
    *  [dcterms_hasPart](#edm_providedchodcterms_haspart)  
    *  [dcterms_hasVersion](#edm_providedchodcterms_hasversion)  
    *  [dcterms_isFormatOf](#edm_providedchodcterms_isformatof)  
    *  [dcterms_isPartOf](#edm_providedchodcterms_ispartof)  
    *  [dcterms_isReferencedBy](#edm_providedchodcterms_isreferencedby)  
    *  [dcterms_isReplacedBy](#edm_providedchodcterms_isreplacedby)  
    *  [dcterms_isRequiredBy](#edm_providedchodcterms_isrequiredby)  
    *  [dcterms_issued](#edm_providedchodcterms_issued)  
    *  [dcterms_isVersionOf](#edm_providedchodcterms_isversionof)  
    *  [dcterms_medium](#edm_providedchodcterms_medium)  
    *  [dcterms_provenance](#edm_providedchodcterms_provenance)  
    *  [dcterms_references](#edm_providedchodcterms_references)  
    *  [dcterms_replaces](#edm_providedchodcterms_replaces)  
    *  [dcterms_requires](#edm_providedchodcterms_requires)  
    *  [dcterms_spatial](#edm_providedchodcterms_spatial)  
    *  [dcterms_tableOfContents](#edm_providedchodcterms_tableofcontents)  
    *  [dcterms_temporal](#edm_providedchodcterms_temporal)  
    *  [edm_currentLocation](#edm_providedchoedm_currentlocation)  
    *  [edm_hasMet](#edm_providedchoedm_hasmet)  
    *  [edm_hasType](#edm_providedchoedm_hastype)  
    *  [edm_incorporates](#edm_providedchoedm_incorporates)  
    *  [edm_isDerivativeOf](#edm_providedchoedm_isderivativeof)  
    *  [edm_isNextInSequence](#edm_providedchoedm_isnextinsequence)  
    *  [edm_isRelatedTo](#edm_providedchoedm_isrelatedto)  
    *  [edm_isRepresentationOf](#edm_providedchoedm_isrepresentationof)  
    *  [edm_isSimilarTo](#edm_providedchoedm_issimilarto)  
    *  [edm_isSuccessorOf](#edm_providedchoedm_issuccessorof)  
    *  [edm_realizes](#edm_providedchoedm_realizes)  
    *  [owl_sameAs](#edm_providedchoowl_sameas)  
    *  [validate_dependent_edm](#edm_providedchovalidate_dependent_edm)  
    *  [model_config](#edm_providedchomodel_config)

*  [ORE_Aggregation](#ore_aggregation)             
    *  [edm_aggregatedCHO](#ore_aggregationedm_aggregatedcho)  
    *  [edm_dataProvider](#ore_aggregationedm_dataprovider)  
    *  [edm_provider](#ore_aggregationedm_provider)  
    *  [edm_rights](#ore_aggregationedm_rights)  
    *  [edm_hasView](#ore_aggregationedm_hasview)  
    *  [edm_isShownAt](#ore_aggregationedm_isshownat)  
    *  [edm_isShownBy](#ore_aggregationedm_isshownby)  
    *  [edm_object](#ore_aggregationedm_object)  
    *  [dc_rights](#ore_aggregationdc_rights)  
    *  [edm_ugc](#ore_aggregationedm_ugc)  
    *  [edm_intermediateProvider](#ore_aggregationedm_intermediateprovider)  
    *  [validate_conditional_attributes](#ore_aggregationvalidate_conditional_attributes)  
    *  [model_config](#ore_aggregationmodel_config)

*  [EDM_WebResource](#edm_webresource)             
    *  [dc_creator](#edm_webresourcedc_creator)  
    *  [dc_description](#edm_webresourcedc_description)  
    *  [dc_format](#edm_webresourcedc_format)  
    *  [dc_rights](#edm_webresourcedc_rights)  
    *  [dc_source](#edm_webresourcedc_source)  
    *  [dc_type](#edm_webresourcedc_type)  
    *  [dcterms_conformsTo](#edm_webresourcedcterms_conformsto)  
    *  [dcterms_created](#edm_webresourcedcterms_created)  
    *  [dcterms_extent](#edm_webresourcedcterms_extent)  
    *  [dcterms_hasPart](#edm_webresourcedcterms_haspart)  
    *  [dcterms_isFormatOf](#edm_webresourcedcterms_isformatof)  
    *  [dcterms_isPartOf](#edm_webresourcedcterms_ispartof)  
    *  [dcterms_isReferencedBy](#edm_webresourcedcterms_isreferencedby)  
    *  [dcterms_issued](#edm_webresourcedcterms_issued)  
    *  [edm_isNextInSequence](#edm_webresourceedm_isnextinsequence)  
    *  [edm_rights](#edm_webresourceedm_rights)  
    *  [owl_sameAs](#edm_webresourceowl_sameas)  
    *  [svcs_has_service](#edm_webresourcesvcs_has_service)  
    *  [validate_web_resource](#edm_webresourcevalidate_web_resource)  
    *  [model_config](#edm_webresourcemodel_config)

*  [CC_License](#cc_license)             
    *  [odrl_inheritFrom](#cc_licenseodrl_inheritfrom)  
    *  [cc_deprecatedOn](#cc_licensecc_deprecatedon)  
    *  [model_config](#cc_licensemodel_config)

*  [SKOS_Concept](#skos_concept)             
    *  [skos_prefLabel](#skos_conceptskos_preflabel)  
    *  [skos_altLabel](#skos_conceptskos_altlabel)  
    *  [skos_broader](#skos_conceptskos_broader)  
    *  [skos_narrower](#skos_conceptskos_narrower)  
    *  [skos_related](#skos_conceptskos_related)  
    *  [skos_broadMatch](#skos_conceptskos_broadmatch)  
    *  [skos_narrowMatch](#skos_conceptskos_narrowmatch)  
    *  [skos_relatedMatch](#skos_conceptskos_relatedmatch)  
    *  [skos_exactMatch](#skos_conceptskos_exactmatch)  
    *  [skos_closeMatch](#skos_conceptskos_closematch)  
    *  [skos_note](#skos_conceptskos_note)  
    *  [skos_notation](#skos_conceptskos_notation)  
    *  [skos_inScheme](#skos_conceptskos_inscheme)  
    *  [validate_skos_pref_label](#skos_conceptvalidate_skos_pref_label)  
    *  [model_config](#skos_conceptmodel_config)

*  [EDM_Agent](#edm_agent)             
    *  [skos_prefLabel](#edm_agentskos_preflabel)  
    *  [skos_altLabel](#edm_agentskos_altlabel)  
    *  [skos_note](#edm_agentskos_note)  
    *  [dc_date](#edm_agentdc_date)  
    *  [dc_identifier](#edm_agentdc_identifier)  
    *  [dcterms_hasPart](#edm_agentdcterms_haspart)  
    *  [dcterms_isPartOf](#edm_agentdcterms_ispartof)  
    *  [edm_begin](#edm_agentedm_begin)  
    *  [edm_end](#edm_agentedm_end)  
    *  [edm_hasMet](#edm_agentedm_hasmet)  
    *  [edm_isRelatedTo](#edm_agentedm_isrelatedto)  
    *  [foaf_name](#edm_agentfoaf_name)  
    *  [rdagr2_biographicalInformation](#edm_agentrdagr2_biographicalinformation)  
    *  [rdagr2_dateOfBirth](#edm_agentrdagr2_dateofbirth)  
    *  [rdagr2_dateOfDeath](#edm_agentrdagr2_dateofdeath)  
    *  [rdagr2_dateOfEstablishment](#edm_agentrdagr2_dateofestablishment)  
    *  [rdagr2_dateOfTermination](#edm_agentrdagr2_dateoftermination)  
    *  [rdagr2_gender](#edm_agentrdagr2_gender)  
    *  [rdagr2_placeOfBirth](#edm_agentrdagr2_placeofbirth)  
    *  [rdagr2_placeOfDeath](#edm_agentrdagr2_placeofdeath)  
    *  [rdagr2_professionOrOccupation](#edm_agentrdagr2_professionoroccupation)  
    *  [owl_sameAs](#edm_agentowl_sameas)  
    *  [validate_skos_pref_label](#edm_agentvalidate_skos_pref_label)  
    *  [model_config](#edm_agentmodel_config)

*  [EDM_TimeSpan](#edm_timespan)             
    *  [skos_prefLabel](#edm_timespanskos_preflabel)  
    *  [skos_altLabel](#edm_timespanskos_altlabel)  
    *  [skos_note](#edm_timespanskos_note)  
    *  [dcterms_hasPart](#edm_timespandcterms_haspart)  
    *  [dcterms_isPartOf](#edm_timespandcterms_ispartof)  
    *  [edm_begin](#edm_timespanedm_begin)  
    *  [edm_end](#edm_timespanedm_end)  
    *  [edm_isNextInSequence](#edm_timespanedm_isnextinsequence)  
    *  [owl_sameAs](#edm_timespanowl_sameas)  
    *  [validate_skos_pref_label](#edm_timespanvalidate_skos_pref_label)  
    *  [model_config](#edm_timespanmodel_config)

*  [EDM_Place](#edm_place)             
    *  [wgs84_pos_lat](#edm_placewgs84_pos_lat)  
    *  [wgs84_pos_long](#edm_placewgs84_pos_long)  
    *  [wgs84_pos_alt](#edm_placewgs84_pos_alt)  
    *  [skos_prefLabel](#edm_placeskos_preflabel)  
    *  [skos_altLabel](#edm_placeskos_altlabel)  
    *  [skos_note](#edm_placeskos_note)  
    *  [dcterms_hasPart](#edm_placedcterms_haspart)  
    *  [dcterms_isPartOf](#edm_placedcterms_ispartof)  
    *  [edm_isNextInSequence](#edm_placeedm_isnextinsequence)  
    *  [owl_sameAs](#edm_placeowl_sameas)  
    *  [validate_skos_pref_label](#edm_placevalidate_skos_pref_label)  
    *  [model_config](#edm_placemodel_config)

*  [SVCS_Service](#svcs_service)             
    *  [dcterms_conformsTo](#svcs_servicedcterms_conformsto)  
    *  [doap_implements](#svcs_servicedoap_implements)  
    *  [model_config](#svcs_servicemodel_config)

*  [MixedValuesList](#mixedvalueslist)  
*  [EDM_Parser](#edm_parser)             
    *  [EDM_Parser](#edm_parser__init__)  
    *  [from_file](#edm_parserfrom_file)  
    *  [from_string](#edm_parserfrom_string)  
    *  [graph](#edm_parsergraph)  
    *  [get_single_ref](#edm_parserget_single_ref)  
    *  [get_many_ref](#edm_parserget_many_ref)  
    *  [get_triples](#edm_parserget_triples)  
    *  [get_aggregation](#edm_parserget_aggregation)  
    *  [get_webresources](#edm_parserget_webresources)  
    *  [get_instance_triples](#edm_parserget_instance_triples)  
    *  [parse_single_class](#edm_parserparse_single_class)  
    *  [parse_many_class](#edm_parserparse_many_class)  
    *  [parse](#edm_parserparse)

*  [Ref](#ref)             
    *  [value](#refvalue)  
    *  [is_ref](#refis_ref)  
    *  [validate_value_as_uri](#refvalidate_value_as_uri)  
    *  [to_rdflib](#refto_rdflib)  
    *  [model_config](#refmodel_config)

*  [Lit](#lit)             
    *  [value](#litvalue)  
    *  [lang](#litlang)  
    *  [datatype](#litdatatype)  
    *  [normalize](#litnormalize)  
    *  [validate_consistency](#litvalidate_consistency)  
    *  [to_rdflib](#litto_rdflib)  
    *  [model_config](#litmodel_config)





---
### EDM_Record
```python
class EDM_Record(pydantic.main.BaseModel):
``` 



<div class="docstring"><p>Pydantic model representing an edm record, as a fully typed structure.
All contained non-standard types are themselves BaseModels, and the fields are always also either BaseModels or
standard-types. This ensures that without further conversion, an instance of this class can be
dumped as a dict (or json) and restored from such a dict (or json).</p>

<p>Validation:
This model is responsible for validating the overall structure, order and completeness
of the record.
The individual models for each of its properties are responsible for validating their own attributes –
their completeness, cardinality and structure.
Finally, the special type models - Ref and Lit - within those container types are responsible for validating
the indiviudal values.</p>
</div> 

#### EDM_Record.provided_cho
```python
provided_cho: edmlib.edm.classes.core.EDM_ProvidedCHO
```





#### EDM_Record.aggregation
```python
aggregation: edmlib.edm.classes.core.ORE_Aggregation
```





#### EDM_Record.web_resource
```python
web_resource: Optional[List[edmlib.edm.classes.core.EDM_WebResource]]
```





#### EDM_Record.skos_concept
```python
skos_concept: Optional[List[edmlib.edm.classes.context.SKOS_Concept]]
```





#### EDM_Record.edm_agent
```python
edm_agent: Optional[List[edmlib.edm.classes.context.EDM_Agent]]
```





#### EDM_Record.edm_time_span
```python
edm_time_span: Optional[List[edmlib.edm.classes.context.EDM_TimeSpan]]
```





#### EDM_Record.edm_place
```python
edm_place: Optional[List[edmlib.edm.classes.context.EDM_Place]]
```





#### EDM_Record.cc_license
```python
cc_license: Optional[List[edmlib.edm.classes.context.CC_License]]
```





#### EDM_Record.svcs_service
```python
svcs_service: Optional[List[edmlib.edm.classes.service.SVCS_Service]]
```





#### EDM_Record.get_rdf_graph
```python
def get_rdf_graph(self)
```



<div class="docstring"><p>Return whole record as as an RDF - rdflib.Graph object.</p>
</div> 

#### EDM_Record.serialize
```python
def serialize(self, format: str = 'pretty-xml', max_depth: int = 1) -> str
```



<div class="docstring"><p>Serialize graph to rdf/xml with pretty-formatting.</p>
</div> 

#### EDM_Record.get_framed_json_ld
```python
def get_framed_json_ld(self)
```





#### EDM_Record.validate_provided_cho_identity
```python
@model_validator(mode='after') def validate_provided_cho_identity(self) -> Self
```





#### EDM_Record.fetch_edm_isShownBy_head
```python
def fetch_edm_isShownBy_head(self, **kwargs) -> requests.models.Response
```





#### EDM_Record.has_edm_object
```python
def has_edm_object(self) -> bool
```





#### EDM_Record.fetch_edm_object_head
```python
def fetch_edm_object_head(self, **kwargs) -> requests.models.Response
```





#### EDM_Record.has_edm_hasView
```python
def has_edm_hasView(self) -> bool
```





#### EDM_Record.fetch_edm_hasView_heads
```python
def fetch_edm_hasView_heads(self, **kwargs) -> list[requests.models.Response]
```





#### EDM_Record.fetch_edm_isShownAt_head
```python
def fetch_edm_isShownAt_head(self, **kwargs) -> requests.models.Response
```





#### EDM_Record.model_config
```python
model_config: ClassVar[pydantic.config.ConfigDict] = {}
```



<div class="docstring"><p>Configuration for the model, should be a dictionary conforming to [<code>ConfigDict</code>][pydantic.config.ConfigDict].</p>
</div> 


---

---
### EDM_ProvidedCHO
```python
class EDM_ProvidedCHO(edmlib.edm.base.EDM_BaseClass):
``` 



<div class="docstring"><p>mandatory-properties: DC_description, DC_language, DC_subject, DC_title, DC_type, DCTERMS_spatial, DCTERMS_temporal, EDM_type</p>

<p>optional-properties: DC_coverage, DC_format, DC_relation, DC_rights, DCTERMS_conformsTo, DCTERMS_extent, DCTERMS_hasFormat, DCTERMS_hasPart, DCTERMS_hasVersion, DCTERMS_isFormatOf, DCTERMS_isReferencedBy, DCTERMS_isReplacedBy, DCTERMS_isRequiredBy, DCTERMS_isVersionOf, DCTERMS_medium, DCTERMS_provenance, DCTERMS_references, DCTERMS_replaces, DCTERMS_requires, DCTERMS_tableOfContents , EDM_currentLocation, EDM_hasMet, EDM_hasType, EDM_incorporates, EDM_isDerivativeOf, EDM_isRelatedTo, EDM_isRepresentationOf, EDM_isSimilarTo, EDM_isSuccessorOf, EDM_realizes, OWL_sameAs</p>

<p>recommended-properties: DC_contributor, DC_creator, DC_date, DC_identifier, DC_publisher, DC_source, DCTERMS_alternative, DCTERMS_created, DCTERMS_isPartOf, DCTERMS_issued, EDM_IsNextInSequence</p>
</div> 

#### EDM_ProvidedCHO.edm_type
```python
edm_type: edmlib.edm.value_types.Lit
```



<div class="docstring"><p>Mandate: 
mandatory</p>

<p>Cardinality: 
exactly_one</p>

<p>Value-Type:
Lit</p>

<p>Description: </p>

<p>The value must be one of the types accepted by Europeana as it will support portal fun
ctionality: TEXT, VIDEO, SOUND, IMAGE, 3D. (For 3D, when applicable, use the value “3D
‐PDF” in dc:format ) <code>&lt;edm:type&gt;IMAGE&lt;/edm:type&gt;</code> (upper-­case &amp; case sensitive) <code>&lt;edm:ty
pe&gt;3D&lt;/edm:type&gt;</code> (upper-­case &amp; case sensitive)</p>
</div> 

#### EDM_ProvidedCHO.dc_contributor
```python
dc_contributor: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
recommended</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>Use for contributors to the CHO. If possible supply the identifier of the contributor 
from an authority source. Providers with richer role terms can elect to map a subset t
o dc:contributor and others to dc:creator. Repeat for multiple contributors. <code>&lt;dc:contr
ibutor&gt;Maria Callas&lt;/dc:contributor&gt;</code> or create a reference to an instance of the Agent
class <code>&lt;dc:contributor rdf:resource=“http://www.example.com/MariaCallas”&gt;</code>For recommend
ations on medata quality see Tier A-C requirements ,</p>
</div> 

#### EDM_ProvidedCHO.dc_coverage
```python
dc_coverage: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>The spatial or temporal topic of the CHO. Use the more precise dcterms:spatial or dcte
rms:temporal properties if the data will support it. <code>&lt;dc:coverage&gt;1995-­1996&lt;/dc:cover
age&gt;</code> or <code>&lt;dc:coverage&gt;Berlin&lt;/dc:coverage&gt;</code> or create a reference to an instance of a co
ntextual class, for example, a Place class <code>&lt;dc:coverage rdf:resource=“https://sws.geon
ames.org/2950159/ ”/&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dc_creator
```python
dc_creator: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
recommended</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>For the creator of the CHO. If possible supply the identifier of the creator from an a
uthority source. Repeat for multiple creators.  <code>&lt;dc:creator&gt;Shakespeare, William&lt;/dc:c
reator&gt;</code> or create a reference to an instance of the Agent class <code>&lt;dc:creator rdf:resour
ce=“http://viaf.org/viaf/96994048”/&gt;</code>For recommendations on medata quality see Tier A-C
requirements .</p>
</div> 

#### EDM_ProvidedCHO.dc_date
```python
dc_date: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
recommended</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>Use for a significant date in the life of the CHO.  Europeana recommends date conformi
ng to ISO 8601 starting with the year and with hyphens (YYYY-­MM-DD). NB: other EDM el
ements are relevant for expressing dates of different events in the life of the CHO: d
cterms:temporal, dcterms:created and dcterms:issued. Be careful and choose the most ap
propriate one! <code>&lt;dc:date&gt;Early 20th century&lt;/dc:date&gt;</code> or <code>&lt;dc:date&gt;1919&lt;/dc:date&gt;</code> or cre
ate a reference to an instance of the TimeSpan class <code>&lt;dc:date rdf:resource=“http://sem
ium.org/time/19xx_1_third”/&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dc_description
```python
dc_description: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
mandatory</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>A description of the CHO. If there is no dc:description for an object, there must be a
dc:title. If both are  available, provide both. <code>&lt;dc:description&gt;Illustrated guide to 
airport markings and lighting signals, with particular reference to SMGCS  (Surface Mo
vement Guidance and Control System) for airports with low visibility conditions.&lt;/dc:d
escription&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dc_format
```python
dc_format: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>Use for the terms generally applied to indicate the format of the cultural heritage ob
ject or the file format of a born digital object. Use the value “3D-­PDF” if appropria
te. <code>&lt;dc:format&gt;paper&lt;/dc:format&gt;</code>For recommendations on medata quality see Tier A-C req
uirements .</p>
</div> 

#### EDM_ProvidedCHO.dc_identifier
```python
dc_identifier: List[edmlib.edm.value_types.Lit]
```



<div class="docstring"><p>Mandate: 
recommended</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[List[Lit]]</p>

<p>Description: </p>

<p>An identifier of the original CHO. <code>&lt;dc:identifier&gt;RP-­T-­1952-­380&lt;/dc:identifier&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dc_language
```python
dc_language: Optional[List[edmlib.edm.value_types.Lit]]
```



<div class="docstring"><p>Mandate: 
mandatory</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[List[Lit]]</p>

<p>Description: </p>

<p>The language of text CHOs and also for other types of CHO if there is a language aspec
t. Mandatory for TEXT objects, strongly recommended for other object types with a lang
uage element. Best practice is to use ISO 639 two- or three-letter primary language ta
gs.Repeat for multiple languages. We also recommend the use of the ISO 639-­2 code for
no linguistic content (ZXX).</p>
</div> 

#### EDM_ProvidedCHO.dc_publisher
```python
dc_publisher: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
recommended</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>The name of the publisher of the CHO. If possible supply the identifier of the publish
er from an authority source. <code>&lt;dc:publisher&gt;Oxford University Press&lt;/dc:publisher&gt;</code> or c
reate a reference to an instance of the Agent class <code>&lt;dc:publisher rdf:resource=“http:/
/www.oup.com/”/&gt;</code>For recommendations on medata quality see Tier A-C requirements .</p>
</div> 

#### EDM_ProvidedCHO.dc_relation
```python
dc_relation: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>The name or identifier of a related resource, generally used for other related CHOs. C
f edm:isRelatedTo. <code>&lt;dc:relation&gt;maps.crace.1/33&lt;/dc:relation&gt;</code> (Shelf mark) Or to provi
de a link to another object: <code>&lt;dc:relation rdf:resource=“http://www.identifier/relatedO
bject”/&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dc_rights
```python
dc_rights: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>Use to give the name of the rights holder of the CHO if possible or for more general r
ights information. (Note that the controlled edm:rights property relates to the digita
l objects and applies to the edm:WebResource and/or edm:Aggregation). <code>&lt;dc:rights&gt;Copyr
ight © British Library Board&lt;/dc:rights&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dc_source
```python
dc_source: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
recommended</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>A related resource from which the described resource is derived in whole or in part i.
e. the source of the original CHO.  (Not the name of the content holder: for this see 
edm:dataProvider.) <code>&lt;dc:source&gt;Security Magazine pp 3-12&lt;/dc:source&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dc_subject
```python
dc_subject: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
mandatory</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>The subject of the CHO.One of dc:subject or dc:type or dcterms:spatial or dcterms:temp
oral must be  provided; if more than one of these properties is available, please prov
ide them all. High-­level dc:subject  values like 'archaeology' are allowed, especiall
y when there is no other subject that can be easily filled in. <code>&lt;dc:subject&gt;archeology&lt;
/dc:subject&gt;</code>or create a reference to an instance of the Concept class <code>&lt;skos:Concept rd
f:about="http://semantics.gr/authorities/ekt-unesco/560215094"&gt;   &lt;skos:prefLabel xml:
lang="el"&gt;Αρχαιολογία&lt;/skos:prefLabel&gt;   &lt;skos:prefLabel xml:lang="en"&gt;Archaeology&lt;/sk
os:prefLabel&gt;&lt;/skos:Concept&gt;</code>For recommendations on medata quality see Tier A-C require
ments .</p>
</div> 

#### EDM_ProvidedCHO.dc_title
```python
dc_title: Optional[List[edmlib.edm.value_types.Lit]]
```



<div class="docstring"><p>Mandate: 
mandatory</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[List[Lit]]</p>

<p>Description: </p>

<p>A name given to the CHO. dc:title should be present; but if there is no dc:title avail
able, it is acceptable to have dc:description instead. dc:title and dc:description sho
uld be distinct. Exact translations of the title can be  provided using appropriate xm
l language attributes. <code>&lt;dc:title xml:lang=“en”&gt;Eight Weeks&lt;/dc:title&gt; &lt;dc:title xml:la
ng=“it”&gt;Ocho semanas&lt;/ dc:title&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dc_type
```python
dc_type: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
mandatory</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>The nature or genre of the CHO. Ideally the term(s) will be taken from a controlled vo
cabulary. One of dc:type or dc:subject or dcterms:spatial or dcterms:temporal must be 
provided; if more than one of these properties is available, please provide them all. 
dc:type should not be (strictly) identical to edm:type. <code>&lt;dc:type&gt;Book&lt;/dc:type&gt;</code> or <code>&lt;dc
:type&gt;trombone&lt;/dc:type&gt;</code> or create a reference to an instance of the Concept class <code>&lt;dc
:type rdf:resource=“http://www.mimo-­db.eu/HornbostelAndSachs/356/”&gt;</code>For recommendation
s on medata quality see Tier A-C requirements .</p>
</div> 

#### EDM_ProvidedCHO.dcterms_alternative
```python
dcterms_alternative: Optional[List[edmlib.edm.value_types.Lit]]
```



<div class="docstring"><p>Mandate: 
recommended</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[List[Lit]]</p>

<p>Description: </p>

<p>Any alternative title of the CHO including abbreviations or translations that may not 
be exact. <code>&lt;dcterms:alternativexml:lang=“en”&gt;Eight weeks: a novel&lt;/dcterms:alternative&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dcterms_conformsTo
```python
dcterms_conformsTo: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>An established standard to which the CHO conforms. <code>&lt;dcterms:conformsTo&gt;W3C WCAG 2.0&lt;/d
cterms:conformsTo&gt;</code> (conforms to web content accessibility guidelines). Or link to the 
resource <code>&lt;dcterms:conformsTo rdf:resource=“http://www.w3.org/TR/WCAG/”/&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dcterms_created
```python
dcterms_created: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
recommended</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>The date of creation of the CHO. Europeana recommends date conforming to ISO 8601 star
ting with the year and with hyphens (YYYY-­MM-DD). NB: other EDM elements are relevant
for expressing dates of different events in the life of the CHO: dc:date, dcterms:tem
poral and dcterms:issued. Be careful and choose the most appropriate one! <code>&lt;dcterms:cre
ated&gt;Mid 16th century&lt;/dcterms:created&gt;</code> or <code>&lt;dcterms:created&gt;1584&lt;/dcterms:created&gt;</code> or 
create a reference to an instance of the TimeSpan class<code>&lt;dcterms:created rdf:resource=“
http://semium.org/time/15xx_3_third”/&gt;</code>For recommendations on medata quality see Tier A
-C requirements .</p>
</div> 

#### EDM_ProvidedCHO.dcterms_extent
```python
dcterms_extent: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>The size or duration of the CHO. <code>&lt;dcterms:extent&gt;13 cm&lt;/dcterms:extent&gt;</code> (the width of 
an original object). <code>&lt;dcterms:extent&gt;34 minutes&lt;/dcterms:extent&gt;</code> (the duration of an a
udio file)</p>
</div> 

#### EDM_ProvidedCHO.dcterms_hasFormat
```python
dcterms_hasFormat: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>A resource related to the CHO that is substantially the same as the CHO but in another
format. <code>&lt;dcterms:hasFormat&gt;http://upload.wikimedia.org/wikipedia/en/f/f3/Europeana_lo
go.png&lt;/dcterms:hasFormat&gt;</code> for a png image file of the described tiff resource Or as a
link to a resource <code>&lt;dcterms:hasFormat rdf:resource=“http://upload.wikimedia.org/wikip
edia/en/f/f3/Europeana_logo.png’’/&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dcterms_hasPart
```python
dcterms_hasPart: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>A resource that is included either physically or logically in the CHO. It is possible 
to use either dcterms:isPartOf or dcterms:hasPart to express relation between objects 
in a hierarchy. However in many cases (especially when a parent object has many childr
en) it is preferable to use dcterms:isPartOf. <code>&lt;dcterms:hasPart&gt;Vol.2. Issue 1&lt;/dcterms
:hasPart&gt;</code></p>
</div> 

#### EDM_ProvidedCHO.dcterms_hasVersion
```python
dcterms_hasVersion: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>Another, later resource that is a version, edition or adaptation of the CHO demonstrat
ing substantive changes in content rather than format. <code>&lt;dcterms:hasVersion&gt;The Sorcere
r’s Apprentice (translation by Edwin Zeydel, 1955)&lt;/dcterms:hasVersion&gt;</code> In this exampl
e the 1955 translation is a version of the described resource.</p>
</div> 

#### EDM_ProvidedCHO.dcterms_isFormatOf
```python
dcterms_isFormatOf: Union[List[Union[edmlib.edm.value_types.Lit, edmlib.edm.value_types.Ref]], List[edmlib.edm.value_types.Ref], List[edmlib.edm.value_types.Lit], NoneType]
```



<div class="docstring"><p>Mandate: 
optional</p>

<p>Cardinality: 
zero_to_many</p>

<p>Value-Type:
Optional[MixedValuesList]</p>

<p>Description: </p>

<p>Another resource that is substantially the same as the CHO but in another format. <code>&lt;dct
erms:isFormatOf&gt;Europeana_logo.tiff&lt;/dcterms:isFormatOf&gt;</code> where the resource being desc
ribed is a png image file</p>
</div> 

#### EDM_ProvidedCHO.dcterms_isPartOf
```python
dcterms_isPartOf: Union[List[Unio