assemblee-virtuelle / semapps

A toolbox to create semantic web applications
https://semapps.org
Apache License 2.0
87 stars 8 forks source link

GraphQLDP #697

Open srosset81 opened 3 years ago

srosset81 commented 3 years ago

Idée: transformer un API GraphQL en serveur LDP, avec ses containers et ses ressources.

Pourrait servir pour ouvrir en sémantique les données de toutes les instances Mobilizon, Open Collective, Github, et beaucoup d'autres services.

Par exemple si on POST sur https://mobilizon.fr/api cette requête (potentiellement via l'interface https://mobilizon.colibris-outilslibres.org/graphiql):

query {
  events {
    elements {
      id,
      url,
      title,
      description,
      beginsOn,
      endsOn,
      status,
      picture {
        url
      },
      physicalAddress {
        id,
        description,
        locality
      }
    }
    total
  }
}

On obtient tous les événements Mobilizon de l'instance de Framasoft:

{
  "data": {
    "events": {
      "elements": [
        {
          "beginsOn": "2021-04-15T10:30:00Z",
          "description": "<p><strong>Rendez-vous au marché de Malakoff</strong></p><ul><li><p><strong>de 12h30 à 13h30 :  </strong>pour la collecte des invendus.</p><p></p></li></ul><p><strong>Rendez-vous au local de Tinhï Kmou</strong> (<a href=\"https://www.openstreetmap.org/node/1650354874#map=17/47.20239/-1.55325\">43 bd Gustave Roch</a>)</p><ul><li><p><strong>de 13h30 à 14h30 : </strong> pour le tri des denrées, avant redistribution.</p></li><li><p><strong>de 14h30 à 16h30 :</strong> pour un moment de convivialité et pour prêter main forte en fonction des besoins.</p></li><li><p><strong>de 16h30 à 17h30 :</strong> pour la redistribution (qui commence à 16h45, mais il vaut mieux s&#39;y préparer pour 16h30)</p></li></ul><p></p><p>Si vous ne pouvez pas venir pour toute l&#39;après-midi, mais uniquement une partie, pas de souci, précisez-le juste en commentaire ! ;)</p><p></p><p><strong>Il y a toujours une petite équipe sur les lieux</strong>, même si elle ne confirme pas sur Mobilizon. Donc ne vous fiez pas au &quot;<em>Personne n&#39;y va</em>&quot; ! ^^&#39;</p>",
          "endsOn": "2021-04-15T15:30:00Z",
          "id": "119518",
          "physicalAddress": {
            "description": "Place Rosa Parks",
            "id": "2175",
            "locality": "Nantes"
          },
          "picture": {
            "url": "https://mobilizon.fr/media/6501928564953590f727739b4754684b43b4293d4c65c43e17a8ebe9b0cc2049.jpg?name=IMG_20210119_142939.jpg"
          },
          "status": "CONFIRMED",
          "title": "JEUDI : Collecte marché de MALAKOFF, tri & distribution",
          "url": "https://mobilizon.fr/events/3a7f78db-17c1-4b98-b4c4-88f7be6e1f95"
        },
        {
          "beginsOn": "2021-04-15T18:30:00Z",
          "description": "<p>La soirée de la SCL du jeudi 15 avril aura pour thème</p>",
          "endsOn": "2021-04-15T21:30:00Z",
          "id": "122113",
          "physicalAddress": null,
          "picture": {
            "url": "https://mobilizon.fr/media/b5fef32cb2e9b6dae03901700637d9fef3b78cb4d6d26bfc3bb55bd549beb396.png?name=Banner.png"
          },
          "status": "CONFIRMED",
          "title": "Soirée de Conversations autour du Libre (SCL) du jeudi 15 avril 2021",
          "url": "https://mobilizon.parinux.org/events/e51b7419-c05d-46bd-8c74-2bca0930af17"
        },
        ...
      ],
      "total": 121
    }
  }
}

Pour de la lecture, il suffirait de proposer un container LDP /events qui renverrait ces données sous forme de pair:Event (par exemple). En terme de configuration, il suffirait d'indiquer le mapping entre données non-sémantiques et sémantiques. Grâce à GraphQL, on ne demanderait que les données qu'on veut mapper.

On pourrait ensuite aggréger les données sur une instance SemApps (https://github.com/assemblee-virtuelle/semapps/issues/674)

Pour de l'écriture, ça demanderait de faire appel à des mutations GraphQL et de gérer l'authentification correctement. Plus compliqué mais pas impossible.

GuillaumeAV commented 3 years ago

Ruben avait publié cet article au sujet de GraphQL & LDP ;) https://ruben.verborgh.org/publications/taelman_iswc_demo_2018/ / https://comunica.github.io/Article-ISWC2018-Demo-GraphQlLD/

srosset81 commented 3 years ago

Ruben n'attaque pas la même problématique. Il propose un outil (disponible ici) qui permet de requêter un serveur SPARQL en utilisant un format similaire à celui de GraphQL (il n'y a d'ailleurs aucun lien avec LDP). Ici je propose de transformer un serveur GraphQL existant en un serveur LDP (donc dans l'autre sens).

Il est vrai que les deux noms peuvent être confondus (GraphQL-LD vs GraphQLDP), il faudra peut-être y repenser.

GuillaumeAV commented 3 years ago

Aah oui j'avais remarqué que c'atait avec du sparql, je ne sais pas pourquoi j'ai mis LDP ...