Monthly Archives: June 2011

Things people get wrong in RDFa markup

Things people get wrong in RDFa markup

Lately, I’ve been looking a lot of both RDFa and Microdata formatted HTML. There are a number of things that authors (even experts) regularly get wrong:

@src and @rel attributes create reverse relation

Having code such as the following:

<img rel="image" src="image.jpg" />
...

You’d think that this would indicate that the icon for the document is

<> xhv:image <image.jpg>

but it actually says:

<image.jpg> xhv:image <> .

The why of this is lost in the haze of history, but people regularly get this wrong. To get what you need, consider something like the following markup:

<span rel="image"><img src="image.jpg" /></span>
...

@rel and @typeof and/or @about shouldn’t be on the same element

Another common mistake is format such as the following:

<div rel="mainContentOfPage" about="#me" typeof="Person">
  <p>
    Name: <span property="name">Gregg Kellogg</span></p>
  <p>
    Knows: <a href="http://greggkellogg.net/#me" rel="knows">Myself</a></p>
</div>

Placing @rel and @about or @typeof on the same element indicates that the @about/@typeof indicate the subject not the object of a relation. To get the desired effect, use @resource (or @href), however, this does not let you set the type of the object resource. Alternatively, use the following type of markup:

<div rel="mainContentOfPage">
  <div about="#me" typeof="Person">
    <p>
      Name: <span property="name">Gregg Kellogg</span></p>
    <p>
      Knows: <a href="http://greggkellogg.net/#me" rel="knows">Myself</a>
    </p>
  </div>
</div>

Another area of common mis-understanding is that the document order of statements within an HTML document is not significant when creating a list of resources. Consider the following example from schema.org/MusicPlaylist:

<div itemscope="" itemtype="http://schema.org/MusicPlaylist">
  <span itemprop="name">Classic Rock Playlist</span>
  <div itemprop="tracks" itemscope="" itemtype="http://schema.org/MusicRecording">
    1. <span itemprop="name">Sweet Home Alabama</span> - <span itemprop="byArtist">Lynard Skynard</span>
  </div>
  <div itemprop="tracks" itemscope="" itemtype="http://schema.org/MusicRecording">
    2. <span itemprop="name">Shook you all Night Long</span> - <span itemprop="byArtist">AC/DC</span>
  </div>
  ...
</div>

You would think that this describes a track ordering, but it does not (at least in RDF). Doing this requires RDF List constructs missing from both Microdata and RDFa. In Turtle, you could do it as follows:

@prefix: <http://schema.org> .
[ a :MusicPlaylist;
  :name "Classic Rock Playlist";
  :numTracks 5;
  :tracks (
    [ a :MusicRecording; :name "Sweet Home Alabama"; :byArtist "Lynard Skynard"]
    [a :MusicRecording; :name "Shook you all Night Long"; :byArtist "AC/DC"]
    ...
  )
]

It would seem obvious that an HTML ordered list could be used to generate an RDF List, but it received to achieve enough interest to make it through.

These are just a couple of things that are confusing about RDFa, and offer good fodder for Microdata proponents to complain about the complexity of RDFa markup. It’s important to note that a core goal of RDFa 1.1 is to be compatible with RDFa 1.0 (RDFa in XHTML), in which these decisions were established. Perhaps a reconciliation between Microdata and RDFa could take the best of both:

  • Craft RDF friendly URIs from terms (such as schema:Person above),
  • Reduce amount of document structure needed to describe common use cases,
  • Better intuitive generation of RDF output,
  • Ability to avoid RDF generation and go straight to JSON (perhaps JSON-LD),
  • Use common URI prefixes,
  • RDF Lists,
  • Promote better HTML readability.

That’s my 2 cents (for now)

Update

The RDFa Working Group recently decided to change the behavior of @src in RDFa Core 1.1 to be the same as @href. This means that

<img rel="image" src="image.jpg" />
...

Actually does now generate the following:

<> xhv:image <image.jpg>

Recent updates to Microdata to RDF processing now do place multiple items in a list, but this is subject to further specification.

In RDFa, this can now be done with the @inlist attribute, which places values in an RDF Collection (rdf:List).

<div vocab="http://schema.org/" typeof="MusicPlaylist">
  <span property="name">Classic Rock Playlist</span>
  <div rel="tracks" inlist="">
    1. <div typeof="MusicRecording">
          <span property="name">Sweet Home Alabama</span> - <span property="byArtist">Lynard Skynard</span>
  </div>
  2. <div typeof="MusicRecording">
        <span property="name">Shook you all Night Long</span> - <span property="byArtist">AC/DC</span>
  </div>
  ...
</div>

Now generates the following Turtle:

@prefix: <http://schema.org> .
[ a :MusicPlaylist;
  :name "Classic Rock Playlist";
  :tracks (
    [ a :MusicRecording; :name "Sweet Home Alabama"; :byArtist "Lynard Skynard"]
    [ a :MusicRecording; :name "Shook you all Night Long"; :byArtist "AC/DC"]
    ...
  )
]

Western Road Trip

Pictures from my drive out from Florida to California moving Brother-Inlaw Jeff Katz and Bear. Pictures really start in Western Texas, with dramatic images of trains and mesas in New Mexico and Arizona, the Hover Dam, Wind Farms in California and the Mojave Airport/Spaceport.