Dublin Core to BIBFRAME Map
With Dublin Core being one of the most widespread metadata vocabularies in
use, creating an RDF mapping between Dublin Core and BIBFRAME was
relatively straight-forward and is available as an XML mapping dc-to-bf.ttl
rules
file. But for this example, we are going to illustrate a rather common
occurrence of a person creating metadata in a spreadsheet with the column names
being the Dulin Core field name and each row being the metadata for an object.
Here is a sample of small spreadsheet with ten rows
with the first row being the field names. We will first import the standard
Python csv
module and using the DictReader
class instance for our sample.
>>> import csv
>>> dc_reader = csv.DictReader(open("/Path/to/dc/data/dc-sample.csv"))
As spreadsheets do not have a set structure, most of the time you'll have to
create a new RML rules file for the record load. For this example, we will
use an older RML rules file for an early Denver Public Library's CSV file called
dpl-csv.ttl. Since this custom RML file is a standard
mapping, it isn't included the bibcat
module distribution, therefore, when we
create the CSVRowProcessor
instance, we'll need to include the full path and name
of this RML file.
>>> dc_processor = processor.CSVRowProcessor(
rml_rules=['bibcat-base.ttl',
'/Path/to/dpl/dpl-csv.ttl'])
After extract the first row in the spreadsheet and minting a new instance IRI, we will run the RML mapping to convert to row to BIBFRAME 2.0 RDF:
>>> row_one = next(dc_reader)
>>> import uuid
>>> instance_iri = "https://www.denverlibrary.org/{}".format(uuid.uuid1())
>>> instance_iri
'https://www.denverlibrary.org/57154f74-c5cb-11e7-9f30-ac87a3129ce6'
>>> dc_processor.run(row_one,
instance_iri=instance_iri)
Printing the CSVRowProcessor.output
RDF graph results in:
>>> print(dc_processor.output.serialize(format='turtle').decode())
@prefix bf: <http://id.loc.gov/ontologies/bibframe/> . @prefix dcterms: <http://purl.org/dc/terms/> . @prefix prov: <http://www.w3.org/ns/prov#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xml: <http://www.w3.org/XML/1998/namespace> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .<http://cdm16079.contentdm.oclc.org:80/cdm/ref/collection/p15330coll22/id/68544> a bf:Item ; bf:AccessPolicy <http://rightsstatements.org/vocab/CNE/1.0/> ; bf:generationProcess [ a bf:GenerationProcess ; bf:generationDate "2017-11-10T03:58:51.243583" ; rdf:value "Generated by BIBCAT version 1.18.1 from KnowledgeLinks.io"^^xsd:string ] ; bf:heldBy <https://www.denverlibrary.org/> ; bf:itemOf <https://www.denverlibrary.org/57154f74-c5cb-11e7-9f30-ac87a3129ce6> .
<https://www.denverlibrary.org/57154f74-c5cb-11e7-9f30-ac87a3129ce6> a bf:Instance ; bf:extent [ a bf:Extent ; rdf:value "1 copy photonegative ; 15 x 11 cm. (5 3/4 x 4 1/4 in.); 1 photonegative : glass ; 26 x 21 cm. (10 x 8 in.); 1 photoprint ; 24 x 18 cm. (9 1/4 x 7 in.)"^^xsd:string ] ; bf:generationProcess [ a bf:GenerationProcess ; bf:generationDate "2017-11-10T03:58:51.243583" ; rdf:value "Generated by BIBCAT version 1.18.1 from KnowledgeLinks.io"^^xsd:string ] ; bf:identifiedBy [ a bf:oclc ; rdf:value "34837596"^^xsd:string ], [ a bf:Local ; rdf:value "B-529"^^xsd:string ] ; bf:instanceOf <https://www.denverlibrary.org/57154f74-c5cb-11e7-9f30-ac87a3129ce6#Work> ; bf:media [ a bf:Media ; rdf:value "Photograph"^^xsd:string ] ; bf:note [ a bf:Note ; bf:noteType "admin"@en ] ; bf:summary [ a bf:Summary ; rdf:value "Major John M. Burke, head and shoulders studio portrait, wearing hat, suit jacket and vest; Wild West promoter and Indian Agent."^^xsd:string ] ; bf:title [ a bf:Title ; bf:mainTitle "Major John Burke, bust"^^xsd:string ] .
<https://www.denverlibrary.org/57154f74-c5cb-11e7-9f30-ac87a3129ce6#Work> a bf:Work ; bf:contribution [ a bf:Contribution ; bf:agent [ a bf:Agent ; rdf:value "Barry, D. F. (David Francis), 1854-1934" ] ; bf:role relators:cre ] ; bf:originDate "12/23/2010" .
Now that we have seen three workflows to produce BIBFRAME RDF triples from different data sources, now we will shift from mapping data sources to BIBFRAME to the other function of RML mapping and that is to map from BIBFRAME 2.0 to other RDF-based