Cover yourself in grass!

Testing YouTube blogging interface…

Doxory FOAF and OpenID


Doxory FOAF
Originally uploaded by danbri.

Just took a look at Doxory.com, a site that lets your friends run your life. First thing: it’s a joy not to be asked to think of a new username and password: you can login with OpenID. In my case, this means I’ll use LiveJournal. Secondly, it’ll check for friends it knows about who are in any FOAF file you specify (wish I knew exactly how it did this…). So that’s pretty cool. Also I’m reminded how forward-thinking Live Journal are: OpenID, FOAF and – recently – Jabber too.

(via metazool)


Worlds within worlds
Originally uploaded by danbri.

Somehow this is my most popular picture on Flickr. I have no idea why: I don’t think it is blogged or linked from anywhere else, nor does it have suggestive title or tags. Maybe it is just confusing enough that people give in to the urge and click on it, … whereas many other photos can be viewed in miniature without looking at them closely?

FOAF questions

FOAF scrawl

FOAF questions…

Are there parts of the FOAF vocabulary we should declare ‘core’, and stable (or stabilise)?

Would anyone be interested to help translate such a subset? initially the class/property labels and definitions, perhaps later, the accompanying per-term definitions? (a friend helped make a start on translating some terms into Persian, and there’s a neglected German translation lost in my 2004 mailbox somewhere too).

Are there terms which are more clutter than useful? Terms that could be relegated to an appendix? Or even (I’m wary of this) fully removed?

Are there Open Issues you’d particularly like to see addressed?

Also some practicalities: the mailing list hosting I use at the moment is hosed. There are a cluster of FOAF-related lists, of which rdfweb-dev@vapours.rdfweb.org is the most important. I’m looking for alternate hosting, that has in particular got spam-control. I’ve been experimenting with Dreamhost’s mailman installation, but it doesn’t look up to the job.

Open ended question time: which bits of the FOAF vocab would you like to see get some more attention, improvement etc., first? In particular, what should we do about the naming parts? eg. defer to an improved vcard-in-rdf spec’d
elsewhere? How about the topic stuff and relationship to SKOS?
FOAF’s been having a little rest for a year or so, but it’s time to dust things down and see where a little time could most usefully be spent…

Thanks for any thoughts :)

Who, what, where, when?

A “Who? what? where? when?” of the Semantic Web is taking shape nicely.

Danny Ayers shows some work with FOAF and the hCard microformat, picking up a theme first explored by Dan Connolly back in 2000: inter-conversion between RDF and HTML person descriptions. Danny generates hCards from SPARQL queries of FOAF, an approach which would pair nicely with GRDDL for going in the other direction.

Meanwhile at W3C, the closing days of the SW Best Practices Group have recently produced a draft of an RDF/OWL Representation of Wordnet. Wordnet is a fantastic resource, containing descriptions of pretty much every word in the English language. Anyone who has spent time in committees, deciding which terms to include in some schema/vocabulary, must surely feel the appeal of a schema which simply contains all possible words. There are essentially two approaches to putting Wordnet into the Semantic Web. A lexically-oriented approach, such as the one published at W3C for Wordnet 2.0, presents a description of words. It mirrors the structure of wordnet itself (verbs, nouns, synsets etc.). Consequently it can be a complete and unjudgemental reflection into RDF of all the work done by the Wordnet team.

The alternate, and complementary, approach is to explore ways of projecting the contents of Wordnet into an ontology, so that category terms (from the noun hierarchy) in Wordnet become classes in RDF. I made a simplistic approach at this some time back (see overview). It has appeal (alonside the linguistic version) because it allows RDF to be used to describe instances of classes for each concept in wordnet, with other properties of those instances. See WhyWordnetIsCool in the FOAF wiki for an example of Wordnet’s coverage of everyday objects.

So, getting Wordnet moving into the SW is great step. It gives us URIs to identify a huge number of everyday concepts. It’s coverage isn’t complete, and it’s ontology is kinda quirky. Aldo Gangemi and others have worked on tidying up the hierarchy; I believe only for version 1.6 of Wordnet so far. I hope that work will eventually get published at W3C or elsewhere as stable URIs we can all use.

In addition to Wordnet there are various other efforts that give types that can be used for the “what” of “who/what/where/when”. I’ve been talking with Rob McCool about re-publishing a version of the old TAP knowledge base. The TAP project is now closed, with Rob working for Yahoo and Guha at Google. Stanford maintain the site but aren’t working on it. So I’ve been working on a quick cleanup (wellformed RDF/XML etc.) of TAP that could get it into more mainstream use. TAP, unlike Wordnet, has more modern everyday commercial concepts (have a look), as well as a lot of specific named instances of these classes.

Which brings me to (Semantic) Wikipedia; another approach to identifying things and their types on the Semantic Web. A while back we added isPrimaryTopicOf to FOAF, to make it easier to piggyback on Wikipedia for RDF-identifying things that have Wiki (and other) pages about them. The Semantic Mediawiki project goes much much further in this direction, providing a rich mapping (classes etc.) into RDF for much of Wikipedia’s more data-oriented content. Very exciting, especially if it gets into the main codebase.

So I think the combination of things like Wordnet, TAP, Wikipedia, and instance-identifying strategies such as “isPrimaryTopicOf”, will give us a solid base for identifying what the things are that we’re describing in the Semantic Web.

And regarding. “Where?” and “when?” … on the UI front, we saw a couple of announcements recently: OpenLayers v1.0, which provides Google-maps-like UI functionality, but opensource and standards friendly. And for ‘when’, a similar offering: the timeline widget. This should allow for fancy UIs to be wired in with RDF calendar or RDF-geo tagged data.

Talking of which… good news of the week: W3C has just announced a Geo incubator group (see detailed charter), whose mission includes updates for the basic Geo (ie. lat/long etc) vocabulary we created in the SW Interest Group.

Ok, I’ve gone on at enough length already, so I’ll talk about SKOS another time. In brief – it fits in here in a few places. When extended with more lexical stuff (for describing terms, eg. multi-lingual thesauri) it could be used as a base for representing the lexically-oriented version of Wordnet. And it also fits in nicely with Wikipedia, I believe.

Last thing, don’t get me wrong — I’m not claiming these vocabs and datasets and bits of UI are “the” way to do ‘who/what/where/when’ on the Semantic Web. They’re each one of several options. But it is great to have a whole pile of viable options at last :)

SPARQL for vocabulary management: theory vs practice

I’ve lately been thinking about whether the named graph support in SPARQL can help us evolve vocabularies and associated code (eg. generators and translators) in parallel, so that we know when the RDF generators are emitting markup that uses properties which aren’t yet documented in the ontology; or when the ontology contains terms that aren’t being used in any actual data.

Here is a quick example in terms of FOAF, in a form that should run directly with Jena’s ARQ commandline tool. The query shown here takes a handful of specified FOAF files and compares their property usage with information about those properties in the RDF/OWL description of the FOAF spec. Query copied below, followed by the results. This is a pretty simple query; there are lots of related ideas we might explore. What I’d like to figure out (help welcomed!) is quite how to check for properties in instance data that don’t have corresponding definitions in the ontology. I expect it has something to do with ‘unbound’, …

Anyway, some basic FOAF-related querying for now:


PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX vs: <http://www.w3.org/2003/06/sw-vocab-status/ns#>

# Experiment with using SPARQL to compare actual property usage
# with the property declarations in FOAF. This query asks which
# properties are in use, and gets their label from the FOAF spec.
# Q: how to do the contrary, and specify which deployed properties
# are not in the spec?

PREFIX danbri: <http://danbri.org/foaf.rdf>
PREFIX libby: <http://swordfish.rdfweb.org/people/libby/rdfweb/webwho.xrdf>
PREFIX kanzaki: <http://www.kanzaki.com/info/webwho.rdf>
PREFIX edd: <http://heddley.com/edd/foaf.rdf>
PREFIX inkel: <http://purl.org/net/inkel/inkel.foaf.rdf>
PREFIX mattb: <http://www.picdiary.com/foaf.rdf>

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?prop ?label ?graph ?status

FROM NAMED foaf:
FROM NAMED danbri:
FROM NAMED libby:
FROM NAMED kanzaki:
FROM NAMED edd:
FROM NAMED inkel:
FROM NAMED mattb:

WHERE {
GRAPH foaf: {
{ ?prop rdf:type ?t }
FILTER (?t = owl:ObjectProperty || ?t = owl:DatatypeProperty ||
?t = rdf:Property || ?t = owl:FunctionalProperty ||
?t = owl:InverseFunctionalProperty ) .
?prop rdfs:label ?label . ?prop rdfs:comment ?c .
?prop vs:term_status ?status .
}
OPTIONAL { GRAPH ?graph { ?x ?prop ?y . } }
FILTER ( ?graph != foaf: )
}
ORDER BY ?prop

This gives the following results using ARQ (sparql --query on the commandline):

---------------------------------------------------------------------------------------------
| prop                   | label                                    | graph    | status     |
=============================================================================================
| foaf:aimChatID         | "AIM chat ID"                            | danbri:  | "testing"  |
| foaf:aimChatID         | "AIM chat ID"                            | edd:     | "testing"  |
| foaf:based_near        | "based near"                             | inkel:   | "unstable" |
| foaf:based_near        | "based near"                             | mattb:   | "unstable" |
| foaf:based_near        | "based near"                             | kanzaki: | "unstable" |
| foaf:currentProject    | "current project"                        | inkel:   | "testing"  |
| foaf:currentProject    | "current project"                        | libby:   | "testing"  |
| foaf:currentProject    | "current project"                        | kanzaki: | "testing"  |
| foaf:depiction         | "depiction"                              | inkel:   | "testing"  |
| foaf:depiction         | "depiction"                              | libby:   | "testing"  |
| foaf:depiction         | "depiction"                              | danbri:  | "testing"  |
| foaf:depiction         | "depiction"                              | mattb:   | "testing"  |
| foaf:depiction         | "depiction"                              | kanzaki: | "testing"  |
| foaf:depiction         | "depiction"                              | edd:     | "testing"  |
| foaf:depicts           | "depicts"                                | edd:     | "testing"  |
| foaf:family_name       | "family_name"                            | inkel:   | "testing"  |
| foaf:firstName         | "firstName"                              | inkel:   | "testing"  |
| foaf:gender            | "gender"                                 | kanzaki: | "testing"  |
| foaf:givenname         | "Given name"                             | inkel:   | "testing"  |
| foaf:holdsAccount      | "holds account"                          | kanzaki: | "unstable" |
| foaf:homepage          | "homepage"                               | inkel:   | "stable"   |
| foaf:homepage          | "homepage"                               | danbri:  | "stable"   |
| foaf:homepage          | "homepage"                               | mattb:   | "stable"   |
| foaf:homepage          | "homepage"                               | kanzaki: | "stable"   |
| foaf:homepage          | "homepage"                               | edd:     | "stable"   |
| foaf:icqChatID         | "ICQ chat ID"                            | inkel:   | "testing"  |
| foaf:img               | "image"                                  | danbri:  | "testing"  |
| foaf:img               | "image"                                  | mattb:   | "testing"  |
| foaf:img               | "image"                                  | kanzaki: | "testing"  |
| foaf:img               | "image"                                  | edd:     | "testing"  |
| foaf:interest          | "interest"                               | inkel:   | "testing"  |
| foaf:interest          | "interest"                               | libby:   | "testing"  |
| foaf:interest          | "interest"                               | kanzaki: | "testing"  |
| foaf:isPrimaryTopicOf  | "is primary topic of"                    | danbri:  | "testing"  |
| foaf:jabberID          | "jabber ID"                              | inkel:   | "testing"  |
| foaf:jabberID          | "jabber ID"                              | danbri:  | "testing"  |
| foaf:knows             | "knows"                                  | inkel:   | "testing"  |
| foaf:knows             | "knows"                                  | libby:   | "testing"  |
| foaf:knows             | "knows"                                  | danbri:  | "testing"  |
| foaf:knows             | "knows"                                  | mattb:   | "testing"  |
| foaf:knows             | "knows"                                  | kanzaki: | "testing"  |
| foaf:knows             | "knows"                                  | edd:     | "testing"  |
| foaf:made              | "made"                                   | danbri:  | "testing"  |
| foaf:made              | "made"                                   | kanzaki: | "testing"  |
| foaf:maker             | "maker"                                  | inkel:   | "testing"  |
| foaf:maker             | "maker"                                  | libby:   | "testing"  |
| foaf:maker             | "maker"                                  | kanzaki: | "testing"  |
| foaf:maker             | "maker"                                  | edd:     | "testing"  |
| foaf:mbox              | "personal mailbox"                       | inkel:   | "stable"   |
| foaf:mbox              | "personal mailbox"                       | libby:   | "stable"   |
| foaf:mbox              | "personal mailbox"                       | danbri:  | "stable"   |
| foaf:mbox              | "personal mailbox"                       | kanzaki: | "stable"   |
| foaf:mbox              | "personal mailbox"                       | edd:     | "stable"   |
| foaf:mbox_sha1sum      | "sha1sum of a personal mailbox URI name" | inkel:   | "testing"  |
| foaf:mbox_sha1sum      | "sha1sum of a personal mailbox URI name" | libby:   | "testing"  |
| foaf:mbox_sha1sum      | "sha1sum of a personal mailbox URI name" | danbri:  | "testing"  |
| foaf:mbox_sha1sum      | "sha1sum of a personal mailbox URI name" | mattb:   | "testing"  |
| foaf:mbox_sha1sum      | "sha1sum of a personal mailbox URI name" | kanzaki: | "testing"  |
| foaf:mbox_sha1sum      | "sha1sum of a personal mailbox URI name" | edd:     | "testing"  |
| foaf:msnChatID         | "MSN chat ID"                            | inkel:   | "testing"  |
| foaf:msnChatID         | "MSN chat ID"                            | danbri:  | "testing"  |
| foaf:myersBriggs       | "myersBriggs"                            | danbri:  | "testing"  |
| foaf:myersBriggs       | "myersBriggs"                            | mattb:   | "testing"  |
| foaf:myersBriggs       | "myersBriggs"                            | kanzaki: | "testing"  |
| foaf:myersBriggs       | "myersBriggs"                            | edd:     | "testing"  |
| foaf:name              | "name"                                   | inkel:   | "testing"  |
| foaf:name              | "name"                                   | libby:   | "testing"  |
| foaf:name              | "name"                                   | danbri:  | "testing"  |
| foaf:name              | "name"                                   | mattb:   | "testing"  |
| foaf:name              | "name"                                   | kanzaki: | "testing"  |
| foaf:name              | "name"                                   | edd:     | "testing"  |
| foaf:nick              | "nickname"                               | inkel:   | "testing"  |
| foaf:nick              | "nickname"                               | libby:   | "testing"  |
| foaf:nick              | "nickname"                               | danbri:  | "testing"  |
| foaf:nick              | "nickname"                               | mattb:   | "testing"  |
| foaf:nick              | "nickname"                               | kanzaki: | "testing"  |
| foaf:nick              | "nickname"                               | edd:     | "testing"  |
| foaf:pastProject       | "past project"                           | inkel:   | "testing"  |
| foaf:pastProject       | "past project"                           | kanzaki: | "testing"  |
| foaf:plan              | "plan"                                   | danbri:  | "testing"  |
| foaf:plan              | "plan"                                   | kanzaki: | "testing"  |
| foaf:primaryTopic      | "primary topic"                          | inkel:   | "testing"  |
| foaf:primaryTopic      | "primary topic"                          | kanzaki: | "testing"  |
| foaf:primaryTopic      | "primary topic"                          | edd:     | "testing"  |
| foaf:publications      | "publications"                           | kanzaki: | "unstable" |
| foaf:schoolHomepage    | "schoolHomepage"                         | danbri:  | "testing"  |
| foaf:schoolHomepage    | "schoolHomepage"                         | kanzaki: | "testing"  |
| foaf:schoolHomepage    | "schoolHomepage"                         | edd:     | "testing"  |
| foaf:surname           | "Surname"                                | inkel:   | "testing"  |
| foaf:thumbnail         | "thumbnail"                              | danbri:  | "testing"  |
| foaf:title             | "title"                                  | kanzaki: | "testing"  |
| foaf:weblog            | "weblog"                                 | inkel:   | "testing"  |
| foaf:weblog            | "weblog"                                 | libby:   | "testing"  |
| foaf:weblog            | "weblog"                                 | mattb:   | "testing"  |
| foaf:weblog            | "weblog"                                 | kanzaki: | "testing"  |
| foaf:weblog            | "weblog"                                 | edd:     | "testing"  |
| foaf:workplaceHomepage | "workplace homepage"                     | inkel:   | "testing"  |
| foaf:workplaceHomepage | "workplace homepage"                     | libby:   | "testing"  |
| foaf:workplaceHomepage | "workplace homepage"                     | danbri:  | "testing"  |
| foaf:workplaceHomepage | "workplace homepage"                     | mattb:   | "testing"  |
| foaf:workplaceHomepage | "workplace homepage"                     | edd:     | "testing"  |
| foaf:yahooChatID       | "Yahoo chat ID"                          | inkel:   | "testing"  |
---------------------------------------------------------------------------------------------


adam-dan-jubillee-shirt
Originally uploaded by danbri.

Posted a load of scanned old photos to Flickr. I like this one of me and Adam a lot. Well loads of them are great, very pleased I finally got around to this…

Flock browser STDOUT

removeCollection (rdf:#$YjOBY1)

REMOVING COLLECTION CHILDREN
REMOVING COLLECTION PROPERTIES
REMOVE COLLECTION TYPE
REMOVING COLLECTION FROM COLLECTIONSROOT
REMOVE RDF CRAP
removeCollection ends
IT *IS* A CONTAINER!
IT *IS* A CONTAINER!
IT *IS* A CONTAINER!