• [^] # Re: Euh ???

    Posté par . En réponse à la dépêche SPARQL, le SQL du Web, et Linked Data Fragment : le point sur le requêtage du Web. Évalué à 3.

    Sinon, comme barmic, je dois bien dire que je ne comprends pas grand chose. Au langage sparql, déjà, à la fin de la lecture de la dépêche je ne suis pas sûr de savoir écrire une requête simple (même après la deuxième lecture).

    Les requêtes écrites directement dans de la dépêche sont là pour introduire la syntaxe et certaines notions mais elles ne sont pas exécutables. Un triplet est comme la traditionnelle formule grammaticale une phrase = SUJET + VERBE + OBJET ; en RDF, le verbe est appelé prédicat. On s'exprime en triplets sur le contenu d'une base de connaissances (BC) et ça c'est seulement au niveau de la syntaxe. C'est au moteur de requêtes de voir si les triplets écrits correspondent à quelque chose contenue dans la BC.

    La notion de nœud blanc est à comprendre comme un quantificateur existentiel : on est persuadé qu'il existe quelque chose dans la BC mais on ne sait pas comment le nommer, i.e. on ignore son URI et donc, on s'y réfère avec un nœud blanc1 .

    La requête envoyée sur WikiData masque la déclaration des préfixes et la spécification du graphe par défaut (la BC). Chaque nœud SPARQL possède un graphe par défaut ; comme l'expression « par défaut » l'indique, on peut changer le graphe à interroger et ça se fait avec la clause FROM ou FROM NAMED. En omettant ledit graphe par défaut, la requête complète se réécrit ainsi :

    PREFIXwdt:<http://www.wikidata.org/prop/direct/>
    select?personne?personneLabel{
    ?personnewdt:P22?fatherfilter(isBlank(?father)).
    SERVICEwikibase:label{bd:serviceParamwikibase:language"fr,en".}
    }

    Comme pour toute autre ressource en RDF, un graphe est identifié par un URI. Si le graphe à interroger était identifié par foo:bar, la requête serait (ne pas exécuter ça !)

    PREFIXwdt:<http://www.wikidata.org/prop/direct/>
    FROM<foo:bar>
    select?personne?personneLabel{
    ?personnewdt:P22?fatherfilter(isBlank(?father)).
    SERVICEwikibase:label{bd:serviceParamwikibase:language"fr,en".}
    }

    Le protocole indique comment et où un moteur de requêtes va chercher le graphe indiqué par FROM. Enfin, les PREFIXs évitent de réécrire l'espace des noms dans chaque triplet. Mais ici, comme il n'y a qu'une seule ressource utilisée dans cet espace, on peut omettre le préfixe :

    select?personne?personneLabel{
    ?personne<http://www.wikidata.org/prop/direct/P22>?fatherfilter(isBlank(?father)).
    SERVICEwikibase:label{bd:serviceParamwikibase:language"fr,en".}
    }

    Fondamentalement, ça me rappelle ce qu’on pouvait faire avec prolog, avec une syntaxe encore plus obscure.

    Le langage est plutôt conçu pour envahir le champ syntaxique du SQL. Il y a même une norme qui réalise un mapping cohérent entre SQL et SPARQL, ça s'appelle R2RML. Et c'est génial, car on peut se mettre à vider les bases de données relationnelles pour remplir des graphes RDF et faire des trucs très avancés, de la gageure si c'était à faire absolument en SQL2 .

    Ce que je trouve plutôt obscur, c'est cette volonté de continuer à forcer une syntaxe imaginée pour des données tabulaires sur des graphes. C'est typiquement le genre de situations où les types de données algébriques auraient fait des merveilles.

    Or, dans les exemples, je vois que tout est en français. C’est traduit, ou bien chacun fait ce qu’il veut, il n’y a pas de norme établie ?

    Les triplets, les graphes (ensembles de triplets) peuvent être typés. La syntaxe est en Unicode mais la sémantique est déterminée par un schéma. Il y a plusieurs types de schémas avec des niveaux d'expressivités variables : vocabulaires contrôlés, taxonomies, corpus, ontologies, ... Les schémas sont eux-mêmes écrits en triplets. On ne dit pas ce qu'on veut a priori, on dit tout ce que le graphe (avec schéma ou non) permet. Mais on peut ajouter de nouveaux triplets arbitraires dans le graphe, donc a posteriori on peut écrire tout ce qu'on veut, c'est l'hypothèse du monde ouvert.


    1. Je simplifie énormément, il faudra rectifier le tir avec un peu d'expérience car les nœuds blancs constituent un sujet vaste et problématique ; on doit notamment adopter des stratégies pour les sérialiser, les skolémiser ...

    2. Revers de la médaille, à ma connaissance, il n'y a pas d'implémentation libre et crédible de R2RML. Il y a une équipe à l'université du Texas qui semble l'avoir solidement implémenté, malheureusement ils ont embrigadé leur code et se contentent de pondre régulièrement des articles pour annoncer comment leur outil est super. Oui oui, j'ai une dent contre cette équipe car elle comporte des personnes à qui on doit essentiellement la norme : pourquoi s'impliquer tellement dans un processus de normalisation W3C, en appartenant à une université, pour enfin se précipiter à fermer les outils ayant servi à tester que la norme est implémentable ? Pour mémoire et à ma connaissance, le seul outil crédible qui implémente la norme est Oracle Database à partir de la version 12. Mais peut-être que je me goure, j'aimerais que Thomas partage des infos là-dessus s'il en a (Thomas, si tu m'entends !) car lui il est immergé dans le Web Sémantique, il est à même d'acquérir ces infos.