Re: comment on using RDFa

Hi Peter,

> I have some comments on RDFa based on my experiences in trying to use it
> for the openacademia project. Basically, the idea is to use RDFa to mark
> up publication metadata in HTML publication lists generated by
> openacademia. These typically are embedded in personal homepages as in
> [2]. We are using the SWRC ontology for publication metadata and FOAF
> for personal metadata.

Great...a perfect use of RDFa. :)


> My knowledge of RDFa is based on the Primer and I havent' followed the
> mailing list so far, so please forgive me if I point out something
> obvious or something that is already noted.

Not at all--your comments are very welcome, and real-use experience is
very valuable.


> Comment #1
> -------------
>
> RDFa seems to interfere with existing markup. On the pages we generate
> we would like to have both our own markup, hCard as well as RDFa.
>
> My first attempt to mix hCard and RDFa would be:
>
> <span class="vcard">
>     <span class="fn foaf:Person" property="foaf:name"
> about="http://www.cs.vu.nl/~pmika/publications.bib#peter_mika">Peter
> Mika</span>
> </span>
>
> This doesn't work: when I unleash the RDFa bookmarklet on this I get the
> nonsensical triple which says that #peter_mika is both type foaf:Person
> and type fn.

RDFa is still going to change a little more before it is finalised, so
comments like this are especially useful. In this case though, the
problem could be with the bookmarklet, since as things stand
non-prefixed class names should be ignored. The motivation is to try
as much as possible to ensure that the author 'really, really'
intended to create these triples.


> [snipped example, but you are right that an author shouldn't have to jump through hoops]
>
> The fact that I cannot mix RDFa class names and other class names in a
> single span element makes things even more complex when I want to say
> that there is a publication and this person is the author of it. My
> current minimal solution requires six levels of nesting (!):

Agreed...but hopefully, once non-prefixed class names are ignored,
things should be ok.


> [snip]
>
> Since this seems to defeat the purpose of human-writable markup, I
> suggest minimally documenting this issue... Stronger, I would have
> expected this to work based on the experiences with microformats, which
> happily mix together in the same class attribute.

Unfortunately, with microformats you have to define the rules of
mixing for each additional vocabulary, so it quickly gets out of hand.


> Note that from this code the bookmarklet still produces a number of
> nonsensical triples involving the non-RDFa classnames.

As I say, I'm almost certain that behaviour is incorrect, but we'll check.


> Comment #2
> ~~~~~~~~~
>
> It seems unnatural to put the foaf:Person class attribute on the element
> that gives the name of the person.

That's an interesting comment. From an RDF point of view it's not
unnatural at all, since 'type' is one predicate, and the name is
another. But I do understand what you're saying; from a non-RDF
standpoint, you'd most likely read the mark-up like this:

  * 'here is a person object';

  * contained within this person object are person properties.

RDF is of course much looser; we would say:

  * 'here is _any_ old object';

  * it has two properties, one of which is a name...

  * ...the other is an indicator of one of the types of that object.

The difference is certainly worth thinking about, and we should try to
see if there is anything better that can be done. But I have to say
that I'm not sure if the 'here is the root of an object' approach (as
used in microformats) lends itself to an RDF-inspired approach like
RDFa. For example, the following is another way to mark-up the same
information that you are describing:

<html ...>
  <head>
    <link about="#s" rel="rdf:type" href="foaf:Person" />
  </head>
  <body>
    <span about="#s">
      <span property="foaf:name">Peter Mika</span>
    </span>
  </body>
</html>

The triples for this should be (namespaces and datatypes omitted for brevity):

  <#s> rdf:type foaf:Person .
  <#s> foaf:name "Peter Mika" .

As you can see, it generates the same triples that you want, but at
the point of parsing foaf:name there is nothing to indicate 'we are
now in foaf:Person parsing mode' (and it's a key design goal of RDFa
that there doesn't need to be).


> However, when I try the seemingly
> logical solution:
>
> .....
>            <span class="foaf:Person" rel="swrc:author"
> href="http://www.cs.vu.nl/~pmika/publications.bib#peter_mika">
>                         <span  property="foaf:name">
>                             Peter Mika
>                         </span>
>             </span>
> ....
>
> What happens is that the publication becomes type foaf:Person, instead
> of #peter_mika. Again, this is unnatural to me, so I suggest to change
> it, or if this is the best possible compromise, then it would be helpful
> to document it to alert users.

This is because the @class, @rel and @property values will *all* apply
to whatever the most recent @about value is, or to the document as a
whole if there isn't one. My feeling is that you need to flip the
author and publication by using @rev, and then use the fact that the
author is now the *subject* to hang your foaf:name properties on, and
set the rdf:type:

      <span
       about="...#peter_mika"
        property="foaf:name"
        rev="swrc:author" href="...#mika06jws"
        class="foaf:Person"
      >Peter Mika</span>
    </span>

I'm not sure if this is what you are trying to achieve, but since I'd
like to try to show the whole mark-up--including the
microformats--I've made the following assumptions:

  * that you have a list of publications;

  * that each publication could have multiple authors;

  * that you want to indicate the rdf:type of both the publications and
    the authors;

  * that you want to include the microformats for both;

  * that non-prefixed class names should be ignored by RDFa parsers;

Assuming all of these to be true, then the following mark-up should
give everything, although it is very terse:

  <li
   xml:base="http://www.cs.vu.nl/~pmika/publications.bib"

   about="#mika06jws"
     class="swrc:Article hbib article"
  >
    <span class="vcard">
      <span
       about="#peter_mika"
        property="foaf:name"
        rev="swrc:author" href="#mika06jws"
        class="foaf:Person author fn"
      >Peter Mika</span>
    </span>
    <!-- Next author would come here -->
  </li>

Key things to point out are:

  * following a rough 'subject, predicate, object' approach makes it a little
    clearer what is going on with something like the @class value on the
    publication;

  * @rev is used to flip the subject and object, so that we can say things
    about the author--in this case it allows us to give them a foaf:name, and
    an rdf:type of foaf:Person.

Obviously this is easily generated, but if you feel it's too terse
then an alternative would be to merely reference the authors at the
top of each publication, and then give more details later in the
document:

  <!-- Publications first -->
  <ul>
    <li
     xml:base="http://www.cs.vu.nl/~pmika/publications.bib"

     about="#mika06jws"
       class="swrc:Article hbib article"
    >
      <ul>
        <li>
          <a rel="swrc:author" href="#peter_mika" class="author">
            Peter Mika
          </a>
        </li>
      </ul><!-- authors list -->
    </li>

    <li
     about="#mikadoe01xyz"
       class="swrc:Article hbib article"
    >
      <ul>
        <li>
          <a rel="swrc:author" href="#peter_mika" class="author">
            Peter Mika
          </a>
        </li>
        <li>
          <a rel="swrc:author" href="#john_doe" class="author">
            John Doe
          </a>
        </li>
      </ul><!-- authors list -->
    </li>
    <!-- Next publication would come here -->
  </ul><!-- publications list -->

  <!-- Authors next -->
  <span id="peter_mika" about="#peter_mika" class="foaf:Person vcard">
    <span property="foaf:name" class="fn">Peter Mika</span>
  </span>
  <span id="john_doe" about="#john_doe" class="foaf:Person vcard">
    <span property="foaf:name" class="fn">John Doe</span>
  </span>
  <!-- Next author would come here -->

Note that the @id is only needed on each person if you want to have a
clickable link from the publications. And the key difference to before
is that we have reused the author entries multiple times for multiple
publications.


> Hope these comments are helpful... please let me know if I'm doing
> something wrong or have been misinterpreting how things should work.

Looking at your original mark-up, I think that the only thing you were
missing was the use of @rev. And given that you were hampered by the
'non-prefixed class name' problem, that's pretty good going!

The comments were certainly useful, and thanks for that.

Regards,

Mark

-- 
  Mark Birbeck, formsPlayer

  mark.birbeck@x-port.net | +44 (0) 20 7689 9232
  http://www.formsPlayer.com | http://internet-apps.blogspot.com

  standards. innovation.

Received on Monday, 28 May 2007 20:25:25 UTC