May 19 2005

Tinky and SKOS

Published by Ian Davis at 7:35 pm under Uncategorized and tagged as , ,

I’m trying out some ideas with tagging and folksonomies. I want to represent them using SKOS. There has been some exploration of this recently by Karl Dubost and Richard Newman helped along by that maven Danny. I couldn’t change the output of any existing tagging systems so I did the next best thing and wrote my own: tinky.org

Tinky is a simple tagging system that works using standard HTML style links. To tag a site you add a link on a webpage somewhere like this:

<a href="http://tinky.org/tag/yourtag?http://example.com/">your text</a>

When someone clicks on the link they’re taken to the target site via tinky.org. If they’re the first to access the link then tinky fetches the page they came from and scrapes the text used in the link. That text becomes the title of the tagged link in tinky. Anything between the ‘tag/’ and a slash (/) or question mark is assumed to be the tagging desired. Tinky splits this up and assigns each tag to the link. This all happens transparently: the user clicking on the link is sent straight to the target site without seeing tinky.org. Subsequent users of the link simply add to the popularity stats for that link and are sent along on their way.

To see what’s been tagged, just leave off the question mark and the url, i.e. go to http://tinky.org/tag/yourtag

Each tagging group is available as RSS of course by accessing a uri like: http://tinky.org/rss/geolocation,webservice and the most recent taggings added are available at http://tinky.org/rss

Now that I had the source of data I could start on the SKOS. My first thought was to simply use skos:subject tags pointing to the individual tinky.org tag URIs, i.e.:

<item rdf:about="http://www.feedmap.net/BlogMap/Services/">
  ...
  <skos:subject rdf:resource="http://tinky.org/tag/geolocation"/>
  <skos:subject rdf:resource="http://tinky.org/tag/api"/>
  <skos:subject rdf:resource="http://tinky.org/tag/blogs"/>
  <skos:subject rdf:resource="http://tinky.org/tag/documentation"/>
  <skos:subject rdf:resource="http://tinky.org/tag/geolocation"/>
  <skos:subject rdf:resource="http://tinky.org/tag/webapp"/>
  <skos:subject rdf:resource="http://tinky.org/tag/webservice"/>
 ...
</item>

This fels unsatisfactory for a number of reasons, primary because I felt I was losing information such as the original tagging group. Philosophically, people tag with multiple tags because they are trying to represent a composite concept, some kind of combination of all those tags. I replaced the multiple subjects with a single subject refering to a skos:Concept representing the group of tags as a whole.

<item rdf:about="http://www.feedmap.net/BlogMap/Services/">
  ...
  <skos:subject>
    <skos:Concept rdf:about="http://tinky.org/tag/api,blogs,documentation,geolocation,webapp,webservice">
      <skos:prefLabel>api,blogs,documentation,geolocation,webapp,webservice</skos:prefLabel>
    </skos:Concept>
  </skos:subject>
  ...
</item>

This wasn’t enough: I still wanted to represent the individual components of the composite concept. My first attempt was to use the SKOS extension property relatedHasPart which looks like it is intended to represent something that is a part of another concept:

<item rdf:about="http://www.feedmap.net/BlogMap/Services/">
  ...
  <skos:subject>
    <skos:Concept rdf:about="http://tinky.org/tag/api,blogs,documentation,geolocation,webapp,webservice">
      <skos:prefLabel>api,blogs,documentation,geolocation,webapp,webservice</skos:prefLabel>
      <skose:relatedHasPart rdf:resource="http://tinky.org/tag/api"/>
      <skose:relatedHasPart rdf:resource="http://tinky.org/tag/blogs"/>
      <skose:relatedHasPart rdf:resource="http://tinky.org/tag/documentation"/>
      <skose:relatedHasPart rdf:resource="http://tinky.org/tag/geolocation"/>
      <skose:relatedHasPart rdf:resource="http://tinky.org/tag/webapp"/>
      <skose:relatedHasPart rdf:resource="http://tinky.org/tag/webservice"/>
    </skos:Concept>
  </skos:subject>
  ...
</item>

I still wasn’t happy. The problem is that relatedHasPart feels like a pretty weak property. I think it’s semantically poor, barely a step up from skos:related which just asserts some kind of relationship between two concepts. I reasoned that a set of tags specifies an intersection of the individual tags. When you tag something as ‘free,cool’ you’re trying to define a concept for things that are both ‘free’ and ‘cool’. Some things that are tagged as ‘cool’ aren’t ‘free’ and vice versa. The tag group defines a concept that is a subset of all the seperate tag concepts. Each individual tag must therefore represent a broader concept. I changed the RSS to use the skos:broader property:

<item rdf:about="http://www.feedmap.net/BlogMap/Services/">
  ...
  <skos:subject>
    <skos:Concept rdf:about="http://tinky.org/tag/api,blogs,documentation,geolocation,webapp,webservice">
      <skos:prefLabel>api,blogs,documentation,geolocation,webapp,webservice</skos:prefLabel>
      <skos:broader rdf:resource="http://tinky.org/tag/api"/>
      <skos:broader rdf:resource="http://tinky.org/tag/blogs"/>
      <skos:broader rdf:resource="http://tinky.org/tag/documentation"/>
      <skos:broader rdf:resource="http://tinky.org/tag/geolocation"/>
      <skos:broader rdf:resource="http://tinky.org/tag/webapp"/>
      <skos:broader rdf:resource="http://tinky.org/tag/webservice"/>
    </skos:Concept>
  </skos:subject>
  ...
</item>

This is a lot better I think. Theoretically I could include all possible combinations of the tags since they’re all broader than the tagging group - that would be overkill though since it would bloat the RSS enormously. Probably the next steps are to define a skos:ConceptScheme for tinky.org and ground these concepts in that scheme. There may be some other relations I can infer from clusters of tags which I’d like to represent somehow in the future.

18 Responses to “Tinky and SKOS”

  1. Richon 19 May 2005 at 8:12 pm

    That’s a bloody cool system! I’m sure Danny will join me in not being quite sure of the optimality of a flat namespace system (I’d prefer to have my own tags that are related to other people’s… mine live at http://www.holygoat.co.uk/owl/tag/), but compared to del.icio.us (which, of course, also has a flat namespace) it’s sweet.

  2. Ian Davison 19 May 2005 at 8:18 pm

    Cheers Rich. Thanks for the nice comment. I bet there’s some way to mediate between tagging systems. Perhaps you could link your tags to tinky tags by linking via tinky, e.g. animals

  3. Richon 19 May 2005 at 8:24 pm

    Good God, Ian — do you ever stop having genius ideas? :)

    OK, one loses a little bit of precision — e.g. “skies” for me is different to that of a meteorologist — but intermediating through a tagging service is quite a cool idea!

    Any thoughts on what is undoubtedly a misunderstanding of mine?

    Oh, and my Unicode page title doesn’t show up properly — are you reading the referring page’s encoding?

  4. Richon 19 May 2005 at 8:27 pm

    … though the encoded chars do come out just fine in the RSS feed, which is (IIRC) supposed to be double-encoded. Just take out the double-encoding for the HTML version.

  5. Ian Davison 19 May 2005 at 8:38 pm

    Rich, the encoding isn’t handled properly yet (as you probably gathered).

  6. Ian Davison 19 May 2005 at 8:41 pm

    Tinky understands that you want to tag the same page in different ways at different times. Why not link to tinky from holygoat.co.uk multiple times with a choice of tags and let your readers select the ones they think are most appropriate :)

  7. Richon 19 May 2005 at 10:17 pm

    I was wondering if that was the best approach :D

    It just occurred to me that this is a really dangerous opportunity for spam. Thoughts?

  8. Ian Davison 19 May 2005 at 10:57 pm

    There is a risk of spam, but tinky requires a link to be physically present on a web page somewhere so I think the risk is not that great. Simply accessing the url via a pre-seeded robot does nothing. I may decide to recrawl the database periodically and remove the links where the originating page has disappeared.

  9. Richon 19 May 2005 at 11:16 pm

    Mm, I’m thinking something along the lines of astroturfing — e.g. you could do something like Richard’s site is amazing. If you start pointing to good stuff, both those sites and your own site gets traffic (rather than some user page on del.icio.us). I.e. the more sites I point to, the more whuffie I get.

    Certainly an incentive…

  10. Dannyon 20 May 2005 at 4:44 pm

    Ooh, what a lot of comments…mine is - very nice indeed!!
    The intersection of concepts bit sounds spot on.

    (A maven is a small furry animal, righht?)

  11. Dannyon 20 May 2005 at 4:57 pm

    Quick favour? I just had to do a couple of unnecessary clicks to subscribe on bloglines, any chance of adding to the [head] (I think this is the syntax) : [link rel="alternate" type="application/rss+xml" title="RSS" href="http://tinky.org/rss"]

  12. Peter Joneson 21 May 2005 at 12:05 pm

    Very cool. I’ve just been musing as to whether the URI syntax could be made more exciting. I know SKOS does URIs for Booleans, so it occurred to me that you could have something like a NOT operator, e.g.
    rdf:about=”http://tinky.org/tag/api,blogs,!documentation,geolocation,!webapp,webservice”
    I haven’t checked whether that is a legal URI, just suggesting the idea. Maybe it messes with skos:broader though.

  13. Jay Fienbergon 21 May 2005 at 7:54 pm

    Brilliant and very inspiring. I love the simplicity of it!!

  14. Tinky
    Ian Davis over at Internet Alchemy has written Tinky, a tagging service along the lines of del.icio.us.

  15. tinky ogleon 20 Jun 2005 at 3:17 pm

    My name is tinky and many people have told me that tinky means tiny but i actually agree that it comes from tinker bell a little fairy or girl.Anyway tinky does not have that much of a meaning.

  16. karl Duboston 20 Jun 2005 at 6:28 pm

    Excellent :) That’s very exciting.

  17. Nicolas Hoizeyon 20 Jun 2005 at 8:26 pm

    This is a great idea!

    When you say that “tinky fetches the page they came from and scrapes the text used in the link [and it] becomes the title of the tagged link in tinky”, does it mean that I can’t put the link only in my RSS feeds? Has it to be on a web page?

  18. Asa Liedholmon 28 Jun 2005 at 4:46 am

    abstract rude

    Tinky and SKOS