SIOC: mise en œuvre
Décrire un forum avec SIOC
Les spécifications SIOC définissent la description RDF des communautés connectées (blogs, forums, wikis, etc.)
Elle permettent de décrire les interconnexions entre toutes les activités sociales publiques associées à des personnes.
Voyons comment mettre en place concrètement ces spécifications.
Les classes
La spécification SIOC définit les classes suivantes :
Community : communauté d'utilisateurs ;
Container : classe générique définissant un sous-
élément de Space, i.e un forum, un fil de discussion, etc. Forum : classe spécifique définissant un forum, dérivée de la classe générique Container ;
Item : classe générique définissant un document au sens général, i.e un post de forum, un article de wiki, etc.
Post : classe spécifique définissant un post dans un forum, dérivée de la classe générique Item ;
Role : rôle d'un utilisateur (Administrator, Guest, Moderator, Registered_User, Banned_User) ;
Site : classe spécifique pour définir un site, dérivée de la classe générique Space ;
Space : classe générique définissant un espace de travail (classe racine), qui peut être un site web, un carnet d'adresses, un calendrier, etc.
Thread : classe spécifique dérivée de Container qui définit un fil de discussion ;
UserAccount : utilisateur; en réalité le compte d'un utilisateur, c'est-à-dire une personne ayant déjà une définition ailleurs (FOAF, …);
Usergroup : groupe d'utilisateurs ;
Qui intéragissent de la façon suivante :
Voyons comment utiliser les spécifications SIOC.
Description
Pour notre exemple de mise en œuvre, nous prendrons l'exemple concret et courant du forum de discussions.
Avertissement
Bien que nous décrivions un forum dans nos exemples et que le forum possède des classes spécifiques pour le décrire, nous nous reposerons sur les classes génériques, ce qui permet de générer un code qui pourra facilement s'adapter à d'autres contextes, plus génériques. Bien entendu, l'usage des classes spécifiques aux forums reste valable.
Les espaces de noms
En plus des espaces de noms spécifiques au RDF/XML :
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
Il convient d'ajouter les espaces suivants, définissant le SIOC :
xmlns:sioc="http://rdfs.org/sioc/ns#"
xmlns:sioct="http://rdfs.org/sioc/types#"
xmlns:sioca="http://rdfs.org/sioc/access#"
xmlns:siocs="http://rdfs.org/sioc/services#"
xmlns:siocarg="http://rdfs.org/sioc/argument#"
Les utilisateurs
Les comptes
Les utilisateurs sont définis de la façon suivante :
<sioc:UserAccount rdf:about="http://users/1/1">
<sioc:id>c44e74aaeb6837713a97d6ef3130b16529f78c9f</sioc:id>
<sioc:account_of rdf:resource="http://moi.foaf.rdf"/>
<sioc:has_function rdf:resource="http://roles/1"/>
</sioc:UserAccount>
<sioc:UserAccount rdf:about="http://users/1/2">
<sioc:account_of rdf:resource="http://toi.foaf.rdf"/>
</sioc:UserAccount>
[…]
sioc:UserAccount : définition de l'utilisateur lui-même, c'est-à-dire un compte d'utilisateur dans l'espace de travail.
sioc:account_of : renvoie vers la description de la personne en question. Ici, des descriptions FOAF des utilisateurs.
sioc:has_function : renvoie vers le rôle de la personne dans l'espace de travail.
sioc:id : identifiant de l'objet sioc:UserAccount.
Si une même personne a plusieurs rôles dans des espaces différents, elle doit avoir un compte pour chaque espace. Cependant, si elle a le même rôle dans plusieurs espaces, ceux-ci peuvent partager le même compte.
Du côté de la description FOAF, le compte du forum sera défini, par exemple, de la façon suivante :
<foaf:holdsAccount>
<foaf:OnlineAccount rdf:about="http://lien/vers/le_compte">
<foaf:accountServiceHomepage rdf:resource="http://my-forum/"/>
<foaf:accountName>le_compte</foaf:accountName>
<foaf:name>Nom du service</foaf:name>
<foaf:thumbnail rdf:resource="http://lien/vers/service_favicon.jpg"/>
</foaf:OnlineAccount>
</foaf:holdsAccount>
Les groupes
Un groupe d'utilisateurs est un ensemble d'utilisateurs ayant accès à un espace (Space).
Les groupes d'utilisateurs sont définis de la façon suivante :
<sioc:Usergroup rdf:about="http://users/1">
<sioc:has_member rdf:resource="http://users/1/1"/>
<sioc:has_member rdf:resource="http://users/1/2"/>
</sioc:Usergroup>
sioc:Usergroup : définition du groupe lui-même.
sioc:has_member : renvoie vers un membre du groupe. Un utilisateur peut appartenir à plusieurs groupe (avec des rôles différents dans chaque groupe).
Les permissions
Un rôle est associé à une ou plusieurs permissions. La classe Permission
est définie dans http://rdfs.org/sioc/access#. :
<sioca:Permission rdf:about="http://permission/1" rdfs:label="Read"/>
<sioca:Permission rdf:about="http://permission/3" rdfs:label="Create"/>
<sioc:Permission rdf:about="http://permission/2" rdfs:label="Write"/>
Il est possible de définir ses propres ermissions, bien entendu, ou utiliser ce qui existe. Pour cela, le lus est d'utiliser des recommandations du W3C.
Ces recommandations peuvent être directement utilisées dans le document, en ajoutant la référence :
xmlns:acl="http://www.w3.org/ns/auth/acl#"
Elle définit les accès suivants :
Read : lecture du contenu (y compris le requêtage);
Write : modification du contenu (y compris la suppression et la modification d'une partie);
Append : ajout d'une information à la fin, mais sans possiblité de suppression;
Control : définition la liste de contrôle d'accès pour eux-mêmes.
Les accès à un agent sont donnés de la façon suivante :
<acl:Authorization>
<acl:mode rdf:resource="http://www.w3.org/ns/auth/acl#Read"/>
<acl:mode rdf:resource="http://www.w3.org/ns/auth/acl#Write"/>
<acl:mode rdf:resource="http://www.w3.org/ns/auth/acl#Control"/>
<acl:accessTo rdf:resource="http://my-forum/1"/>
<acl:agent rdf:resource="http://link.to.me/foaf#me"/>
</acl:Authorization>
Les rôles
La classe Role
définit les rôles affectés à une personne sur un élément (site, forum, etc.). Un rôle possède des permissions grâce à has_permission (défini http://rdfs.org/sioc/access#).
Les rôles sont définis de la façon suivante :
<sioc:Role rdf:about="http://roles/1" rdfs:label="Admin">
<sioca:has_permission rdf:resource="http://permission/1"/>
<sioca:has_permission rdf:resource="http://permission/2"/>
[…]
</sioc:Role>
<sioc:Role rdf:about="http://roles/2" rdfs:label="Moderator">
…
Le rôle est appliqué grâce à has_scope (défini dans http://rdfs.org/sioc/ns#, mais en cours de migration dans http://rdfs.org/sioc/access#) ou son inverse scope_of appliqué à la ressource.
<sioc:Role rdf:about="http://roles/1" rdfs:label="Admin">
<sioca:has_permission rdf:resource="http://permission/1"/>
<sioca:has_permission rdf:resource="http://permission/2"/>
<sioc:has_scope rdf:resource="http://forum/1"/>
[…]
</sioc:Role>
Par exemple, on pourra définir les rôles suivants :
Administrator : Read, Write, Append, Control;
Guest : Read, Append (ou juste Read);
Moderator : Read, Append, Control;
Registered_User : Read, Write, Append (ou juste Read, Write);
Banned_User : (rien)
…
Une personne possède un rôle grâce à has_function.
Le contenu
Le contenu correspond aux informations en elles-mêmes, c'est-à-dire les messages déposés sur le forum par les utilisateurs.
Ils sont définis par la classe Item (ou la classe spécifique Post) de la façon suivante :
<sioc:Item rdf:about="http://my-forum/1/20015/1" rdf:type="sioct:Comment">
<sioc:id>c44e74aaeb6837713a97d6ef3130b16529f78c9f</sioc:id>
<sioc:name>Message 1</sioc:name>
<sioc:has_creator rdf:resource="http://users/1/2"/>
<sioc:has_container rdf:resource="http://my-forum/1/20015"/>
<sioc:content rdf:resource="http://my-forum/1/20015.html"/>
<sioc:has_reply rdf:resource="http://my-forum/1/20015/2"/>
</sioc:Item>
<sioc:Item rdf:about="http://my-forum/1/20015/2" rdf:type="sioct:Comment">
<dc:title>Message 2</dc:title>
<sioc:name>Message 2</sioc:name>
<sioc:has_creator rdf:resource="http://users/1/1"/>
<sioc:has_container rdf:resource="http://my-forum/1/20015"/>
<sioc:reply_of rdf:resource="http://my-forum/1/20015/1"/>
<sioc:content rdf:parseType="Literal">
<div xmlns="http://www.w3.org/1999/xhtml">
<h1>Un exemple de post</h1>
<p>Et ici aussi.</p>
</div>
</sioc:content>
<sioc:attachment rdf:resource="http://link_to_the_document" rdfs:label="Ma source"/>
<sioc:topic rdfs:label="Sujet" rdf:resource="http://link_to_topic" rdf:type="sioct:Tag"/>
</sioc:Item>
sioc:Item : Item de type Post, ou plus exactement de type Comment, qui est une propriété de Post. Par transitivité, Item devient un Post. Les types de Post disponibles sont : BlogPost, BoardPost, Comment, InstantMessage, MailMessage, MicroblogPost, WikiArticle.
sioc:name : titre du message. Vous pouvez aussi utiliser dc:title conjointement ou en remplacement.
sioc:has_creator : créateur du message; renvoie à l'utilisateur qui a posté le message.
sioc:has_container : forum ou fil de discussion auquel le message appartient. Vous pouvez tout à fait employer sioc:Forum et/ou sioc:Thread pour décrire cette ressource. Plus généralement, lien Container - Item. Ce lien permet de remonter d'un niveau dans l'arborescence.
sioc:reply_of : indique que le message est une réponse à un autre message.
sioc:has_reply : indique que le message possède une réponse.
sioc:attachment : document attaché au message.
sioc:id : identifiant de l'objet sioc:Item.
sioc:topic : sujet relié au message. il peut être de type sioct:Tag pour un tag, ou de type sioct:Category pour un catégorie.
sioc:content : corps du message. Peut être soit une ressource externe, soit un contenu inclus dans le RDF.
Remarque à propos de sioc:content
rdf:parseType="Literal" permet de définir un type Literal
, c'est-à-dire contenant autre chose que du texte simple. Ce type est très utile lorsqu'il s'agit d'inclure du code HTML dans le sioc:content.
Bien entendu, la définition :
<sioc:Post rdf:about="http://my-forum/1/20015/1" rdf:type="sioct:Comment">
[…]
</sioc:Post>
<sioc:Post rdf:about="http://my-forum/1/20015/2" rdf:type="sioct:Comment">
[…]
</sioc:Post>
est tout à fait possible.
Remarque
Vous remarquerez que le contenu (sioc:content) peut, bien évidemment, être un lien vers une ressource externe. Ce lien peut pointer sur une ressource locale ou distante. Ce qui signifie que plusieurs sioc:Item peuvent pointer sur le même contenu. Par exemple, une personne déposant un message sur un forum pourrait très bien déposer le même message sur un autre forum, mais plutôt que de dupliquer le contenu, elle se contenterait juste de le désigner par un lien. Ainsi, toute modification du contenu serait automatiquement disponible dans tous les autres forums.
De la même façon, une personne répondant sur un forum à un message pourrait utiliser le contenu du message d'une autre personne, sur un autre forum.
La structure
La structure définit l'organisation même de l'espace de travail et de ses sous éléments. Dans le cas d'un forum : son site (sioc:Site), le forum (sioc:Forum) en lui-même et les fils de discussion (sioc:Thread).
Elle est définie de la façon suivante :
L'espace de travail
Défini par sioc:Space, il n'a aucune propriété particulière. C'est juste une enveloppe sans type particulier. C'est le contenu qui en fera quelque chose d'unique. Il rassemble des utilisateurs, des documents est une structure. Un espace de travail est décrit de la façon suivante :
<sioc:Space rdf:about="http://my-forum">
<sioc:name>Espace 1</sioc:name>
<sioc:has_usergroup rdf:resource="http://users/1"/>
<sioc:has_administrator rdf:resource="http://users/1/1"/>
<sioc:space_of rdf:resource="http://my-forum/1"/>
<sioc:space_of rdf:resource="http://my-forum/2"/>
[…]
</sioc:Space>
sioc:Space : l'espace de travail en lui-même. Pourrait tout aussi bien être sioc:Site.
sioc:name : nom de l'espace de travail (ou du site).
sioc:has_usergroup : groupe d'utilisateurs ayant accès à l'espace.
sioc:has_administrator : administrateur du site ; renvoie vers un utilisateur.
sioc:space_of : espace contenant un sous-élément (forum, etc.). L'inverse est (au niveau du sous-élément) sioc:has_space.
Cependant, si une machine arrive à comprendre la définition de sioc:Space et suivre les liens, les informations présentes ne permettent pas un affichage utile à un humain. Rien ne renseigne le nom ou le type de sioc:space_of. il faut donc, au minimum, pour chaque sioc:Container sous-jacent, indiquer a minima le premier niveau d'informations :
<sioc:Space rdf:about="http://my-forum">
<sioc:name>Espace 1</sioc:name>
<sioc:has_usergroup rdf:resource="http://users/1"/>
<sioc:has_administrator rdf:resource="http://users/1/1"/>
<sioc:space_of>
<sioc:Container rdf:resource="http://my-forum/1" rdf:type="sioct:ArgumentativeDiscussion">
<sioc:name>Forum 1</sioc:name>
</sioc:Container>
</sioc:space_of>
<sioc:space_of>
<sioc:Container rdf:resource="http://my-forum/2" rdf:type="sioct:ArgumentativeDiscussion">
<sioc:name>Forum 2</sioc:name>
</sioc:Container>
</sioc:space_of>
[…]
</sioc:Space>
Le(s) forum(s)
<sioc:Container rdf:about="http://my-forum/2" rdf:type="sioct:ArgumentativeDiscussion">
<sioc:has_space rdf:resource="http://my-forum"/>
<sioc:feed rdf:resource="http://my-forum/feeds/1"/>
<sioc:has_parent rdf:resource="http://my-forum/1"/>
<sioc:parent_of rdf:resource="http://my-forum/3"/>
<sioc:has_moderator rdf:resource="http://users/1/1"/>
<sioc:name>Forum 1</sioc:name>
</sioc:Container>
sioc:Container : Container de type forum, ou plus exactement de type sioct:ArgumentativeDiscussion. sioct:ArgumentativeDiscussion est une propriété de forum. Par transitivité, Container est donc un forum. Les types de forum disponibles sont : ArgumentativeDiscussion, ChatChannel, MailingList, MessageBoard, Microblog, Weblog.
sioc:has_space : renvoie à l'espace de travail qui le contient. L'inverse (au niveau sioc:Space) est sioc:space_of.
Dans le cas d'une classe spécifique, nous utiliserions sioc:Site avec le lien sioc:has_host.
sioc:has_parent : Container parent. Permet de décrire une arborescence, notamment dans le cas des usages de Thread. En général, sioc:has_parent est unique, mais nous pourrions imaginer, dans un cas général, qu'il pourrait en avoir plusieurs.
Plus généralement, sioc:has_parent permet de décrire un lien Container - Container.
sioc:parent_of : Container fils. Permet de décrire une arborescence, notamment dans le cas des usages de Thread. Il peut y en avoir plusieurs. Un Forum peut contenir plusieurs Thread, un Thread peut contenir plusieurs autres Thread, etc.
sioc:feed : Lien vers le fils RSS, Atom du forum (ou site).
sioc:has_moderator : modérateur du site; renvoie à l'utilisateur qui est le modérateur. Il peut y avoir plusieurs modérateurs pour un forum, bien entendu.
sioc:name : nom du forum.
Le(s) fil(s) de discussion
Comme nous utilisons des classes génériques, la définition d'un fil de discussion ressemble étonnement à un forum. Seul le type a changé :
<sioc:Container rdf:about="http://my-forum/1/20015" rdf:type="sioc:Thread">
<sioc:has_space rdf:resource="http://my-forum"/>
<sioc:has_parent rdf:resource="http://my-forum/1"/>
<sioc:parent_of rdf:resource="http://my-forum/3"/>
<sioc:name>Thread 1</sioc:name>
</sioc:Container>
sioc:name : nom/titre du fil.
sioc:has_space : l'espace de travail, un lien direct pour remonter à la racine (i.e. Home). Il permet de faciliter la navigation.
sioc:Container : le fil de discussion en lui-même. Pourrait tout aussi bien être sioc:Thread.
sioc:has_parent : Container parent. Permet de décrire une arborescence, notamment dans le cas des usages de Thread. En général, sioc:has_parent est unique, mais nous pourrions imaginer, dans un cas général, qu'il pourrait en avoir plusieurs.
Mise en œuvre
La base de données
En général, derrière la plupart des forums et des blogs, il y a une base de données (relationnalle dans la majorité des cas.
Or, un des fondements de la base de données relationelle est la non-redondance des informations.
Si nous utilisons un systême fondé sur une base de données puis que nous générons les fichiers RDF, alors nous avons les informations en double. Le principe même du RDF est de considérer Internet comme une base de données distribuée.
Il convient donc d'utiliser (ou développer) un systême utilisant les fichiers RDF pour stocker et utiliser les informations comme le ferait une base de données classique.
Dans ce cas, il conviendra de faire attention car une base de données standard possède des mécanismes spécifiques afin de garantir l'intégrité des données (ACID, ….). Il faudra respecter les mêmes contraintes.