RDF-in-HTML could have been so simple.
There's been a whole lot of discussion around Microdata
, a new approach for embedding machine-readable information into forthcoming HTML5. What I find most attractive about Microdata is the fact that it was designed by HTMLers, not RDFers. It's refreshingly pragmatic, free of other RDF spec legacy, but still capable of expressing most of RDF.
lobbyists on the HTML WG mailing list forced the spec out of HTML5 core for the time being. This manoeuver was understandable (a lot of energy went into RDFa, after all), but in my opinion very short-sighted. How many uphill battles did we have, trying to get RDF to the broader developer community? And how many were successful? Atom, microformats, OpenID, Portable Contacts, XRDS, Activity Streams (well, not really), these are examples where RDFers tried, but failed to promote some of their infrastructure into the respective solutions. Now: HTML5, where the initial RDF lobbying actually had an effect and lead to a native mechanism for RDF-in-HTML. Yes, native
, not in some separate spec. This would have become part of every HTML5 book, any HTML developer on this planet would have learned about it. Finally a battle won. And what a great one. HTML.
But no, Microdata wasn't developed by an RDF group, so they voted it out again. Now, the really sad thing is, there could have been a solution that would have served everybody sufficiently well, both HTMLers and RDFers. The RDFa group recently realized that RDFa needs to be revised anyway, there is going to be an RDFa 1.1 which will require new parsers. If they'd swallowed their pride, they would most probably have been able to define RDFa 1.1 as a proper superset of Microdata.
Here is a short overview of RDF features supported by Microdata:
- Explicit resource containers, via @itemscope (in RDFa, the boundaries of a resource are often implicitly defined by @rel or @typeof)
- Subject declaration, via @itemid (RDFa uses @about)
- Main subject typing, via @itemtype (RDFa uses @typeof)
- Predicate declaration, via @itemprop (RDFa uses @property, @rel, and @rev)
- Literal objects, via node values (RDFa also allows hidden values via @content)
- Non-literal objects, via @href, @src, etc. (RDFa also allows hidden values via @resource)
- Object language, via @lang
- Blank nodes
I won't go into details why hiding semantics in RDFa will be penalized by search engines as soon as spammers discover the possibilities, why reusing RDF/XML's attribute names was probably not a smart move with regard to attracting non-RDFers, why the new @vocab idea is impractical, or why namespace prefixes, as handy as they are in other RDF formats, are not too helpful in an HTML context. Let's simply state that there is a trade-off between extended features (RDFa) and simplicity (Microdata). So, what are the core features that an RDFer would really need beyond Microdata:
- the possibility to preserve markup, but probably not necessarily as an explicit rdf:XMLLiteral
- datatypes for literal objects (I personally never used them in practice in the last 6 years that I've been developing RDF apps, but I can see some use cases)
Markup preservation is currently turned on by default in RDFa and can be disabled through @datatype in RDFa, so an RDFer-satisfying RDFa 1.1 spec could probably just be Microdata + @datatype + a few extended parsing rules to end up with the intended RDF. My experience with watching RDF spec creation tells me that the RDFa group won't pick this route (there simply is no "Kill a Feature
" mentality in the RDF community), but hey, hope dies last.
I've been using Microdata in two of my recent RDF apps and the CMS module of (ahem, still not documented) Trice, and it's been a great experience. ARC
is going to get a "microRDF" extractor that supports the RDF-in-Microdata markup below (Note: this output still requires a 2nd extraction process, as the current Microdata draft's RDF mechanism only produces intermediate RDF triples, which then still have to be post-processed. I hope my related suggestion
will become official, but I seem to be the only pro-Microdata RDFer on the HTML list right now, so it may just stay as a convention):
<div itemscope itemtype="http://xmlns.com/foaf/0.1/Person">
<!-- plain props are mapped to the itemtype's context -->
<img itemprop="img" src="mypic.jpg" alt="a pic of me" />
My name is <span itemprop="name"><span itemprop="nick">Alec</span> Tronnick</span>
and I blog at <a itemprop="weblog" href="http://alec-tronni.ck/">alec-tronni.ck</a>.
<!-- other RDF vocabs can be used via full itemprop URIs -->
I'm a crash test dummy for semantic HTML.
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix bio: <http://purl.org/vocab/bio/0.1/> .
_:bn1 a foaf:Person ;
foaf:img <mypic.jpg> ;
foaf:name "Alec Tronnick" ;
foaf:nick "Alec" ;
foaf:weblog <http://alec-tronni.ck/> ;
bio:olb "I'm a crash test dummy for semantic HTML." .