# API SPARQL – Vocabulaires Verisav

Endpoint SPARQL public pour interroger les vocabulaires RDF Verisav (DPP, RMA, WTY) en lecture seule.

## URL

- **Production** : `https://www.verisav.fr/api/sparql`
- **Local** : `http://localhost:3000/api/sparql`

## Protocole

- **GET** : requête dans le paramètre `query` (encodée en URL).
- **POST** :
  - `Content-Type: application/x-www-form-urlencoded` avec champ `query`, ou
  - `Content-Type: application/sparql-query` avec le corps = requête SPARQL.

## Formats de réponse

- **JSON** (défaut) : `Accept: application/sparql-results+json` ou `?format=application/sparql-results+json`
- **XML** : `Accept: application/sparql-results+xml` ou `?format=xml`

## Données interrogées

Un seul graphe virtuel contenant les trois vocabulaires :

- **DPP** : `https://ns.verisav.fr/dpp#`
- **RMA** : `https://ns.verisav.fr/rma#`
- **WTY** : `https://ns.verisav.fr/wty#`

## Exemples de requêtes

### Lister des triplets (tous vocabulaires)

```sparql
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?s ?p ?o
WHERE {
  ?s ?p ?o .
}
LIMIT 20
```

### Classes du vocabulaire DPP

```sparql
PREFIX dpp: <https://ns.verisav.fr/dpp#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>

SELECT ?class ?label
WHERE {
  ?class a owl:Class ;
         rdfs:label ?label .
  FILTER(STRSTARTS(STR(?class), "https://ns.verisav.fr/dpp#"))
}
```

### Propriétés avec leur domaine (DPP)

```sparql
PREFIX dpp: <https://ns.verisav.fr/dpp#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>

SELECT ?prop ?label ?domain
WHERE {
  ?prop a owl:ObjectProperty ;
        rdfs:label ?label ;
        rdfs:domain ?domain .
  FILTER(STRSTARTS(STR(?prop), "https://ns.verisav.fr/dpp#"))
}
LIMIT 50
```

### ASK – le vocabulaire contient-il une classe ProductPassport ?

```sparql
PREFIX dpp: <https://ns.verisav.fr/dpp#>

ASK {
  dpp:ProductPassport a owl:Class .
}
```

### Garantie et statut (exemple SWJ – WTY)

```sparql
PREFIX wty: <https://ns.verisav.fr/wty#>

SELECT ?warranty ?paymentRule ?responsibleParty ?percentage
WHERE {
  ?warranty a wty:Warranty ;
            wty:definesPaymentRule ?paymentRule .
  ?paymentRule wty:firstParty ?responsibleParty ;
               wty:paymentPercentage ?percentage .
}
LIMIT 10
```

## CORS

L’endpoint envoie `Access-Control-Allow-Origin: *` pour permettre les appels depuis n’importe quelle origine (navigateur, outils, scripts).

## Limites

- Taille maximale de la requête : 10 000 caractères.
- Lecture seule : pas de `INSERT` / `DELETE` (uniquement SELECT, ASK, CONSTRUCT, DESCRIBE).

## Erreurs

En cas de requête invalide ou d’échec d’exécution, l’API renvoie un JSON avec les champs `error` et éventuellement `detail` (code HTTP 400).

Sans paramètre `query`, un message d’usage est renvoyé avec des exemples d’appel.
