Affichage des articles dont le libellé est jena. Afficher tous les articles
Affichage des articles dont le libellé est jena. Afficher tous les articles

03/04/2016

Convertir sqlite, xls ou ods en RDF

L'un des buts du graph http://rdf-smag0.rhcloud.com/smag.html est d'interconnecter les bases de données disparates.

Une amie m'indique qu'elle est en train de monter une base de données sur les robots... intéressant, c'est exactement ce qu'il me faut pour mon projet Smag0, et la gestion des ressources, des objets connectes...
Voyons comment l’intégrer au graph RDF :
1 : qui va mettre à jour cette base ? Cette amie ? les constructeurs ? les utilisateurs ???
-> intégrer les données au serveur Fuseki, ou un lien vers la source de données mise à jour ailleurs ?
2 : la source actuelle est un fichier robot.db
 --> comment la transformer au format RDF ? on a deux tables robots et devices
--> j'avais dejà fait des tests pour transformer XLS et ODS en RDF , donc la première idée est d'extraire les deux tables en csv, de les convertir en ods, puis d'adapter l'outil que j'avais déjà utiliser pour repasser au format rdf... --> pas simple
--> autre option a étudier : sql.js https://github.com/kripken/sql.js 


outil d'extraction ODS vers RDF basé sur Processing 2 ( pas testé avec 3) avec :
[Une librairie permettant de gérer les fichiers ODS : https://incubator.apache.org/odftoolkit/downloads.html]
La librairie Jena Apache

13/03/2016

big data facile - une application pour insérer des données sur un serveur Fuseki

[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]

Repartons de l'application Android faite avec AppInventor pour visualiser les informations de notre serveur Fuseki comme nous l'avons construite ici : http://smag0.blogspot.fr/2016/03/bigdata-facile-une-application-android.html

Si vous avez tout bien suivi, vous avez créé un écran "Saisie", et nous avons sur cette page http://smag0.blogspot.fr/2016/03/un-serveur-fuseki-rdf-bigdata-sur.html  une piste pour construire la requete que nous devons envoyer pour insérer des données :

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


INSERT DATA {
GRAPH <http://example/bookStore>
{
ex:dog1    rdf:type         ex:animal .
ex:cat1    rdf:type         ex:cat .
ex:cat     rdfs:subClassOf  ex:animal .
zoo:host   rdfs:range       ex:animal .
ex:zoo1    zoo:host         ex:cat2 .
ex:cat3    owl:sameAs       ex:cat2 .
}
}

Je rappelle que pour les flémards, le code de la première partie (récupération des données) est accessible ici : http://ai2.appinventor.mit.edu/?galleryId=4993525195735040

Les données au format RDF se présentent sous la forme de triplets, si c'est pas clair pour toi, jette un oeil là https://fr.wikipedia.org/wiki/Resource_Description_Framework .
Nous avons donc besoin de trois champs.
Dans App Inventor, passez sur l'écran "Saisie" que nous avons créé dans le tuto précédent, et insérez trois zone de texte ( on va repasser en english, car la traduction en français pose quelques problèmes lors des tests...)
Comme pour la page "Visualisation", insérons un bouton retour accueil, avec le même code que précedemment.
Ainsi que trois zones de texte, profitez-en pour les renommer, passer leur "width" à "Fill Parent" et mettre des Hint selon le contenu que l'on attend : Sujet, propriete, Objet... ça sera plus parlant pour la suite.
Oui , je sais , Sujet et Objet ont droit à la majuscule, mais pas "propriété", c'est un peu comme ça en RDF... alors gardons cette norme, ça ne peut pas faire de mal...
N'oubliez pas aussi d'ajouter un composant Web1 que vous trouverez dans Connectivity, c'est lui qui va nous faire la requête POST, mais pour ça, il va falloir lui donner la bonne requête.
Complétez par une nouvelle zone de texte, que l'on nommera "Résultat", avec Height et Width à "Fill Parent, et "Hint" à "Attente resultat".



Passons maintenant à l'envers du décor, en cliquant sur le bouton "Blocks".
Pour faire au plus simple, considérons que les trois éléments que nous allons insérer avec notre première requête, ont tous le même préfixe :  PREFIX ex:   <http://example.org/>.

Notre application devra donc envoyer la requete :

PREFIX ex:   <http://example.org/>

INSERT DATA {
GRAPH <http://example/bookStore>
{
ex:Sujet    ex:propriete         ex:Objet .
}
}

Et pour ce faire, nous aurons besoin de récupérer les valeurs qui se trouvent dans nos trois zones de texte.

Commençons par la ligne où se trouve notre triplet (ex:Sujet    ex:propriete         ex:Objet .)
Les quelques blocs suivants devraient nous faire apparaître notre ligne dans la zone de texte "Résultat" :
On initialise nos variables Sujet, propriete, Objet, ainsi que la requeteUpdate.
Au click du bouton, on concatène la chaîne "ex:" avec chacune des valeurs récupérées dans nos trois textBox.
On construit ensuite notre requeteUpdate, en joignant nos trois variables, en les séparant d'un espace .
Astuce : pour ajouter une nouvelle ligne dans un "join", cliquez sur la roue sur fond bleu.
Attention, bien mettre un espace dans les deux blocs entre "get  global Sujet " et "get global propriete" ainsi que entre les blocs "get global propriete" et "get global Objet" .
On termine notre "set global requeteUpdate" par un bloc texte qui contient un espace et un point " .", c'est ainsi qu'on termine un triplet simple en rdf.
Et pour finir, on affiche notre "global requeteUpdate" dans la zone texte "Resultat"



Pour tester, utilisez l'appli " compagnon App Inventor", et entrez un triplet rdf, par exemple :
dans Sujet : David
dans propriété : type
et dans Objet : Personne
cliquez ensuite sur "Envoyer"

Si tout se passe bien, vous devriez immédiatement voir apparaître :
ex:David ex:type ex:Personne . 
Si c'est le cas, BRAVO ! on y est presque, il suffit juste d'envoyer tout ça au serveur (http://rdf-smag0.rhcloud.com/) mais avant de pouvoir lui demander d'intégrer ces information, nous devons y mettre les formes...

L'enrobage sauvage...
Pour voir si ça marche, on va juste englober notre triplet par le strict nécessaire :
Avant notre triplet, on va mettre :
PREFIX ex:   <http://example.org/>
INSERT DATA {
GRAPH <http://example/bookStore>
{
et à près, on fermera par
}
}

C'est pas très orthodoxe, mais le principal, c'est de tester si ça marche, alors on va la faire simple, on aura tout le loisir de faire joli ensuite.
Attention.... POF :
-  une variable "debutRequete" avec comme valeur :
PREFIX ex:   <http://example.org/> INSERT DATA { GRAPH <http://example/bookStore> 
- et une variable "finRequete" avec comme valeur :
}}

Bouhhh ! c'est pas bien !!!



On complète ensuite notre "requeteUpdate", en ajoutant deux blocs :
 "get global debutRequete" (avant "get global Sujet" )
et "get global finRequete" (après le bloc " .").

Votre code devrait maintenant ressembler à ceci :


et le texte qui s'affiche dans la zone de texte "Resultat" à ceci :
PREFIX ex:   <http://example.org/> INSERT DATA { GRAPH <http://example/bookStore> ex:David ex:type ex:Personne . }}


Nous avons maintenant nos données, que nous avons mis dans une enveloppe.
Le destinataire, c'est le serveur http://rdf-smag0.rhcloud.com/, on va même être plus précis, car sa boite au lettre se trouve à l'adresse : http://rdf-smag0.rhcloud.com/update, et il va falloir envoyer à cette adresse, une requête de type POST.
Il ne reste plus qu'à mettre en place le transporteur... et c'est là qu'intervient notre composant "WEB1" que nous avions inséré au tout début de ce post...

Créons maintenant une nouvelle variable que nous nommerons "endpointUpdate" et donnons-lui la valeur de l'adresse de la boite aux lettres de notre serveur "http://rdf-smag0.rhcloud.com/ds/update"

Ensuite, on sort le bloc "set Resultat.Text" du bloc "When EnvoyerBouton.click", et à la place, on y met deux blocs : "set Web1.Url" et "Call Web1.PostText" qui vont respectivement donner à WEB1 l'adresse de destination, et la valeur du paramètre "update=".

Et bien voilà, le plus dur est fait... pas insurmontable, quand même...
juste une toute petite dernière chose, pour être sûr du résultat...
Ajouter un bloc "When Web1.gotText" qui s'exécutera dès que la réponse du serveur arrivera... avec à l'intérieur, l'affichage dans la zone de texte "Résultat", de la valeur "reponseContent".



Lorsque vous testez maintenant votre appli, ( MIT compagnon) et que vous cliquez sur "Envoyer", vous devriez voir apparaitre dans la zone "Résultat", la ligne suivante :
<html><head></head><body><h1>Success</h1><p>Update succeeded </p></body></html>


et c'est plutôt bon signe : <h1>Success</h1><p>Update succeeded </p>

Pour vérifier, repassez sur l'écran d'accueil après avoir ajouté le code du bouton "retour Accueil", puis sur l'écran "Visualisation" comme nous l'avons implémenté ici http://smag0.blogspot.fr/2016/03/bigdata-facile-une-application-android.html
mais c'est plus joli ici http://rdf-smag0.rhcloud.com/ds/query?query=select+*+where+%7B%3Fs+%3Fp+%3Fo%7D&output=text , car pour l'instant dans la visualisation, on n'a pas formaté le résultat...


Si t'es arrivé jusque là, t'es plus un flemmard, alors cadeau : le code sur AppInventor : http://ai2.appinventor.mit.edu/?galleryId=5233374557372416

Les retours sont les bienvenus, si j'ai fait des boulettes, ou si je ne suis pas clair. Pour rappel : ceux qui veulent s'installer leur propre serveur peuvent le faire en local (en téléchargeant Apache Fuseki ou sur le cloud , par exemple Openshift en récupérant le source ici : https://github.com/scenaristeur/smag0-fuseki-rdf-openshift



[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]



11/03/2016

Un serveur fuseki RDF bigdata sur openshift

[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]


serveur de test : http://rdf-smag0.rhcloud.com/
- choisissez "Control Panel",
-  puis le Dataset "/ds",
- cliquez sur select,
-  un formulaire apparait, ou vous pouvez insérer des données (SPARQL Update) ou executer une requete (SPARQL Query))

repo github : https://github.com/scenaristeur/smag0-fuseki-rdf-openshift
(des problèmes de socket lorsque l'on tente d'utiliser la dernière version de Fuseki, donc on reste pour l'instant avec l'ancienne)


test pour insérer des données :


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


INSERT DATA {
GRAPH <http://example/bookStore>
{
ex:dog1    rdf:type         ex:animal .
ex:cat1    rdf:type         ex:cat .
ex:cat     rdfs:subClassOf  ex:animal .
zoo:host   rdfs:range       ex:animal .
ex:zoo1    zoo:host         ex:cat2 .
ex:cat3    owl:sameAs       ex:cat2 .
}
}



--> remplacez  le bloc  :
ex:dog1    rdf:type         ex:animal .
ex:cat1    rdf:type         ex:cat .
ex:cat     rdfs:subClassOf  ex:animal .
zoo:host   rdfs:range       ex:animal .
ex:zoo1    zoo:host         ex:cat2 .
ex:cat3    owl:sameAs       ex:cat2 .

par les triplets que vous souhaitez ajouter



test pour récupérer des données : 

select * where {?s ?p ?o}

ce qui nous donne pour une requete GET , et des données de retour au format JSON,
 par exemple pour une appli
 avec APP INVENTOR ou PROCESSING,
ou encore depuis une page web en javascript  l'url :

http://rdf-smag0.rhcloud.com/ds/query?query=select+*+where+%7B%3Fs+%3Fp+%3Fo%7D&output=json

Par exemple, on peut utiliser App Inventor pour récupérer les données : http://smag0.blogspot.fr/2016/03/bigdata-facile-une-application-android.html

ensuite, complétez-là pour mettre à jour les données du serveur :
http://smag0.blogspot.fr/2016/03/big-data-facile-une-application-pour.html


[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]



26/02/2016

Dreamcatcher V3 integration dans Meteor

in English, at the bottom of this post ;-)

La version hébergée sur Météor n'est plus, préférez la version "Autonome Collaboratif "







Nous en sommes maintenant à la V3 de Dreamcatcher : les plus curieux peuvent déjà y jeter un oeil : http://smag0.meteor.com/

  1.  v1 : http://smag-smag0.rhcloud.com/DreamCatcher/
    1. explications : http://smag0.blogspot.fr/2015/08/dreamcatcher-lattrape-reves.html
    2. Fonctionnalités :
      1. test de la bibliothèque de la bibliothèque traer pour processingjs pour gérer un environnement physique de répulsion, attraction des noeuds, deplacement à la souris, zoom avec les flèches (voir notice/help)
      2. test de drag&drop
      3. test d'integration, export de fichier rdf , n3
      4. sauvegarde de graphe avec touche "s" chargement des données depuis un serveur Fuseki, un sparql endpoint, via une requete sparl ou un service web hebergé ailleurs avec Java/Jena
      5. Creation de sessions pour travailler à plusieurs sur un graphe
    3. utilisationhttp://smag-smag0.rhcloud.com/DreamCatcher/help.html
  2. v2 : http://smag-smag0.rhcloud.com/DreamCatcher1/
    1. explications : http://smag0.blogspot.fr/2015/12/dreamcatcher-ou-comment-partager-des.html
    2. Fonctionnalités : une evolution de la V1, avec prise en charge de la 3D, grâce à P5JS, test égalment avec three.js 
    3. utilisation
      1. cliquer sur "charger Demo" puis sur afficher texte
      2. les curseurs permettent de zoomer, déplacer la caméra
  3. v3 ; http://smag0.meteor.com/
    1. explications : http://smag0.blogspot.fr/2016/02/dreamcatcher-v3-integration-dans-meteor.html
    2. besoin; besoin d'une identification, authentification pour partager, donner des droits sur les graphes, les sessions
    3. dépôt github : https://github.com/scenaristeur/dreamcatcher-smag0
    4. utilisation
      1. en arrivant sur la page d'accueil, on peut s'authentifier, ou créer son compte, 
      2. ensuite on peut créer un post ou participer aux post existants
        1. creer un post : rien de plus simple (attention aux lien, s'il existe déjà, ça empeche de créer le post)
        2. ajouter un triplet ou statement à un post existant, en insérant un sujet, une propriete, et un objet, et en validant. ce triplet/statement devrait s'insérer dans le graphe en haut de page . si aucun graphe n'apparait : revenez sur la page d'accueil, puis actualisez, ( tous les fichiers ne semblent pas encore chargés si on atterit directement sur un post)



version anglaise : 

Dreamcatcher V3 integration in Meteor
We are now in V3 Dreamcatcher: the curious can already have a look: http://smag0.meteor.com/

 v1: http://smag-smag0.rhcloud.com/DreamCatcher/
explanations http://smag0.blogspot.fr/2015/08/dreamcatcher-lattrape-reves.html
features:
test library for the library traer processing.js to manage a physical environment repulsion, attraction knots, displacement mouse, zoom with the mouse (see manual / help)
drag & drop test
integration testing, rdf file export, n3
Backup graph with "s" key data loading from a Fuseki server, endpoint sparql, via a request sparl or a hosted web service elsewhere with Java / Jena
Creation of sessions to work together on a graph
Use: http://smag-smag0.rhcloud.com/DreamCatcher/help.html
v2: http://smag-smag0.rhcloud.com/DreamCatcher1/
explanations http://smag0.blogspot.fr/2015/12/dreamcatcher-ou-comment-partager-des.html
Features: an evolution of the V1, with support of 3D, thanks to P5JS, égalment test Three.js
use :
click "Load Demo" and then display text
sliders allow you to zoom, move the camera
v3; http://smag0.meteor.com/
explanations http://smag0.blogspot.fr/2016/02/dreamcatcher-v3-integration-dans-meteor.html
need; require identification, authentication to share, give rights on graphs, sessions
use :
arriving on the home page, you can authenticate or create an account,
then you can create a post or participate in existing post
create a post: nothing simpler (watch link, if it exists, it prevents creating the post)
add a triplet or statement to an existing post, inserting a subject, a property and an object, and validating. this triplet / statement should be part of the graph to the top. if no graph will appear: return to the home page and then refresh, (all files do not yet appear directly responsible if it lands on a post)

07/02/2016

Insert d'informations sur un serveur Fuseki, post

1. installer fuseki pour qu'il soit accessible sur http://127.0.0.1:3030

2. creer un fichier smag.html  dans le repertoire webapp du serveur fuseki, avec le contenu qui suit et y accéder via http://127.0.0.1:3030/smag.html


<!DOCTYPE html>
<!-- https://github.com/scenaristeur/coolitude4/blob/master/Coolitude4/src/org/favedave/smag0/coolitude4/projet/Projet.java -->

<html>
    <body>
  
  
    </body>
   <script>
var debutRequete = "INSERT DATA { GRAPH <http://example/bookStore> {";
var finRequete = "} }";
var data="test";

</script>


<script>
function post(path, params, method) {
    method = method || "post"; // Set method to post by default if not specified.

    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
console.log(params);

    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         }
    }


  
  
       document.body.appendChild(form);

    form.submit();
}



<!--post('/contact/', {name: 'Johnny Bravo'}); -->
//post('http://127.0.0.1:3030/test/update', {"update" : update});


function constructRequete(){

 var update  =  "PREFIX rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> ";
 update +=  "PREFIX rdfs:   <http://www.w3.org/2000/01/rdf-schema#>";
     update += "PREFIX smag:   <http://smag0.blogspot.fr/NS#>";
     update += "PREFIX zoo:   <http://example.org/zoo#>";
     update += "PREFIX owl: <http://www.w3.org/2002/07/owl#>";
     update += "PREFIX ex: <http://example.org#>";
update+= "INSERT DATA {";
 //update += "GRAPH <http://smag0.blogspot.fr/GraphTest>{";
  //update += "smag:RobokIze    rdf:type         smag:Site .";
  //update +="smag:RobokIze   smag:objectif         'un site de vente revente piece detachees , pour robots, et objets connectes' ." ;
//     update += "ex:cat     rdfs:subClassOf  ex:animal .";
//     update += "zoo:host   rdfs:range       ex:animal .";
//     update += "ex:zoo1    zoo:host         ex:cat2 .";
//     update += "ex:cat3    owl:sameAs       ex:cat2 .";
//    update += "ex:cat3    owl:sameAs       ex:cat2 .";
  
    var sujet=document.getElementById("sujet").value;
    var propriete=document.getElementById("propriete").value;
    var objet=document.getElementById("objet").value;
 update += "smag:"+sujet+"    smag:"+propriete+"         smag:"+objet+" .";

 // fin requete avec graphe var finRequete = "} }";
 var finRequete = "}"; // fin requete sans graphe

update+=finRequete;
console.log(update);


post('http://127.0.0.1:3030/test/update', {"update" : update});
    //console.log(update);
  
    //console.log(document.getElementById("sujet").value);
    //window.location.assign('http://127.0.0.1:3030/smag.html');
//modifier la pause créée par l'alerte --> ceci permet la mise à jour par la fonction post
    alert(update);
    maj();
}

function httpGetAsync(theUrl, callback)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
           callback(xmlHttp.responseText);
            //console.log(xmlHttp.responseText);
             //document.getElementById("result").innerHTML = xhttp.responseText;
    }
    xmlHttp.open("GET", theUrl, true); // true for asynchronous
    xmlHttp.send(null);
}

function updateDiv(data){
var myJSONOBJECT= eval('(' + data+ ')');
// ou var myJSONOBJECT= JSON.parse(data, reviver);
var bindings = myJSONOBJECT.results.bindings;
//console.log("update");
//var resultat="";
var list = document.getElementById('resultats');
while (list.firstChild) {
    list.removeChild(list.firstChild);
}
for(i in bindings) {
  var binding = bindings[i];
  //alert(binding); // a for-loop to print all the bindings
  sujet=binding.s.value.split("#")[1];
  propriete=binding.p.value.split("#")[1];
  objet=binding.o.value.split("#")[1];
//  resultat=sujet +" "+propriete+" "+objet;
 // console.log("resultat :"+resultat);
var entry = document.createElement('li');
entry.appendChild(document.createTextNode(sujet));
entry.appendChild(document.createTextNode("  -> "));
entry.appendChild(document.createTextNode(propriete));
entry.appendChild(document.createTextNode("  -> "));
entry.appendChild(document.createTextNode(objet));
list.appendChild(entry);
}
//document.getElementById("result").innerHTML = resultat;

//var bindings = sr.results.bindings;

// JavaScript  for...in loop iterates
// through the properties of bindings array
// which are [0,1,length-1] as opposed to the
// array item.

//for(i in bindings) {
 // var binding = bindings[i];
 // alert(binding); // a for-loop to print all the bindings
//}

// The only difference here (a subtle one) is
// that the iterator variable is n as opposed to r
// n=name, r=row index
//for(i in bindings) {
  //var binding = bindings[i];
  //for(n in binding) {
  //  alert(binding[n].value); // a nested for-loop to print binding values
 // }
//}



}


function maj(){
//console.log('maj');
httpGetAsync('http://127.0.0.1:3030/test/query?query=select+*+where{%0D%0A%0D%0A%3Fs+%3Fp+%3Fo}%0D%0A&output=json',updateDiv);

}

</script>



<form name="form1" onsubmit="constructRequete()">
<input type="texte" name="q" value="a">

 <input type="submit">
</form>

<ul id="resultats"></ul>

<div id="result">

</div>

<script>

setInterval(function(){ maj(); }, 3000);
//maj();

            var inputSujet = document.createElement("input");
            inputSujet.setAttribute("type", "text");
            inputSujet.setAttribute("name", "sujet");
            inputSujet.setAttribute("id", "sujet");
            inputSujet.setAttribute("placeholder", "Sujet");
          
            form1.appendChild(inputSujet);
          
            var inputPropriete = document.createElement("input");
            inputPropriete.setAttribute("type", "text");
            inputPropriete.setAttribute("name", "propriete");
            inputPropriete.setAttribute("id", "propriete");
            inputPropriete.setAttribute("placeholder", "propriete");

            form1.appendChild(inputPropriete);
          
            var inputObjet = document.createElement("input");
            inputObjet.setAttribute("type", "text");
            inputObjet.setAttribute("name", "objet");
            inputObjet.setAttribute("id", "objet");
            inputObjet.setAttribute("placeholder", "Objet");

            form1.appendChild(inputObjet);
  
    // console.log(document.getElementById("sujet").value);
</script>


</html>

01/12/2015

Reinstallation pcduino et configuration du rover



(Update 07/01/2016)
un nouveau script d'installation qui reprend la procédure décrite dans cette page est dispo ici .








Si votre pcduinoBot plante, ou si vous posséder cette merveilleuse carte qu'est le pcduino et ne savez pas trop quoi en faire, je vous propose d'y installer les fonctionnalités regroupées sous le terme de pcduinoBot.


Vous pouvez repartir de zéro en suivant la procédure indiquée ci dessous :
- pour la partie technique, jetez un coup d'oeil là http://smag0.blogspot.fr/2014/03/rover-pcduino-introduction.html
- utilisation d'une carte pcduino V2, avec module wifi noir : commander le kit matériel complet ou seulement certaines parties

REINSTALLER LE SYSTEME :


- télécharger les images Kernel et Ubuntu ici : http://www.linksprite.com/image-for-pcduino2/
- les installer selon la procédure ici : http://www.mon-club-elec.fr/mes_downloads/doc_pcduino/3.pcduino_installation_maj_du_systeme_de_base.pdf ou là : http://learn.linksprite.com/pcduino/quick-start/steps-to-flash-ubuntu-images-to-pcduino/
ou la méthode plus rapide avec PhoenixSuit plus bas sur cette page.

ACTIVER 4GB DE NAND SUR VOTRE PCDUINO

http://learn.linksprite.com/pcduino/quick-start/how-to-use-the-4g-nand-flash-for-pcduino/
le lien mentionné ne fonctionne plus , mais dans les commentaires, y'en a un autre sur un site russe, pour vous éviter d'apprendre le russe, je l'ai mis là ... pour voir la taille de vos disques utilisez la commande "df -h"
avec la notice :
We prepared a script pcduino-nand-4g-fix to help you extend the space.You can download it, unpack it, and run: $chmod +x pcduino-nand-4g-fix $ sudo ./pcduino-nand-4g-fix it will output: partition  0: name =   bootloader, partition start =     2048, partition size =    65536 partition  1: name =          env, partition start =    67584, partition size =     4096 partition  2: name =         boot, partition start =    71680, partition size =    32768 partition  3: name =       rootfs, partition start =   104448, partition size =  3686400 partition  4: name =        UDISK, partition start =  3790848, partition size =  3991552 5 partitions check partition table copy 0: OK check partition table copy 1: OK check partition table copy 2: OK check partition table copy 3: OK ready to write new partition tables: partition  0: name =   bootloader, partition start =     2048, partition size =    65536 partition  1: name =          env, partition start =    67584, partition size =     4096 partition  2: name =         boot, partition start =    71680, partition size =    32768 partition  3: name =       rootfs, partition start =   104448, partition size =  7677952 4 partitions write new partition tables? (Y/N) y Press  “Y”  to confirm, the system will reboot automatically. After reboot, you will get full 4GB.

MJPG-STREAMER :

 - http://learn.linksprite.com/pcduino/install-mjpg-streamer-pcduino/, attention, erreur dans le lien de téléchargement, complétez avec ça : http://doc.ubuntu-fr.org/mjpg-streamer
- à lancer dans un terminal avec la commande


$ mjpg_streamer -i "/usr/local/lib/input_uvc.so -d /dev/video0  -y -r 320x240 -f 10" -o "/usr/local/lib/output_http.so -p 8090 -w /usr/local/www -p 8090"

ceci lance un serveur accessible à l'adresse http://127.0.0.1:8090 et diffuse en Streaming l'image de votre caméra branchée sur le port USB. On récupérera cette image ensuite, et on l'affichera ensuite avec le serveur python qui gérera les commandes.

Pour lancer la webcam au démarrage, ainsi que le serveur python du paragraphe suivant, éditez le fichier autostart en lançant la commande suivante :

$ sudo leafpad /etc/xdg/lxsession/Lubuntu/autostart

et ajoutez les deux lignes suivantes (la deuxieme est en fait une seule ligne ):

@python /home/ubuntu/smag0/serveur/serveur.py
@mjpg_streamer -i "/usr/local/lib/input_uvc.so -d /dev/video0  -y -r 320x240 -f 10" -o "/usr/local/lib/output_http.so -p 8090 -w /usr/local/www -p 8090"

POUR AVOIR UN JOLI SERVEUR PYTHON PERMETTANT DE COMMANDER NOTRE ROBOT PCDUINO :

installation de Flask : (http://flask.pocoo.org/)

$ sudo apt-get install python-pip python-dev build-essential 
$ sudo pip install --upgrade pip 



$ sudo pip install Flask

librairie Pyduino

Installer la librairie Pyduino pour l'accès aux PWM en mode analogique et contrôler la vitesse des deux moteurs à courant continu (DC). La taille de notre pcDuino étant comme nous l'avons vue, extensible... mais pas indéfiniment, on peut choisir de n'installer que la librairie est ses prérequis :

Attention la commande d'installation manuelle est à exécuter avec les droits admin : 
$ sudo ./install_pyduino.sh 



Téléchargez et décompressez le code du serveur python pour commander le pcduino rover et voir les images en streaming : le code du serveur est dispo ici 
corriger l'adresse http://192.168.XX.XX:8090 dans la page dimmer-light.html du repertoire template et mettez celle de votre pcduino

à décompresser dans le repertoire /home/ubuntu/smag0, et à lancer avec

$ cd /home/ubuntu/smag0/serveur
$ python serveur.py
vous devriez voir le lancement du serveur, celui-ci est ensuite accessible à l'adresse http://127.0.0.1:8080, ou par le réseau (récupérez l'adresse du pcduino avec un ifconfig, à ce moment , le mieux est d'attribuer une adresse ip fixe à votre carte pcduino, dans la configuration de votre box, ma box sfr le fait très bien, et j'imagine que la votre aussi.)
Il y a même possibilité de demander à votre box de router les entrées sur votre pcduino, afin de permettre de voir les images, ou déplacer votre pcduino rover depuis le bureau... ça fonctionne très bien, mais c'est juste en test, attention, je ne garanti pas la sécurité. c'est à vous de savoir quels ports vous ouvrez, à qui, comment...)

le résultat devrait être proche de ça :


voir aussi, ce qu'on peut faire avec nodejs : https://www.npmjs.com/package/pcduino
et/ou avec p5js : http://p5js.org/gallery/
p5js +nodejs + socket.io  -->  https://github.com/processing/p5.js/wiki/p5.js,-node.js,-socket.io

d'autres solutions pour monter un serveur web /socket sur le pcduino : http://indexerror.net/2492/bottle-autobahnpython-pcduino

INSTALLATION FUSEKI (OPTIONNEL)


INSTALLATION JENA


modifications à réintégrer dans le code du fichier dimmer-light.html de serveur.zip (repertoire templates): 
<div style="float:left">
<img id="snapshot" src="" class="rotate270"/>
<script> var loc=window.location.hostname;
loc+=':8090/?action=stream' ;
console.log(loc);
document.getElementById("snapshot").src="http://"+loc;
</script>
</div>

PCDUINO EN MODE HOPSPOT / POINT D'ACCES / ACCESS POINT / AP

j'ai testé ça, mais ça m'a planté la carte wifi http://blog.sip2serve.com/post/48899893167/rtl8188-access-point-install-script, mais on peut peut-être s'en inspirer, et mettre les paramètres de cette page, ou voir là : --> marche pas pour l'instant. ça a marché qd j'avais reçu mon pcduino, mais depuis qques mises à jours --> pb


LA BIBLE DU PCDUINO :
http://www.pcduino.com/wiki/index.php?title=Book

images pcduino : http://www.linksprite.com/image-for-pcduino2/

pour l'erreur (error) : Unable to connect to www.wiimu.com:8020:
-->It seems that the server has been closed.

Try this temporary source in your sources.list:


Reinstaller l'image du pcduino avec PhoenixSuit

(bien que cette page concerne le pcduino 3, fonctionne aussi avec mon pcduino2. plus rapide que de graver l'image sur SD.)

-brancher le pcduino au secteur
-brancher un autre cable sur la prise otg du pcduino 2
-appuyer sur upgrade puis un coup sur Reset, et Phoenixsuit envoi la mise à jour sur la carte.
-brancher ensuite une clé usb avec un fichier update.sh et  l'image d'ubuntu / ou du pcduino rover (page 64 : https://s3.amazonaws.com/pcduino/book/Rover+-+A+WiFi+Video+Surveillance+Remote+Robot++Powered+by+pcDuino.pdf)


NOTES RAPIDES

pcduino v2

- mettre le clavier en français :
infos pour éviter des galères : 
régler l'heure sur pcduino :  sudo ntpdate fr.pool.ntp.org 
régler le clavier en français : sudo setxkbmap fr

sudo board-config.sh
- configurer la carte avec "board-config" : http://www.mon-club-elec.fr/mes_downloads/doc_pcduino/3b.pcduino_utilitaire_board_config.pdf
- install de pip à rajouter dans le script de réinstall du rover : sudo apt-get install python-pip python-dev build-essential

```
Try this
sudo vi /etc/apt/sources.list
and then make sure uncomment the `wiimu.com' lines and add 'trusty-security / trusty-updates' sources as downbelow
deb http://ports.ubuntu.com/ubuntu-ports/ trusty main universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main universe

deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main universe

deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main universe
deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main universe

# deb http://www.wiimu.com:8020/pcduino/ pcduino main
# deb-src http://www.wiimu.com:8020/pcduino/ pcduino main
then do 
sudo apt-get update
again, everything works well without annoying 'conflict' or 'pcduino-kernel error' blah blah
```

08/06/2015

Comment créer une méthode pour Smag0, la méthode Diamond, au format RDF

On peut maintenant enregistrer un nouveau projet ou une information à transmettre à sa maison, grâce à l'appli Coolitude4, ou bien directement sur le site http://smag-smag0.rhcloud.com/visu.jsp.

Ensuite, pour nous aider à réaliser ce projet, ou pour aider le système à analyser l'information qu'on lui a envoyer, nous allons de voir utiliser une ou plusieurs méthode. Cet article décrit comment créer une nouvelle méthode et comment l'intégrer au système Smag0. On pourra de la même manière créer d'autres méthodes, des procédures métiers, des recettes de cuisine, des manières de ranger une chambre. Ces méthodes sont partageables et utilisables par plusieurs systèmes, elles devront également être personnalisables, selon l'envie, le contexte de chacun.

J'avais dans un premier temps, fait un premier test pour modéliser la méthode Diamond en me basant sur ce document : DIAMOND : Une approche pour la conception de systèmes multi-agents embarqués par Jean-Paul Jamont, et ça nous donnait ceci : http://smag0.rww.io/diamond.owl.
On pourra aussi se pencher sur la méthode ASPECS à laquelle est étroitement liée Janus.

J'ai depuis approfondi mes connaissances en RDF, et il apparaît opportun, d'utiliser au maximum des vocabulaires déjà existants, pour renforcer la compatibilité et la portabilité d'un méthode.
pour un rappel (ou une découverte) sur RDF et ses triplets, un petit coup d'oeil sur Wikipedia.

Une méthode est tout d'abord une séquence ordonnée d'instructions, ce qui se traduit en RDF par le triplet suivant : 

{ MethodeDiamond        rdf:type     rdf:Seq }


avec rdf:type http://www.w3.org/TR/rdf-schema/#ch_type : 
rdf:type est une instance de rdf:Property qui est utilisé pour indiquer qu'une ressource est une instance d'une classe.Un triplet de la forme: R rdf:type Cstipule que C est une instance de rdfs:Class et R est une instance de C.Le rdfs:domain de rdf:type est rdfs:Resource. Les rdfs:range de rdf:type est rdfs:Class.

Le rdf:Seq est la classe de «séquence» conteneurs RDF. Il est une sous-classe de rdfs:Container. Bien que formellement il est pas différent d'un rdf:Bag ou un rdf:Alt. rdf:Seq est utilisée conventionnellement pour indiquer à un lecteur humain que l'ordre numérique des propriétés d'appartenance de conteneur du conteneur est destiné à être significatif.


La méthode Diamond (enfin, comme je l'ai comprise ;-)) se décompose en 4 étapes majeures : 
  1. A. Définition des besoins
  2. B. Analyse du système Multi-Agents
  3. C. Conception Générique
  4. D. Implantation
ce qui se traduira par les triplets suivants
{ MethodeDiamond rdf:_1 DefinitionDesBesoins }
{ MethodeDiamond   rdf:_2 AnalyseSMA }
{ MethodeDiamond   rdf:_3 ConceptionGenerique }
{ MethodeDiamond   rdf:_4 Implantation }


Chacun de ces étapes majeures étant elle même une séquence  composée d'autres étapes, on continuera donc en décrivant l'étape DefinitionDesBesoins par les triplets suivants : 


DefinitionDesBesoins rdf:type  rdf:Seq  }
DefinitionDesBesoins rdf:_1 ApprochePreliminaire }
{ DefinitionDesBesoins rdf:_2 EtudeActeurs }
{ DefinitionDesBesoins rdf:_3 EtudeCasUtilisation }
{ DefinitionDesBesoins rdf:_4 EtudeBesoinsService }
{ DefinitionDesBesoins rdf:_5 EtudeModeMarcheArret }

et ainsi de suite,
pour plus d'infos sur comment construire une ontologie :
http://python.espe-bretagne.fr/master-hst-ue9-2/wp-content/uploads/2013/03/Tutoriel-Pizza-gloria-1.pdf
http://protegewiki.stanford.edu/wiki/Protege4Pizzas10Minutes
http://protegewiki.stanford.edu/wiki/Protege4UserDocs

Bien , maintenant, passons à la pratique.


Commencez par télécharger et exécuter Protégé2000,
ensuite nommez votre ontologie comme décrit dans les tutoriels juste au dessus (si vous bloquez à ce niveau, demandez de l'aide dans un des groupes de discussion du blog, ou en commentaire de cet article), et importez le vocabulaire rdf : http://www.w3.org/1999/02/22-rdf-syntax-ns#
dans votre ontologie.
Cela nous donnera accès aux classes rdf:Seq et aux propriétés rdf:type...
Ensuite, pour avoir accès à la numérotation, on va aussi importer le vocabulaire rdfs : http://www.w3.org/1999/02/22-rdf-syntax-ns#

dans objectPropertyHierarchie, ajouter des sous-propriétés à la propriété "member" telles que celles-ci : 
http://www.w3.org/1999/02/22-rdf-syntax-ns#_1
http://www.w3.org/1999/02/22-rdf-syntax-ns#_2
http://www.w3.org/1999/02/22-rdf-syntax-ns#_3
...


article), et importez le vocabulaire r
Creez une classe Methode sous la classe Thing, et créez une instance "MaMethode" de type "Methode".

  •  ajoutez le type "Seq" à "MaMethode". --> ceci nous donnera le triplet { MethodeDiamond        rdf:type     rdf:Seq }
  • ensuite utilisez les propriétés _1, _2 que vous avez créé sous la propéiété member, et créez les instances  DefinitionDesBesoins, AnalyseSMA  ConceptionGenerique  Implantation ,
    ce qui nous donnera les triplets :
    { MethodeDiamond rdf:_1 DefinitionDesBesoins }
    { MethodeDiamond   rdf:_2 AnalyseSMA }
    { MethodeDiamond   rdf:_3 ConceptionGenerique }
    { MethodeDiamond   rdf:_4 Implantation }
On peut ensuite ajouter le type Seq à ces quatres instances et continuer, en décrivant les sous-étapes de ces étapes, et ainsi de suite...

Le but étant d'avoir une structure récursive, identique pour toutes les méthodes, afin de pouvoir être utilisé de manière transparente par différentes applications.

On a décrit ici comment construire l'ontologie. on pourra ensuite la stocker sur http://rww.io/ (attention, la survie de ce site n'est pas garantie), ou sur un truc comme https://github.com/scenaristeur/smagserver/tree/master/src/main/webapp/ontologies, pour avoir une possibilité d'évolution, de versionning sur l'ontologie.

Pour l'instant, une première version là : http://smag-smag0.rhcloud.com/ontologies/diamondMethode.owl

reste à ajouter un formulaire sur Smag0 pour intégrer de nouvelles ontologies.




23/04/2015

Coolitude

Téléchargez Coolitude4 : http://smag-smag0.rhcloud.com/coolitude4/Coolitude4.apk
l'application qui permet d'échanger des informations (projets, idées...) avec le système SMAG0. 

#Coolitude ou comment rencontrer des personnes intéressées par vos #projets.

Un réseau social basé sur la créativité et les projets plutôt que sur la libido? Hum, hum !

Pour transmettre des informations aux #robots#objets connectés de ma maison (#iot), je devais avoir sous la main une #appli me permettant d'enregistrer mes #idées, mes intentions, mes projets.
C'est le but de #Coolitude4  qui enregistre les informations au format #RDF sur un serveur #Fuseki.

Mais les fonctionnalités de cette appli vont plus loin : partage de projets , partage d'idées,  partages de ressources...

Par extension, cette appli permet de #visualiser les personnes qui ont des projets proches des miens, --> partage de ressources, de compétences --> réseau social basé sur les projets.

Appli en cours de dév pour Android seulement pour l'instant (version -alpha) téléchargeable ici http://smag-smag0.rhcloud.com/coolitude4/Coolitude4.apk

Et ça nous donne une liste des projets visible ici : http://smag-smag0.rhcloud.com/visu.jsp

Avis aux développeurs intéressés, ou pour reporter un bug, le code source est là :  https://github.com/scenaristeur/coolitude4

Fonction implémentées aujourd'hui : 
Les fonctions sont accessibles depuis la page d'accueil de l'appli, par le menu en haut à droite.
Page d'accueil : bouton Enregistrer --> permet de créer un nouveau projet, avec récupération des coordonnées GPS, 
- Carte : Visualisation des projets sur la carte ( recentrer manuellement sur Lyon, pour l'instant )
- Dans"Dernier Projets" : la liste des projets sur le serveur.
- Dans "100 derniers projets" --> la liste des projets, puis dans le menu, en haut à droite :

  • foaf:Agent : ajouter un agent (Group, Organization,Person);
  •  schema:Action (faut que je renomme, c'est plus dbpedia:Event, maintenant) : possibilité d'ajouter des evenements aux projets.
Pour voir le résultat, pour l'instant, c'est là (en descendant tout en bas, vous devriez voir vos derniers ajouts de projets, Agents et Evenements liés ) :


Pour en discuter, reporter un bug : https://groups.google.com/forum/#!topic/smag0/bRP0xAvvmis

Plus d'infos sur http://smag-smag0.rhcloud.com/
Plus d'infos sur RDF : https://larlet.fr/david/biologeek/archives/20070827-rdf-pour-tous-du-publicateur-au-developpeur-web/



!!! PLUS C'est la partie technique, réservée à ceux qui ont déjà entendu parlé de RDF ou Sparql |-}

Requetes Sparql utilisées: 

référence utilisées  :
les requetes s'effectuent sur le serveur Sparql à l'adresse ci-dessous : 
http://fuseki-smag0.rhcloud.com/ dans le graphe ds, choisissez ensuite votre format de sortie (output)

Selectionner tous les projets qui ont pour type <http://smag0.blogspot.fr/ns/smag0#Projet> 


select * where {?Projet <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://smag0.blogspot.fr/ns/smag0#Projet> }

lien direct, output JSON : 
http://fuseki-smag0.rhcloud.com/ds/query?query=select+*+where+%7B%3FProjet+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23type%3E%09%3Chttp%3A%2F%2Fsmag0.blogspot.fr%2Fns%2Fsmag0%23Projet%3E+%7D&output=json&stylesheet=%2Fxml-to-html.xsl

Requete Sparql avec options : 


PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX smag:   <http://smag0.blogspot.fr/ns/smag0#>
SELECT?projet ?titre ?description ?lat ?lon WHERE{
?projet <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> smag:Projet .
OPTIONAL {?projet <http://purl.org/dc/elements/1.1/title> ?titre }
 OPTIONAL {?projet <http://purl.org/dc/elements/1.1/description> ?description }
OPTIONAL {?projet smag:description ?description }
OPTIONAL { ?projet geo:lat ?lat }
 OPTIONAL { ?projet geo:long ?lon }
 OPTIONAL { ?projet smag:latitude ?lat } 
 OPTIONAL { ?projet smag:longitude ?lon } 
}
ORDER BY DESC(?projet)

ou :
http://fuseki-smag0.rhcloud.com/ds/query?query=PREFIX+geo%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2003%2F01%2Fgeo%2Fwgs84_pos%23%3E%0D%0A%0D%0APREFIX+smag%3A+++%3Chttp%3A%2F%2Fsmag0.blogspot.fr%2Fns%2Fsmag0%23%3E+%0D%0A%0D%0Aselect+%3Fprojet+%3Ftitre+%3Fdescription+%3Flat+%3Flon+where+%7B%0D%0A%0D%0A%3Fprojet+%3Chttp%3A%2F%2Fwww.w3.org%2F1999%2F02%2F22-rdf-syntax-ns%23type%3E+smag%3AProjet+.+%0D%0A%0D%0AOPTIONAL+%7B%3Fprojet+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2Ftitle%3E+%3Ftitre+%7D+%0D%0A%0D%0A+OPTIONAL+%7B%3Fprojet+%3Chttp%3A%2F%2Fpurl.org%2Fdc%2Felements%2F1.1%2Fdescription%3E+%3Fdescription+%7D+%0D%0A%0D%0AOPTIONAL+%7B%3Fprojet+smag%3Adescription+%3Fdescription+%7D+%0D%0A%0D%0AOPTIONAL+%7B+%3Fprojet+geo%3Alat+%3Flat+%7D+%0D%0A%0D%0A+OPTIONAL+%7B+%3Fprojet+geo%3Along+%3Flon+%7D+%0D%0A%0D%0A+OPTIONAL+%7B+%3Fprojet+smag%3Alatitude+%3Flat+%7D+%0D%0A%09%09%09%09%0D%0A+OPTIONAL+%7B+%3Fprojet+smag%3Alongitude+%3Flon+%7D+%0D%0A%09%09%09%09%0D%0A%7D%0D%0A%09%09%09%09%09%0D%0AORDER+BY+DESC%28%3Fprojet%29&output=xml&stylesheet=%2Fxml-to-html.xsl


récupérer les sous-classes (Agent, Group, Organisation)  sur http://lov.okfn.org/dataset/lov/sparql



PREFIX foaf:<http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

### Vocabularies contained in LOV and their prefix
SELECT DISTINCT ?sousClasse {
  GRAPH <http://xmlns.com/foaf/0.1/>{
   ?sousClasse rdfs:subClassOf foaf:Agent
   
}} ORDER BY ?sousClasse

http://lov.okfn.org/dataset/lov/sparql?query=PREFIX+foaf%3A%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0APREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0A+%0A%23%23%23+Vocabularies+contained+in+LOV+and+their+prefix%0ASELECT+DISTINCT+%3FsousClasse+%7B%0A+%09GRAPH+%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%7B%0A+%09++%3FsousClasse%09rdfs%3AsubClassOf+foaf%3AAgent%0A+%09+%0A%7D%7D+ORDER+BY+%3FsousClasse


Recuperer les propriétés des sous classes de la classe foaf:Agent  sur http://dbpedia.org/sparql/ (changer le graphe en http://xmlns.com/foaf/0.1/)

PREFIX foaf:<http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?sousClasse ?propriete ?objet {
 
   ?sousClasse rdfs:subClassOf foaf:Agent.
?sousClasse ?propriete ?objet.

 
} ORDER BY ?sousClasse

ou au format JSON :
http://dbpedia.org/sparql/?default-graph-uri=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F&query=PREFIX+foaf%3A%3Chttp%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2F%3E%0D%0APREFIX+rdfs%3A+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0D%0A+%0D%0ASELECT+DISTINCT+%3FsousClasse+%3Fpropriete+%3Fobjet+%7B%0D%0A+%09%0D%0A+%09++%3FsousClasse%09rdfs%3AsubClassOf+foaf%3AAgent.%0D%0A%3FsousClasse+%3Fpropriete+%3Fobjet.%0D%0A%0D%0A+%09+%0D%0A%7D+ORDER+BY+%3FsousClasse&format=application%2Fsparql-results%2Bjson&timeout=30000&debug=on


REcuperer les sous-classes d'une schema:Action : sur http://lod.openlinksw.com/sparql/


SELECT DISTINCT ?Action WHERE {
?Action <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://schema.org/Action>
 }

--> resultat :
http://lod.openlinksw.com/sparql/?default-graph-uri=&query=SELECT+DISTINCT+%3FAction+WHERE+%7B%0D%0A%3FAction+%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23subClassOf%3E+%3Chttp%3A%2F%2Fschema.org%2FAction%3E%0D%0A+%7D+&format=text%2Fhtml&CXML_redir_for_subjs=121&CXML_redir_for_hrefs=&timeout=30000&debug=on


REQUETE POUR RECUPERER les informations sur un projet :

select DISTINCT ?propriete ?objet ?labelObject ?commentaire ?labelCommentaire ?userCommentaire ?element ?labelElement where {
<http://smag0.blogspot.fr/ns/smag0#P1431363569> ?propriete ?objet .
OPTIONAL{?objet  <http://www.w3.org/2000/01/rdf-schema#label> ?labelObject .}

OPTIONAL { <http://smag0.blogspot.fr/ns/smag0#P1431363569>  <http://smag0.blogspot.fr/ns/smag0#hasComment> ?commentaire .}
OPTIONAL {?commentaire <http://www.w3.org/2000/01/rdf-schema#label> ?labelCommentaire .}
OPTIONAL {?commentaire <http://smag0.blogspot.fr/ns/smag0#user> ?userCommentaire .}

OPTIONAL { <http://smag0.blogspot.fr/ns/smag0#P1431363569>  <http://purl.org/dc/terms/hasPart> ?element .}
OPTIONAL {?element <http://www.w3.org/2000/01/rdf-schema#label> ?labelElement .}

}

ou plus simple : pour recupérer les infos d'un projet et leur type :


PREFIX rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX smag:   <http://smag0.blogspot.fr/ns/smag0#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX dcterms: <http://purl.org/dc/terms/>

SELECT  ?propriete ?objet  ?objectLabel ?objectType
 WHERE {
<http://smag0.blogspot.fr/ns/smag0#P1431250984> ?propriete ?objet .
OPTIONAL{?objet  rdf:label  ?objectLabel .}
OPTIONAL{?objet  rdf:type        ?objectType  .}
}

résultat ici