Download - JSON-LD
![Page 1: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/1.jpg)
JSON-LDThomas Francart,
Ce travail est réutilisable et modifiable librement, y compris à des fins commerciales, à condition de citer son auteur et d’être placé sous la même licence. Pour plus d’informations, voir la licence.
Put « Linked Data » in your JSON !
![Page 2: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/2.jpg)
JSON-LDest une façon d'écrire des données liées (= du RDF) en JSON.
{ "@context": "http://json-ld.org/contexts/person.jsonld", "@id": "http://dbpedia.org/resource/John_Lennon", "name": "John Lennon", "born": "1940-10-09", "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"}
![Page 3: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/3.jpg)
JSON-LD permet :
• de rendre compatible des API JSON existantes avec les données liées;• d’inclure facilement des données liées dans du HTML;
![Page 4: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/4.jpg)
JSON
![Page 5: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/5.jpg)
Des accolades indiquent un objet
Les chaines de caractères sont entre guillemets doubles
Les propriétés des objets sont indiquées avec une clé, deux-points, et une valeur.
Les propriétés sont séparées par des virgules
{un objet}"string"
{"clé1": valeur1, "clé2": valeur2
}
![Page 6: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/6.jpg)
[truc1, truc2,
truc3]{ "nom": "Francart", "prénoms": ["Thomas", "André", "Maurice"], "adresse": { "numéro": "10", "voie": "Allée de montrichard", "cp": "37000", "ville": "Tours" }}
Un crochet indique une liste (de chaines de caractères ou d'objets)
Les valeurs des clés sont soit des chaines de caractères, soit des objets, soit des listes.
![Page 7: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/7.jpg)
Les clés spéciales de JSON-LD (basiques)
@context@id@value@language@type
![Page 8: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/8.jpg)
Les clés spéciales de JSON-LD (avancées)
@container@index@list@set@reverse@base@vocab@graph
![Page 9: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/9.jpg)
Vite ! Un exemple
{ "@context": { "name": "http://schema.org/name", "image": { "@id": "http://schema.org/image", "@type": "@id" }, "homepage": { "@id": "http://schema.org/url", "@type": "@id" } }, "name": "Manu Sporny", "homepage": "http://manu.sporny.org/", "image": "http://manu.sporny.org/images/manu.png"}
« name » est un raccourci pour http://schema.org/name« image » est un raccourci pour schema:image et doit être interprété comme une URI
![Page 10: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/10.jpg)
Vite ! Un testhttp://json-ld.org/playground
_:b0 <http://schema.org/image> <http://manu.sporny.org/images/manu.png> ._:b0 <http://schema.org/name> "Manu Sporny" ._:b0 <http://schema.org/url> <http://manu.sporny.org/> .
Du JSON-LD est interprété comme des triplets RDF (onglet « N-QUADS »)
![Page 11: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/11.jpg)
@context, @id, @type : les bases
![Page 12: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/12.jpg)
@contextLe contexte défini un mapping des clés JSON vers des IRIs
{ "@context" : { "nom" : "http://schema.org/name", "société" : "http://schema.org/affiliation" }, "nom" : "Thomas Francart", "société" : "http://sparna.fr"}
![Page 13: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/13.jpg)
L’ @id des objets JSON@id permet d'indiquer l'IRI d'un objet JSON
{ "@context" : { "nom" : "http://schema.org/name", "société" : "http://schema.org/affiliation" }, "@id" : "http://sparna.fr/qui-suis-je", "nom" : "Thomas Francart", "société" : "http://sparna.fr"}
![Page 14: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/14.jpg)
les IRIs avec @idLes valeurs de la clé @id sont converties en IRI.On peut ainsi spécifier des valeurs de clé IRI et non pas chaines de caractères.
{ "@context" : { "nom" : "http://schema.org/name", "société" : "http://schema.org/affiliation" }, "nom" : "Thomas Francart", "société" : { "@id" : "http://sparna.fr" }}
![Page 15: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/15.jpg)
les IRIs avec @idOn peut spécifier que les valeurs d’une clé sont toujours des IRIs en indiquant dans le contexte "@type" : "@id"{
"@context" : { "name" : "http://schema.org/name", "société" : { "@id" : "http://schema.org/url", "@type" : "@id" } }, "nom" : "Thomas Francart", "société" : "http://sparna.fr"}
![Page 16: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/16.jpg)
les IRIs des propriétésLes clés de valeurs en JSON-LD / RDF sont toujours des IRIs• soit parce qu'on les a mappé dans le contexte• soit si la clé est déjà une IRI
{ … "http://schema.org/affiliation" : "http://sparna.fr"}
Toutes les clés JSON qui ne se ramènent pas à des IRIs sont ignorées lors de l’interprétation du JSON-LD
![Page 17: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/17.jpg)
Le @type des objets JSON@type permet d'indiquer le rdf:type d'un objet JSON
{ "@context" : { "nom" : "http://schema.org/name" }, "@id" : "http://sparna.fr/qui-suis-je", "@type" : "http://schema.org/Person", "nom" : "Thomas Francart" }
Les valeurs de @type sont toujours interprétées comme des IRIs (comme les valeurs de @id)
![Page 18: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/18.jpg)
Imbriquer des objetsOn peut (évidemment) imbriquer des objets
{ "@context" : { "nom" : "http://schema.org/name", "société" : "http://schema.org/affiliation" }, "nom" : "Thomas Francart", "société" : { "@id" : "http://sparna.fr", "nom" : "Sparna" } }
![Page 19: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/19.jpg)
Les tableauxUn tableau JSON permet de spécifier plusieurs valeurs pour la même propriété
{"@context" : {
"nom" : "http://schema.org/name","profession" : "http://schema.org/jobTitle"
},"nom" : "Thomas Francart","profession" : [
"Philosophe des métadonnées","Machiniste dans les usines d'information"
]}
Attention, le tableau JSON ordonné est donc interprété de façon non-ordonnée !
![Page 20: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/20.jpg)
@vocab et les préfixes :raccourcir les IRIs
![Page 21: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/21.jpg)
Raccourcir les @typeLa valeur d'un @type peut aussi être déclarée dans le @context
{"@context" : {
"nom" : "http://schema.org/name","Personne" : "http://schema.org/Person"
},"@id" : "http://sparna.fr/qui-suis-je","@type" : "Personne","nom" : "Thomas Francart"
}
![Page 22: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/22.jpg)
@vocab@vocab indique, dans le contexte, la racine d'IRI pour toutes les clés et les valeurs de type qui n'auraient pas pu être converties en IRI
{"@context" : {
"@vocab" : "http://schema.org/"},"@id" : "http://sparna.fr/qui-suis-je","@type" : "Person","name" : "Thomas Francart"
}
![Page 23: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/23.jpg)
Les préfixesLes IRIs peuvent aussi être écrites sous forme "prefixe:truc", si le préfixe a été déclaré dans le contexte
{"@context" : {
"s" : "http://schema.org/","nom" : "s:name"
},"@id" : "http://sparna.fr/qui-suis-je","@type" : "s:Person","nom" : "Thomas Francart"
}
![Page 24: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/24.jpg)
Les préfixesLes préfixes permettent de travailler avec plusieurs vocabulaires de façon plus simple
{"@context" : {
"schema" : "http://schema.org/","foaf" : "http://xmlns.com/foaf/0.1/","nom" : "schema:name","age" : "foaf:age"
},"@id" : "http://sparna.fr/qui-suis-je","@type" : "schema:Person","nom" : "Thomas Francart","age" : "23"
}
![Page 25: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/25.jpg)
@value, @type, @language :
typage et langue des valeurs
![Page 26: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/26.jpg)
@value + @typeLa combinaison de @value et @type permet de créer des valeurs avec des datatypes :{"@context" : {
"xsd" : "http://www.w3.org/2001/XMLSchema#",
"nom" : "http://schema.org/name","naissance" :
"http://schema.org/birthDate"},"nom" : "Thomas Francart","naissance" : {
"@value" : "1980-09-22T01:23:45+02:00","@type" : "xsd:dateTime"
}}
![Page 27: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/27.jpg)
@type des valeurs dans le @context
On peut déclarer le @type des valeurs d’une clé dans le contexte (comme pour @id)
{"@context" : {
"xsd" : "http://www.w3.org/2001/XMLSchema#",
"nom" : "http://schema.org/name","naissance" : {
"@id" : "http://schema.org/birthDate",
"@type" : "xsd:dateTime"}
},"nom" : "Thomas Francart","naissance" : "1980-09-22T01:23:45+02:00"
}
![Page 28: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/28.jpg)
@value + @languageLa combinaison de @value et @language permet de créer des valeurs avec une langue{"@context" : {
"nom" : "http://schema.org/name","profession" :
"http://schema.org/jobTitle"},"nom" : "Thomas Francart","profession" : {
"@value" : "Cultivateur de métadonnées","@language" : "fr"
}}
![Page 29: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/29.jpg)
@language des valeurs dans le @contextOn peut déclarer le @language des valeurs d’une clé dans le contexte (comme pour @id)
{"@context" : {
"nom" : "http://schema.org/name","profession" : {
"@id" : "http://schema.org/jobTitle",
"@language" : "fr"}
},"nom" : "Thomas Francart","profession" : "Cultivateur de métadonnées"
}
![Page 30: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/30.jpg)
@language des valeurs dans le @contextOn peut déclarer un @language par défaut
{"@context" : {
"@language" : "fr","nom" : "http://schema.org/name","profession" :
"http://schema.org/jobTitle"},"nom" : "Thomas Francart","profession" : "Cultivateur de métadonnées"
}
![Page 31: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/31.jpg)
@context avancé
![Page 32: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/32.jpg)
Comment spécifier le @context
Il y a 4 façons d’indiquer le @context :
1.Inline2.Par une URL3.Par une entête HTTP (pour une
API JSON)4.Au moment de parser le JSON
(dans du code)
![Page 33: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/33.jpg)
Spécifier le @context par URL
{ "@context": "http://schema.org", "@id": "http://dbpedia.org/resource/John_Lennon", "name": "John Lennon", “@type": “Person", “jobTitle”: “Scarabée numéro 1”}
Schema.org fournit son context JSON-LD. Pour le voir :curl --header "Accept: application/ld+json"
http://schema.org/
![Page 34: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/34.jpg)
Spécifier le @context par entête HTTP
GET /ordinary-json-document.json HTTP/1.1Host: example.comAccept: application/ld+json,application/json,*/*;q=0.1
====================================
HTTP/1.1 200 OK...Content-Type: application/jsonLink: <http://json-ld.org/contexts/person.jsonld>; rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json"
{ "name": "Markus Lanthaler", "homepage": "http://www.markus-lanthaler.com/", "image": "http://twitter.com/account/profile_image/markuslanthaler"}
Permet de rendre des API JSON compatibles « Linked Data » sans y toucher, en ajoutant simplement une entête
dans la réponse.
![Page 35: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/35.jpg)
Spécifier le @context par API
API « jsonld-java » (https://github.com/jsonld-java/jsonld-java)
Intégrée dans RDF4J// Open a valid json(-ld) input fileInputStream inputStream = new FileInputStream("input.json");// Read the file into an Object (The type of this object will be a List, Map, String, Boolean, // Number or null depending on the root object in the file).Object jsonObject = JsonUtils.fromInputStream(inputStream);// Create a context JSON map containing prefixes and definitionsMap context = new HashMap();// Customise context... //Create an instance of JsonLdOptions with the standard JSON-LD optionsJsonLdOptions options = new JsonLdOptions();// Customise options...// Call whichever JSONLD function you want! (e.g. compact)Object compact = JsonLdProcessor.compact(jsonObject, context, options);// Print out the result (or don't, it's your call!) System.out.println(JsonUtils.toPrettyString(compact));
![Page 36: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/36.jpg)
Surcharger les @context
On peut spécifier plusieurs @context. Les @context se surchargent et le dernier déclaré gagne.
{"@context" : "http://schema.org","name" : "Thomas Francart","@type" : "Person","affiliation" : {
"@context" : {"name" :
"http://xmlns.com/foaf/0.1/"},"name" : "Sparna"
}}
![Page 37: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/37.jpg)
Sérialisations JSON-LD :
« expended », « compacted »,
« flattened »
![Page 38: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/38.jpg)
« Expanded document form »Etendre toutes les IRIs, les types et les valeurs d’un document pour se passer du @context
{ "@context" : { "nom" : "http://schema.org/name", "profession" : { "@id": "http://schema.org/jobTitle", "@language": "fr" } }, "nom" : "Thomas Francart", "profession" : "Cultivateur de métadonnées"}
{ "http://schema.org/name" : "Thomas Francart", "http://schema.org/jobTitle" : { "@value" : "Cultivateur de métadonnées", "@language": "fr" }}
![Page 39: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/39.jpg)
« Compacted document form »C’est l’inverse : on part d’un document « expanded » et on applique un context dessus.
{ "@context" : { "nom" : "http://schema.org/name", "profession" : { "@id": "http://schema.org/jobTitle", "@language": "fr" } }, "nom" : "Thomas Francart", "profession" : "Cultivateur de métadonnées"}
{ "http://schema.org/name" : "Thomas Francart", "http://schema.org/jobTitle" : { "@value" : "Cultivateur de métadonnées", "@language": "fr" }}
{ "@context" : { "nom" : "http://schema.org/name", "profession" : { "@id": "http://schema.org/jobTitle", "@language": "fr" } }}
![Page 40: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/40.jpg)
« flattened document form »Donne un @id à tous les objets, regroupe toutes les propriétés des objets ensemble, et mets tous les objets à plat
{ "@context": { “name": "http://xmlns.com/foaf/0.1/name", "knows": "http://xmlns.com/foaf/0.1/knows" }, "@id": "http://sparna.fr/qui-suis-je/” "name": “Thomas Francart", "knows": [ { "@id": "http://inserm.fr/jean-charlet", "name": “Jean Charlet" }, { "name": “Jean Delahousse" } ]}
{ "@context": { "name": "http://xmlns.com/foaf/0.1/name", "knows": "http://xmlns.com/foaf/0.1/knows" }, "@graph": [ { "@id": "_:b0", "name": “Jean Delahousse" }, { "@id": “http://inserm.fr/jean-charlet", "name": “Jean Charlet" }, { "@id": "http://sparna.fr/qui-suis-je/", "name": “Thomas Francart", "knows": [ { "@id": "http://inserm.fr/jean-charlet" }, { "@id": "_:b0" } ] } ]}
![Page 41: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/41.jpg)
Inclure du JSON-LD dans du HTML
On inclut le JSON-LD dans une balise HTML <script> avec le type « application/ld+json »
<head> (ou <body>)…<script type="application/ld+json">{
"@context" : "http://schema.org","name" : "Thomas Francart","@type" : "Person",
}</script>…
</head>
![Page 42: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/42.jpg)
JSON-LDà emporter
![Page 43: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/43.jpg)
• Simplicité• Compatibilité• Expressivité• Lisibilité• « Zero-Edits » (pour rendre une API JSON
compatible)
• Utilisable comme du RDF
![Page 44: JSON-LD](https://reader036.vdocuments.fr/reader036/viewer/2022070512/5889ec751a28ab32458b62f9/html5/thumbnails/44.jpg)
thomas.francart@
Web deStructuration des
Accès aux
sparna.fr
donnéesinformationsconnaissances