Validating ORE from the Command-line
I've been periodically poking at getting Linked Data/RDF views hooked into the World Digital Library web application, following Ed Summers' lead from his work on Chronicling America. The RDF views also use the OAI-ORE vocabulary to express aggregations — in WDL, an item is an aggregation of its constituent files. The goal is to provide a semantically rich and holistic representation of a WDL item (identifier, constituent files, metadata, translations, and so on).
The ORE format is a new one for me so it's hard to say whether the output of my dev branch is valid ORE or not. Plus I'm a sucker for validators. Turns out Rob Sanderson has developed a Python library for validating ORE, and this little snippet is what I've been using to validate the ORE. I didn't put much effort into making it readable, so much as banging something functional out so I can meet deadlines, so mea culpa and all that. But without further hemming and hawing, the code:
# validate.py import sys from foresite import * rem = RdfLibParser().parse(ReMDocument(sys.argv[1])) aggr = rem.aggregation n3 = RdfLibSerializer('n3') rem2 = aggr.register_serialization(n3) print rem2.get_serialization(n3).data
Most of this code is naively copied and pasted from Rob's excellent Foresite documentation.
I invoke it thusly: python validate.py {URL}
And the output:
@prefix _27: <http://www.semanticdesktop.org/ontologies/nfo#>.
@prefix _28: <http://localhost/en/item/1/id#>.
@prefix _29: <http://localhost/en/item/1/>.
@prefix bibo: <http://purl.org/ontology/bibo/>.
@prefix dc: <http://purl.org/dc/elements/1.1/>.
@prefix dcterms: <http://purl.org/dc/terms/>.
@prefix ore: <http://www.openarchives.org/ore/terms/>.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix rdfs1: <http://www.w3.org/2001/01/rdf-schema#>.
_28:ResourceMap a ore:ResourceMap;
dc:format "text/rdf+n3";
dcterms:created "2009-07-31T14:23:31Z";
dcterms:modified "2009-07-31T14:23:31Z";
ore:describes _29:id.
_29:id a bibo:Image,
ore:Aggregation;
dcterms:DDC "973";
dcterms:alternative "Antietam, Maryland. Allan Pinkerton, President Lincoln, and Major General John A. McClernand"@en;
dcterms:created "1862年10月3日"@zh,
"3 de octubre de 1862"@es,
"3 de outubro de 1862"@pt,
"3 octobre 1862"@fr,
"3 октÑÐ±Ñ€Ñ 1862 года"@ru,
"October 3, 1862"@en,
" ٣ آكتوبر، ١٨٦٢"@ar;
dcterms:creator "Gardner, Alexander"@en,
"Gardner, Alexander"@es,
"Gardner, Alexander"@fr,
"Gardner, Alexander"@pt,
"Гарднер, ÐлекÑандр"@ru,
"جاردنر, أليكسندر"@ar,
"åŠ å¾·çº³, 亚历山大"@zh;
... (and so on and so forth)
dcterms:title "Antietam, Maryland. Allan Pinkerton, President Lincoln, and Major General John A. McClernand: Another View"@en,
"Antietam, Maryland. Allan Pinkerton, el Presidente Lincoln y el General Principal John A. McClernand: Otra visión"@es,
"Antietam, Maryland. Allan Pinkerton, le président Lincoln et le général-major John A. McClernand: Autre vue"@fr,
"Antietam, Maryland. Allan Pinkerton, Â Presidente Lincoln e Major-General John A. McClernand: Outra Vista"@pt,
"ÐнтитÑм, штат МÑриленд. Ðллан Пинкертон, президент Линкольн и генерал-майор Джон Ð. Макклернанд: Другой Ñнимок"@ru,
"أنتينام، ميريلاند ألان بينكرتون، الرئيس لينكولن، واللواء جون أ. ماكليرناند: منظر آخر"@ar,
"安蒂特姆,马里兰州 è‰¾ä¼¦Â·å¹³å…‹é¡¿ã€æž—肯总统和少将约翰·A ·马克克拉å—: å¦ä¸€ä¸ªè§†è§’"@zh;
ore:aggregates <http://localhost/static/c/1/reference/04326u_thumb_item.gif>,
<http://localhost/static/c/1/service/04326u.tif>;
ore:isDescribedBy <http://localhost/en/item/1/item.rdf>;
rdfs:seeAlso <http://hdl.loc.gov/loc.wdl/dlc.1>.
<http://localhost/static/c/1/reference/04326u_thumb_item.gif> a _27:FileDataObject;
dcterms:format "image/gif";
_27:fileSize "34531"^^<http://www.w3.org/2001/XMLSchema#long>.
<http://localhost/static/c/1/service/04326u.tif> a _27:FileDataObject;
dcterms:format "image/tiff";
_27:fileSize "1301614"^^<http://www.w3.org/2001/XMLSchema#long>.
ore:Aggregation rdfs1:isDefinedBy <http://www.openarchives.org/ore/terms/>;
rdfs1:label "Aggregation".
ore:ResourceMap rdfs1:isDefinedBy <http://www.openarchives.org/ore/terms/>;
rdfs1:label "ResourceMap".You might pick up on some warts I have yet to fix, but there you go.
A Digital Object Defined
What happens to a digital object defined?[1]
Does its identifier dry up
like a raisin in the sun?
Or its relationships fester like a sore–
And then run?
Do its bits rot like meat?
Or become overwritten–
like some throw-away sheet?
Maybe its metadata just sags
like a heavy load.
Or does it fade into code?
Notes
- Inspired by Langston Hughes's "A Dream Deferred" and a spirited conversation in the office today. [↩]
WDL metadata mapping, and, parsing TEI in Python
Context
Early on in the effort to develop the first public version of the World Digital Library web application, we developed a (non-public) Django-based cataloging application where Library of Congress catalogers could manage metadata for WDL items. Management in this sense includes creation of records, editing of records, versioning of edits, mapping of source records, and some light workflow for assignment of records to individual catalogers and for hooking into translation processes[1].
I worked primarily on the source record mapping tools. They take a number of formats as input and are called by the cataloging application to map metadata from these formats into the WDL domain model. Several though not all of which are XML-based, and thus easily dealt with in Python, via the etree module in the lxml package.
Dan recently kicked off a new R&D project for evaluating (any) metadata against any number of metadata profiles, mapping into a generic data dictionary, the goal being to determine how feasible it would be to develop a toolset for aiding remediation of metadata across any number of digital collections. I have been working on this project with Dan, and got started by seeing how generalizable the WDL metadata mapping tools are. Turns out they're fairly generalizable once you tweak the various format-specific mapping rules to map into the generic data dictionary model rather than the WDL model (around 15 elements, and somewhere between Dublin Core and MODS in terms of specificity but flatly structured like DC).
Some of the test data I am working with now, that has nothing to do with WDL, is SGML-based TEI 2 markup. The closest I worked with on WDL was TEI P5 for manuscript description which is serialized in XML. Turns out my TEI mapping rules from before blew up on this TEI 2 stuff, as lxml.etree (naturally) wasn't digging the non-XML input. I googled around a bit for how best to parse TEI (or any SGML) in Python and then discovered it's actually simple as pie.
Code
If you've got the BeautifulSoup module installed[2]:
>>> from BeautifulSoup import BeautifulSoup >>> tei = open('foo.sgm').read() >>> BeautifulSoup(tei).findAll('title')[0].string u'[Memorandum to Dr. Botkin]: a machine readable transcription.'
If not, the lxml.html module works too:
>>> from lxml import html >>> h = html.parse(open('foo.sgm')) >>> h.xpath('//title')[0].text '[Memorandum to Dr. Botkin]: a machine readable transcription.'
Data
And here's what the sample data looks like:
<!doctype tei2 public "-//Library of Congress - Historical Collections (American Memory)//DTD ammem.dtd//EN" [ <!entity % images system "07010101.ent"> %images; ]> <tei2> <teiheader type="text" date.created="1994/03/15" date.updated="2002/04/05" status="updated" creator="National Digital Library Program , Library of Congress"> <filedesc> <titlestmt> <amid type="aggitemid">wpa0-07010101</amid> <title>[Memorandum to Dr. Botkin]: a machine readable transcription.</title> <amcol><amcolname>Life Histories from the Folklore Project, WPA Federal Writers' Project, 1936-1940; American Memory, Library of Congress.</amcolname><amcolid type="aggid"></amcolid> </amcol> <respstmt> <resp>Selected and converted.</resp> <name>American Memory, Library of Congress.</name> </respstmt></titlestmt> <publicationstmt> <p>Washington, DC, 1994.</p> <p>Preceding element provides place and date of transcription only.</p> <p>For more information about this text and this American Memory collection, refer to accompanying matter.</p> </publicationstmt> <sourcedesc> <lccn></lccn> <sourcecol>U.S. Work Projects Administration, Federal Writers' Project (Folklore Project, Life Histories, 1936-39); Manuscript Division, Library of Congress.</sourcecol> <copyright>Copyright status not determined; refer to accompanying matter.</copyright></sourcedesc> </filedesc> <encodingdesc> <projectdesc><p>The National Digital Library Program at the Library of Congress makes digitized historical materials available for education and scholarship.</p></projectdesc> <editorialdecl><p>This transcription is intended to have an accuracy of 99.95 percent or greater and is not intended to reproduce the appearance of the original work. The accompanying images provide a facsimile of this work and represent the appearance of the original.</p></editorialdecl> <encodingdate>1994/03/15</encodingdate> <revdate>2002/04/05</revdate> </encodingdesc> </teiheader> <text type="manuscript"> <body> <div> <pageinfo> <controlpgno entity="I07010101">0001</controlpgno> <printpgno></printpgno></pageinfo> <p>Memorandum to Dr. Botkin from G. B. Roberts, May 26, 1941</p> <p>Subject: Alabama Material</p> <p>This material has not yet been accessioned and has only <del rend="overstrike">beeen</del> been roughly classified as life histories, folklore, and miscellaneous data and copy save in the case of the 2 ex-slave items and the essay on Jesse Owens, each of which was recommended.</p> <p>Total no. of items recommended: 3 (14 pp.) <handwritten>In progress</handwritten></p></div></body></text></tei2>
Notes
- Catalogers cataloged stuff in the English language, but every metadata record needed to be translated into the other six U.N. languages: Spanish, Russian, French, Arabic, Chinese, and Portuguese. [↩]
- And you are but one
sudo easy_install BeautifulSoupaway from that. [↩]
I2: Survey
[Series]
Near the end of my strawman post, I wrote:
The I2 repositories subgroup will be sending out its survey on identifier use cases in the coming week. It will be interesting to see if the requirements we have thus far identified still obtain in light of the data we collect from the survey.
We completed the survey late last week and began distributing it. Here's what we sent out:
The NISO I2 Working Group is surveying repository managers to determine the current practices and needs of the repository community regarding institutional identifiers. We value your time and your input in the process to create a standard for a new institutional identifier. We hope that you will complete the survey which should take less than 15 minutes. The survey will remain open through Monday, July 6th.
Here is a link to the survey:
http://www.surveymonkey.com/s.aspx?sm=RGQgZ3090DVrb3kFzr3P3Q_3d_3dPlease feel free to share this message with other interested parties.
First we used Survey Monkey to send the survey link to approximately one-hundred repository managers that the subgroup identified. Our process for identifying repository managers involved pulling together a list of prominent repositories from subgroup members, and then gathering more from OpenDOAR, "an authoritative directory of academic open access repositories." Then subgroup members were encouraged to share the survey link with colleagues, and post it far and wide via blogs, listservs, and tweets. The listservs we targeted were: JISC-REPOSITORIES, metadataLibrarians, digital-curation, SPARC-IR, ir-net, REPOMAN-L, PALINET-IR-L, dspace-general, fedora-commons-users, DC-IDENTIFIERS, and code4lib.
I've already received a few responses and have gotten useful feedback. Two of the hardest questions to answer so far have been: "What is an institutional identifier?" and "What is a repository?"
- Institutional identifier
-
An institutional identifier is defined as a symbol or code that uniquely identifies an institution. Domain-specific examples of existing identifiers include SAN, IPEDS, GLN, MARC Org Code, and ISIL. Another example might be a Handle prefix or ARK name authority assigning number.
- Repository
-
Institutional repositories and subject repositories like arxiv.org are clearly 'repositories', but beyond that it is a somewhat ill-defined term. One might look to the Kahn-Wilensky architecture, or the OAIS reference model (PDF), or even Wikipedia for definitions, but it's not clear that even the authorities agree on what constitutes a repository.
It's a system. It's network-accessible and typically has a web interface of some sort. Files and groups of files sometimes known as objects tend to be deposited in them, perhaps for some combination of management, access, or preservation. Many run Fedora, DSpace, and ePrints, and factor heavily in scholarly communication. Some are document-centric. Some will accept anything. To some, a learning management system may be a repo. To others, a content management system may fit.
My background is in academia so my own definition is somewhat based in that context, but I wouldn't say the term is necessarily limited to that context. There are other NISO I2 scenarios for library workflows and electronic resources, so it's safe to assume that repository does not mean ILS or OPAC or ERP system. My hope is that folks have their own working definitions of the term and can decide for themselves what it means.
We've given folks a little over two weeks to respond to the survey, so the constant I2 drum-beating will quiet down for a while around here. I am very interested in what sorts of responses we get from the survey. Fun times!
Oh, and perhaps it goes without saying, but if you're a repository owner, manager, expert, developer, or stakeholder with an interest in identifiers, please feel free to take the survey!
I2: Strawman
[Series]
In the prior I2 post, I wrote about the requirements the repositories subgroup has come up with for an institutional identifier standard (with the hope that our findings re: repositories could be generalized to other scenarios).

- Image by PhOtOnQuAnTiQuE via Flickr
My strawman proposal of sorts is to explore how well linked data patterns fit this problem space. Linked data, briefly, is a way to expose and link data on the web in a more semantically meaningful way, and is often summarized using the four principles put forward by Tim Berners-Lee:
- Use URIs as names for things
- Use HTTP URIs so that people can look up those names.
- When someone looks up a URI, provide useful information.
- Include links to other URIs. so that they can discover more things.
That's the crux of it. Linked data takes well-known patterns on the web (linking, dereferencing, etc.) and applies them to data, which in this case could be metadata for identifying institutions.
Let's examine each of the requirements and the applicability of linked data thereto.
- Should be agnostic to type of institution, e.g., libraries, museums, personal collections, historical societies: The web is already agnostic to type of institution. HTTP URIs do not favor one type of institution over another.
- Should handle varying institutional granularity, e.g., institution-level, campus-level, division-level, unit-level: HTTP URIs are flexible in this regard. Hierarchy, should one wish it to be surfaced in the identifier, may be encoded in either a DNS hostname or the path appended to the DNS name. One can imagine a URI like "http://department.division.institution.tld/unit/subunit" or "http://institution.tld/campus/office/individual".
Hierarchy needn't be surfaced in the identifier if one favors opacity, in which case "http://registry.tld/xnjsdasd" would suffice as an identifier, and may instead be entirely reflected in the (RDF) representation returned by dereferencing the URI. - Should handle linking among institutions and subordinate units: Linked data handles linking via well-known HTTP mechanisms, referenced in the fourth principle of linked data. Unlike the HTTP link, which has limited semantics, linked data links are semantically rich and extensible.
- Should express different sorts of relationships among these institutions and units: The "useful information" in the third principle of linked data is typically provided by an RDF representation, which is itself a list of assertions. These assertions, or triples, consist of subjects, predicates, and objects. The ability to express the relationships in this requirement is limited only by the availability of vocabularies that contain sets of predicates and classes for subjects and objects. Think of the predicates as elements defined within a metadata standard, e.g., Dublin Core "creator", MODS "relatedItem", and so forth. Vocabularies that contain these predicates and classes are growing and evolving daily, and should there not be a vocabulary that contains the relationship one wishes to express, it is fairly easy to create a custom vocabulary.
The ability to mix and match vocabularies provides an expressiveness that is often not found in document-based metadata formats and the flexibility to express radically different relationships on a per-industry or per-institution basis. This latter point is important as the I2 group has identified both core metadata elements for identifying institutions of different types and additional elements for specific types of institutions. Why re-invent a new metadata format or schema when all one needs to express may already be contained in others? - Should relate to existing relevant identifiers and registries: Same as requirement#4. Linked data is all about expressing relationships between things, e.g., institutions, identifiers, registries, etc.
- Should be globally unique: HTTP URIs are guaranteed to be globally unique by virtue of the distributed DNS system and hierarchical naming within each HTTP service.
- Should be actionable: HTTP URIs provide dereferenceability/actionability via the well-known HTTP protocol.
- Should enable retrieval of metadata sufficient to identify the institution, which may vary widely by institution: HTTP URIs are actionable per requirement #7 and the metadata returned is flexible per requirement #4.
- Should accommodate changes as institutions come and go and re-organize and be able to relate defunct institutions to new ones: Linked data patterns provide for redirecting from defunct representations (institutional identifiers) to new ones via HTTP redirects. One may also add assertions to institutional metadata such as owl:sameAs, for instance, which says that the institution identified by the given URI is the same as another institution identified by another URI.
This seems like a compelling path to follow for the I2 standard.
The I2 repositories subgroup will be sending out its survey on identifier use cases in the coming week. It will be interesting to see if the requirements we have thus far identified still obtain in light of the data we collect from the survey. If so, I would like to explore the idea of linked data for institutional identifiers a bit more.
