assemblee-virtuelle / semapps

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

updateSingleMirroredResources ne fonctionne pas s'il y a des blank nodes #1000

Open srosset81 opened 2 years ago

srosset81 commented 2 years ago

ldp.resource.put est cassé avec du Turtle lorsqu'on a des blank nodes. Le GET fonctionne bien mais ensuite le PUT échoue.

J'ai essayé avec https://data.virtual-assembly.org/organizations/animacoop (qui a un blank node au niveau de pair:hasLocation)

J'ai essayé de remplacer avec du JSON-LD:

     try {
        const resourceUri = single.s.value;

        const response = await fetch(resourceUri, { headers: { Accept: MIME_TYPES.JSON } });
        let resource = await response.json();
        resource['http://semapps.org/ns/core#singleMirroredResource'] = new URL(resourceUri).origin;

        await this.broker.call(
          'ldp.resource.put',
          { resource, contentType: MIME_TYPES.JSON, webId: 'system' },
          { meta: { forceMirror: true } }
        );
      } catch (e) {
        this.logger.warn("Failed to update single mirrored resource " + single.s.value);
        console.error(e);
      }

Cela marche à la première mise à jour, mais ensuite j'ai une erreur que je n'ai jamais eu jusqu'ici:

ErrorCoded: Found duplicate @ids 'df_5_0' and 'https://data.virtual-assembly.org/organizations/transiscope'
    at EntryHandlerKeywordId.handle (/home/sebastien/SemApps/semapps/src/middleware/node_modules/jsonld-streaming-parser/lib/entryhandler/keyword/EntryHandlerKeywordId.js:31:42)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async JsonLdParser.newOnValueJob (/home/sebastien/SemApps/semapps/src/middleware/node_modules/jsonld-streaming-parser/lib/JsonLdParser.js:189:21)
    at async JsonLdParser.executeBufferedJobs (/home/sebastien/SemApps/semapps/src/middleware/node_modules/jsonld-streaming-parser/lib/JsonLdParser.js:429:13) {
  code: 'colliding keywords'

Elle vient d'ici: https://github.com/rubensworks/jsonld-streaming-parser.js/blob/master/lib/entryhandler/keyword/EntryHandlerKeywordId.ts

Comme l'opération PUT est coûteuse, ne pourrait-on pas simplement supprimer la ressource et la reposter ? A mon avis on pourrait même passer directement par le service triplestore et mettre à jour la ressource avec une simple requête SPARQL.

nikoPLP commented 2 years ago

Ce n'est pas a proprement parler un bug lié au service de mirroir. Dans le code du service mirroir, il n'y a rien de specifique. on recoit des données nouvelles pour une resource et on fait un PUT. C'est le ldp.resource.put qui ne fonctionne pas avec des blank nodes. Je n'ai pas modifié cette action lors de mon travail sur le service de mirroir. Je veux bien regarder ce qui se passe, mais je me retire comme responsable de ce bug.

srosset81 commented 2 years ago

En tout cas les performances sont mauvaises avec ce que tu as fait. Si tu as des centaines de resources à mettre à jour, ça va prendre des plombes à tout mettre à jour avec des requêtes PUT.

OK je m'occupe de faire la requête SPARQL. Ca me prendra 10 minutes.

nikoPLP commented 2 years ago

pourquoi tu dis ca? on avait justement decidé ensemble d'utiliser le PUT car il fait un diff. Est ce que c'est si lent que ca? En quoi une requete SPARQL va accélerer ? tu veux dire tout supprimer et tout recréer ? Si le PUT en l é'tat actuel est lent (et buggé) alors ca concerne tout le monde, et pas seulement le updateSingleMirroredResources... Ce que tu veux faire c'est de réécrire le PUT pour qu'il fasse un DELETE de tous les triples puis un ajout des nouveaux ? C'est d'ailleurs ca qui est ecrit dans la spec de LDP. Y a t il quelque chose que je ne comprends pas?

srosset81 commented 2 years ago

Je m'en occupe la semaine prochaine et je vois ce que je peux faire en prenant en compte tes commentaires @nikoPLP

srosset81 commented 2 years ago

Et si besoin on s'appelera.