Back in August, I mentioned that I taught Evergreen, Koha, and VuFind how to express library holdings in schema.org via the http://schema.org/Offer class. What I failed to mention was how others can do the same with their own library systems (well, okay, I linked to the W3C Schema.org Bibliographic Extension Community Group proposal for representing holdings via Offer but didn't focus on how one would go about doing that). This might have led to Diane Hillman recently finding the wrong, abandoned holdings proposal (thankfully Richard Wallis helped clear things up!). So, better late than never, here is a quick summary:
Each copy that the library holds is marked up as an individual `Offer <http://schema.org/Offer>`__.
The `itemOffered <http://schema.org/itemOffered>`__ property attaches an Offer to a corresponding `Product <http://schema.org/Product>`__ that contains the main description of the goods. In most library systems, this is going to be the title of the item, list of creators, abstract, subject classifications, etc; that which we generally refer to as the bibliographic record. While this will probably have its own type already (Book or Movie or MusicAlbum or the like), you can also include Product as a secondary type (either via a whitespace-delimited list or via the schema.org additionalType property).
Mapping more familiar library terminology to the pertinent properties from Offer goes something like this:
- Library = seller - the range of Organization includes Library as a child type, so you can link to a highly structured description of the library including hours of operation, contact information, location... and that's exactly what we now do in Evergreen
- Call number / shelf number = sku - because a stock-keeping unit number is "a merchant-specific identifier for a product or service", and what is a call number if not a means by which you identify stock on the shelf?
- Barcode = serialNumber - the unique "alphanumeric identifier of a particular product", am I right?
- Shelving location = availableAtOrFrom - "[t]he place(s) from which the offer can be obtained"; with a range of Place this really should be linked to sub-units of the Library type you pointed to for the seller property, but schema.org does accept reality and the inevitability that some plain text values are going to be supplied where a typed range was indicated.
- Item status = availability
- Borrowing terms = businessFunction - another enumeration, for which the most likely value for a library is http://purl.org/goodrelations/v1#LeaseOut. After all, what is a library loan other than a lease with a limited period during which the price is $0.00?
- Price = price - while theoretically unnecessary, explicitly specifying a price of $0.00 may satisfy search engines that always expect to see a price attached to an offer (I'm looking at you, Google Structured Data Testing Tool!)
The language for some of the terminology may seem a little overly commercial right now, but the next iteration of the schema.org standard will adopt language that more broadly supports non-commercial activities... and this broadening of a number of schema.org definitions is also an outcome of the Schema BibEx community efforts. I'm pretty happy with the results of the group over the last six months! Hopefully this sheds some long-overdue light on some of the results of our efforts, and helps other systems adopt our group's recommended practices for exposing metadata via schema.org.