July 28, 2003
Foaf grouping
Foaf isn't just for exchanging lists of people. It can be used to exchange lists of organizations and groups as well. For example, I can set up a group and list it's members like so:<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:foaf="http://xmlns.com/foaf/0.1/" > <foaf:Group rdf:about="http://example.com/this/groups/foaf.rdf"> <rdfs:seeAlso rdf:resource="http://example.com/this/groups/foaf.rdf"/> <!-- other group-related statements would be made here --> <!-- any number of foaf:member elements would repeat here --> <foaf:member rdf:nodeID="wkearney99"/> </foaf:Group> <foaf:Person rdf:nodeID="wkearney99"> <foaf:name>Bill Kearney</foaf:name> <foaf:mbox_sha1sum>98783d46199c7733d0e452c93ba0cff0baa4b61b</foaf:mbox_sha1sum> <rdfs:seeAlso rdf:resource="http://www.ideaspace.net/users/wkearney/foaf.xrdf"/> </foaf:Person> <!-- we might also want to use web-of-trust to digitally sign this file --> </rdf:RDF>
Here I'm making several statements. I'm saying that the 'wkearney99' node is a member of this group. I'm then going on to say that the wkearney99 node is known to the group via an SHA1 hash of it's e-mail address and that it has a foaf file of it's own at the seeAlso URL. It's also saying the group has it's own URL. This helps if something else using the group wants to confirm things about the group.
The group is making no other statments about the wkearney99 user. It's letting the foaf file indicated via seeAlso make any additional statements. The statements made here are for convenience sake. Technically I could have used just the seeAlso URL and nothing else. That'd would be, perhaps, better in that it would leave any and all definitions about the wkearney99 user to it's own FoaF file. But given that I'd like to make the file at least slightly human-readable I'm making the statement that I know of an e-mail address for the user and a display name. Making any other statements about the user would be sort of inappropriate. Those statements might be contradicted by the users own foaf file and, well, there's no need for us to make any additional statements about them in the context of them belonging to the group. That the group knows their name, foaf URL and has a hash of their e-mail should be more than enough.
Now, if the group had it's own information like membership status, joining dates, ranking or something else, it would be appropriate to make those statements here. I'm left wondering, however, if making the statements in the non-hierarchically arranged structure does or doesn't convey the right provenance. I'd want to be able to allow software that's reading these files to understand that the group itself is making these 'authoritative' statements about it's members. Does the encapsulation of the foaf:Person and subsequent group-related metadata easily convey this authoritative sense? As in, do the members need to be stuffed into the XML hierarchical structure in order for applications to make the correct assumptions? Or is it enough to assume that since the group's document is making the statements that they convey that authority? Would it then be 'ok' to have the foaf:Person element hierarchically separate from the foaf:Group and still be detectable as being within the authority of the group?
RDF doesn't give a clear way to make these statements. This is not a problem, per se, but it does leave open a rather important set of issues. Mainly, how does one 'correctly' establish the data's provenance and authority? I think it's going to be important for general acceptance that Foaf begin paying heed to some of these important group-forming issues. Leaving them unhandled, because of possibly quagmires, will not help the situation.
What I'm after here is a clear way for things like spiders or other networking programs to intelligently be able to traverse the various URLs in ways that allow them to build up clear statements that can be confirmed.
This looks about right. Not bad since I only added foaf:member into the schema last night ;)
So a few points for discussion:
(i) we have not to date tended to use foaf:Group by having 'the' URI for the group be some RDF that describes it. Having the description see-also'd as we do with Person seems clearer than implicitly equating the Group with its RDF description.
(ii) we could make more use of foaf:homepage for a Group, maybe, and use that as a hook for our concern with provenance and suchlike. Imagine some group has an HTML homepage, we just embed a FOAF auto-discovery LINK-REL in that homepage pointing to the RDF which lists its membership. That RDF identifies and see-also's the people who make up the group.
(iii) re hierarchy, provenance and xml... the 'who said what' angle is covered much more by the authorship of the RDF (and its implicit endorsement by link-rel'ing it from relevant pages) than by the nesting structure of the XML. It doesn't really matter which tag is inside which other tag, since RDF parsers normalise all that away before passing the triples on to applications.
Some things we _don't_ yet have for foaf:Group:
- a a way of saying 'these members, and no others, are the agents that make up the group'.
(eg. a 'groupSize' property would do that job).
- a way of saying which people (and hence whose public keys) have an authoritative role w.r.t. making statements about some group. For example, we could come up with properties like 'chair' that relate groups to people.
Maybe we could trial all this with mailing lists? perhaps a hack to mailman to dump out the group membership of rdfweb-dev etc using foaf:mbox_sha1sum?
The group is making no other statments about the wkearney99 user. It's letting the foaf file indicated via seeAlso make any additional statements. The statements made here are for convenience sake. Technically I could have used just the seeAlso URL and nothing else.
Actually, that wouldn't have been enough to identify a single person, since the seeAlso'd RDF could have described several persons - as it actually does.
This is where the mbox_sha1sum comes in handy, since it's defined as an owl:InverseFunctionalProperty, that is, a property that is known to only have that specific value for a single person.
It is true however, that anything but an owl:InverseFunctionalProperty could have been left out, i.e. the foaf:name is not strictly necessary, but helps out with readability and possibly debugging...
Indeed then I suppose I'd want come up with a fragmented URL then:
http://www.ideaspace.net/users/wkearney/foaf.xrdf#wkearney99
That'd be one way to indicate exactly which element I'm referencing.
Posted by: Bill Kearney on July 29, 2003 11:31 AM






