1 of 25

JSON, JSON Schema, JSON-LD

Data Formats tutorial

2 of 25

Initial information

  • JSON extensions for VS Code
    • syntax highlight, formatting
  • JSONLint - free online JSON formatter
  • JSON Schema Validator
  • Jim Blackler's JSON tools - validator
  • JSON-LD Playground - transforms JSON-LD to RDF N-Quads (N-Triples)
    • can be further transformed to RDF Turtle e.g. via Apache Jena riot (RDF Input Output Tool)
  • jq
    • jq - command-line version
    • jq tutorial, jq manual
    • jq online

The data is sometimes too big to fit in a slide. In that case, copy it from the slide to e.g. Visual Studio Code to see it properly and whole.

2

3 of 25

Task 1

Create a simple JSON document on arbitrary topic with at least

  • 3 levels of nesting
    • arrays and objects
  • numbers, boolean values
  • strings

Make sure the JSON is syntactically correct using JSONLint

3

4 of 25

Task 1 - solution

{

"iri": "https://data.gov.cz/lkod/mdcr/katalog",

"type": "Catalog",

"title": {

"cs": "Katalog otevřených dat Ministerstva dopravy",

"en": "Open Data Catalog of the Ministry of Transport"

},

"description": {

"cs": "Otevřená data Ministerstva dopravy. Obsahuje datové sady o jízdních řádech a liniových vedeních veřejné dopravy.",

"en": "Open data of the Ministry of Transport. It contains datasets regarding timetables of public transport."

},

"contact_point": {

"type": "Organization",

"title": {

"cs": "Ministerstvo dopravy, Odbor veřejné dopravy",

"en": "Ministry of Transport"

},

"e-mail": "mailto:sekretariat.190@mdcr.cz"

},

"public": true,

"homepage": "https://data.gov.cz/datové-sady?poskytovatel=https%3A%2F%2Frpp-opendata.egon.gov.cz%2Fodrpp%2Fzdroj%2Forgán-veřejné-moci%2F66003008",

"publisher": "https://rpp-opendata.egon.gov.cz/odrpp/zdroj/orgán-veřejné-moci/66003008",

"datasets": 3,

"dataset": [

"https://data.gov.cz/lkod/mdcr/datové-sady/vld",

"https://data.gov.cz/lkod/mdcr/datové-sady/seznam-zastavky",

"https://data.gov.cz/lkod/mdcr/datové-sady/seznam-trate"

]

}

4

5 of 25

jq

Now, we will be working with jq using this JSON file, again representing a data catalog with datasets and their distributions.

  • jq - command-line version
  • jq tutorial, jq manual
  • jq online

{

"iri": "https://data.gov.cz/lkod/mdcr/katalog",

"type": "Catalog",

"title": {

"cs": "Katalog otevřených dat Ministerstva dopravy",

"en": "Open Data Catalog of the Ministry of Transport"

},

"description": {

"cs": "Otevřená data Ministerstva dopravy. Obsahuje datové sady o jízdních řádech a liniových vedeních veřejné dopravy.",

"en": "Open data of the Ministry of Transport. It contains datasets regarding timetables of public transport."

},

"contact_point": {

"type": "Organization",

"name": {

"cs": "Ministerstvo dopravy, Odbor veřejné dopravy",

"en": "Ministry of Transport"

},

"e-mail": "mailto:sekretariat.190@mdcr.cz"

},

"homepage": "https://data.gov.cz/datové-sady?poskytovatel=https%3A%2F%2Frpp-opendata.egon.gov.cz%2Fodrpp%2Fzdroj%2Forgán-veřejné-moci%2F66003008",

"publisher": "https://rpp-opendata.egon.gov.cz/odrpp/zdroj/orgán-veřejné-moci/66003008",

"dataset": [

{

"iri": "https://data.gov.cz/lkod/mdcr/datové-sady/vld",

"type": "Dataset",

"title": {

"cs": "Jízdní řády veřejné linkové dopravy",

"en": "Public transport timetables"

},

"description": {

"cs": "Obsahem datové sady jsou schválené a aktuálně platné jízdní řády veřejné linkové dopravy postoupené do Celostátního informačního systému o jízdních řádech ve strojově zpracovatelném formátu.",

"en": "This dataset contains approved timetables and timetables in effect for public transport entered into the state-wide timetable information system."

},

"publisher": "https://rpp-opendata.egon.gov.cz/odrpp/zdroj/orgán-veřejné-moci/66003008",

"theme": [

"http://publications.europa.eu/resource/authority/data-theme/TRAN"

],

"accrual_periodicity": "http://publications.europa.eu/resource/authority/frequency/WEEKLY_3",

"keyword": {

"cs": [

"jízdní řády",

"veřejná linková doprava",

"autobus"

],

"en": [

"timetable",

"public transport",

"bus"

]

},

"spatial": [

"http://publications.europa.eu/resource/authority/continent/EUROPE"

],

"rúian": [

"https://linked.cuzk.cz/resource/ruian/stat/1"

],

"temporal": {

"type": "Time interval",

"start": "2009-01-01",

"end": "2017-12-31"

},

"contact_point": {

"type": "Organization",

"name": {

"cs": "Ministerstvo dopravy, Odbor veřejné dopravy",

"en": "Ministry of Transport"

},

"e-mail": "mailto:sekretariat.191@mdcr.cz"

},

"documentation": "https://www.mdcr.cz/Dokumenty/Verejna-doprava/Jizdni-rady,-kalendare-pro-jizdni-rady,-metodi-(1)/Jizdni-rady-verejne-dopravy",

"specification": [

"https://ofn.gov.cz/jízdní-řády/2020-05-01/"

],

"euroVoc": [

"http://eurovoc.europa.eu/4512"

],

"spatial_resolution_in_meters": 12,

"temporal_resolution": "P1D",

"distribution": [

{

"iri": "https://data.gov.cz/lkod/mdcr/datové-sady/vld/distribuce/csv",

"type": "Distribution",

"terms_of_use": {

"type": "Terms of use specification",

"autorské_dílo": "https://creativecommons.org/licenses/by/4.0/",

"autor": {

"cs": "Ministerstvo dopravy, Odbor veřejné dopravy"

},

"databáze_chráněná_zvláštními_právy": "https://data.gov.cz/podmínky-užití/není-chráněna-zvláštním-právem-pořizovatele-databáze/",

"databáze_jako_autorské_dílo": "https://creativecommons.org/licenses/by/4.0/",

"autor_databáze": {

"cs": "Ministerstvo dopravy, Odbor veřejné dopravy"

},

"osobní_údaje": "https://data.gov.cz/podmínky-užití/neobsahuje-osobní-údaje/"

},

"access_url": "https://portal.cisjr.cz/pub/draha/mestske/JDF.zip",

"download_url": "https://portal.cisjr.cz/pub/draha/mestske/JDF.zip",

"format": "http://publications.europa.eu/resource/authority/file-type/ZIP",

"media_type": "http://www.iana.org/assignments/media-types/application/json",

"schema": "https://portal.cisjr.cz/schemata/json-schema.json",

"compression_media_type": "http://www.iana.org/assignments/media-types/application/zip",

"package_media_type": "http://www.iana.org/assignments/media-types/application/zip",

"title": {

"en": "JSON distribution in ZIP file",

"cs": "JSON distribuce v ZIP soubrou"

}

},

{

"iri": "https://data.gov.cz/lkod/mdcr/datové-sady/vld/distribuce/sparql",

"type": "Distribution",

"terms_of_use": {

"type": "Terms of use specification",

"autorské_dílo": "https://data.gov.cz/podmínky-užití/neobsahuje-autorská-díla/",

"databáze_chráněná_zvláštními_právy": "https://data.gov.cz/podmínky-užití/není-chráněna-zvláštním-právem-pořizovatele-databáze/",

"databáze_jako_autorské_dílo": "https://data.gov.cz/podmínky-užití/není-autorskoprávně-chráněnou-databází/",

"osobní_údaje": "https://data.gov.cz/podmínky-užití/neobsahuje-osobní-údaje/"

},

"access_url": "https://portal.cisjr.cz/sparql",

"title": {

"en": "SPARQL endpoint for timetables",

"cs": "SPARQL endpoint pro jízdní řády"

},

"access_service": {

"iri": "https://data.gov.cz/lkod/mdcr/datové-sady/vld/služba/sparql",

"type": "Data Service",

"title": {

"cs": "SPARQL endpoint pro jízdní řády",

"en": "SPARQL endpoint for timetables"

},

"specification": [

"https://www.w3.org/TR/sparql11-protocol/"

],

"access_point": "https://portal.cisjr.cz/sparql",

"access_point_description": "https://portal.cisjr.cz/sparql"

}

}

]

},

{

"iri": "https://data.gov.cz/lkod/mdcr/datové-sady/žld",

"type": "Dataset",

"title": {

"cs": "Jízdní řády železniční linkové dopravy",

"en": "Railroad timetables"

},

"description": {

"cs": "Obsahem datové sady jsou schválené a aktuálně platné jízdní řády železniční linkové dopravy postoupené do Celostátního informačního systému o jízdních řádech ve strojově zpracovatelném formátu.",

"en": "This dataset contains approved railroad timetables entered into the state-wide timetable information system."

},

"publisher": "https://rpp-opendata.egon.gov.cz/odrpp/zdroj/orgán-veřejné-moci/66003008",

"theme": [

"http://publications.europa.eu/resource/authority/data-theme/TRAN"

],

"accrual_periodicity": "http://publications.europa.eu/resource/authority/frequency/WEEKLY_3",

"keyword": {

"cs": [

"jízdní řády",

"železniční doprava",

"vlak"

],

"en": [

"timetable",

"railroad",

"train"

]

},

"spatial": [

"http://publications.europa.eu/resource/authority/continent/EUROPE"

],

"rúian": [

"https://linked.cuzk.cz/resource/ruian/stat/1"

],

"temporal": {

"type": "Time interval",

"start": "2009-01-01",

"end": "2017-12-31"

},

"contact_point": {

"type": "Organization",

"name": {

"cs": "Ministerstvo dopravy, Odbor veřejné dopravy",

"en": "Ministry of Transport"

},

"e-mail": "mailto:sekretariat.190@mdcr.cz"

},

"documentation": "https://www.mdcr.cz/Dokumenty/Verejna-doprava/Jizdni-rady,-kalendare-pro-jizdni-rady,-metodi-(1)/Jizdni-rady-verejne-dopravy",

"specification": [

"https://ofn.gov.cz/jízdní-řády/2020-05-01/"

],

"euroVoc": [

"http://eurovoc.europa.eu/4512"

],

"spatial_resolution_in_meters": 12,

"temporal_resolution": "P1D",

"distribution": [

{

"iri": "https://data.gov.cz/lkod/mdcr/datové-sady/vld/distribuce/csv",

"type": "Distribution",

"terms_of_use": {

"type": "Terms of use specification",

"autorské_dílo": "https://creativecommons.org/licenses/by/4.0/",

"autor": {

"cs": "Ministerstvo dopravy, Odbor veřejné dopravy"

},

"databáze_chráněná_zvláštními_právy": "https://data.gov.cz/podmínky-užití/není-chráněna-zvláštním-právem-pořizovatele-databáze/",

"databáze_jako_autorské_dílo": "https://creativecommons.org/licenses/by/4.0/",

"autor_databáze": {

"cs": "Ministerstvo dopravy, Odbor veřejné dopravy"

},

"osobní_údaje": "https://data.gov.cz/podmínky-užití/neobsahuje-osobní-údaje/"

},

"access_url": "https://portal.cisjr.cz/pub/draha/mestske/JDF.zip",

"download_url": "https://portal.cisjr.cz/pub/draha/mestske/JDF.zip",

"format": "http://publications.europa.eu/resource/authority/file-type/ZIP",

"media_type": "http://www.iana.org/assignments/media-types/application/json",

"schema": "https://portal.cisjr.cz/schemata/json-schema.json",

"compression_media_type": "http://www.iana.org/assignments/media-types/application/zip",

"package_media_type": "http://www.iana.org/assignments/media-types/application/zip",

"title": {

"en": "JSON distribution in ZIP file",

"cs": "JSON distribuce v ZIP soubrou"

}

},

{

"iri": "https://data.gov.cz/lkod/mdcr/datové-sady/vld/distribuce/sparql",

"type": "Distribution",

"terms_of_use": {

"type": "Terms of use specification",

"autorské_dílo": "https://data.gov.cz/podmínky-užití/neobsahuje-autorská-díla/",

"databáze_chráněná_zvláštními_právy": "https://data.gov.cz/podmínky-užití/není-chráněna-zvláštním-právem-pořizovatele-databáze/",

"databáze_jako_autorské_dílo": "https://data.gov.cz/podmínky-užití/není-autorskoprávně-chráněnou-databází/",

"osobní_údaje": "https://data.gov.cz/podmínky-užití/neobsahuje-osobní-údaje/"

},

"access_url": "https://portal.cisjr.cz/sparql",

"title": {

"en": "SPARQL endpoint for timetables",

"cs": "SPARQL endpoint pro jízdní řády"

},

"access_service": {

"iri": "https://data.gov.cz/lkod/mdcr/datové-sady/vld/služba/sparql",

"type": "Data Service",

"title": {

"cs": "SPARQL endpoint pro jízdní řády",

"en": "SPARQL endpoint for timetables"

},

"specification": [

"https://www.w3.org/TR/sparql11-protocol/"

],

"access_point": "https://portal.cisjr.cz/sparql",

"access_point_description": "https://portal.cisjr.cz/sparql"

}

}

]

}

]

}

5

6 of 25

Task 2

Using jq, create a JSON object with the English data catalog name.

6

7 of 25

Task 2 - solution

{"title": .title.en}

�����{

"title": "Open Data Catalog of the Ministry of Transport"

}

7

8 of 25

Task 3

Using jq, create a JSON object with the English title of the first dataset.

8

Hint: .[0]

9 of 25

Task 3 - solution

.dataset | .[0] | {"title": .title.en}

{"title": .dataset | .[0] | .title.en}

{

"title": "Public transport timetables"

}

9

10 of 25

Task 4

Using jq, create a JSON array with e-mails of contact points of datasets in the catalog.

10

Hint: .[]

11 of 25

Task 4

{"e-mails": [.dataset | .[] | .contact_point."e-mail"]}

{

"e-mails": [

"mailto:sekretariat.191@mdcr.cz",

"mailto:sekretariat.190@mdcr.cz"

]

}

11

12 of 25

Task 5

Create a JSON Schema and corresponding valid JSON instance describing public contracts

  • The document must contain at least one contract
  • Each contract has
    • URI, publishedTime
    • contractData (content not specified)
  • Use proper types and formats

12

Conceptually:

13 of 25

Task 5 - solution

{

"$schema": "https://json-schema.org/draft/2020-12/schema",

"$id": "https://example.org/public-contracts-schema.json",

"type": "array",

"title": "Public contracts",

"minItems": 1,

"items": {

"type": "object",

"title": "Public contract",

"properties": {

"uri": {

"type": "string",

"format": "uri"

},

"publishedTime": {

"type": "string",

"format": "date-time"

}

},

"required": [

"uri",

"publishedTime",

"contractData"

]

}

}

[

{

"type": "Contract",

"uri": "http://ex.org/contracts/1",

"publishedTime": "2021-04-30T01:00:00",

"contractData": null

}

]

13

14 of 25

Task 6

Extend the previous JSON Schema and JSON document so that

  • Contract data involve
    • title (Czech and/or English)
    • price (number, currency).
    • contracting authority and supplier
    • optionally also publisher (text)
  • Contracting authority, supplier are companies, which have
    • name (Czech and/or English)
    • id (8 digit number)
    • address (text)
  • Try to specify the company structure only once, via "$ref" and $defs
  • Keep the document valid against the schema

14

Conceptually:

Hierarchically:

See the speaker notes for details about the notations.

15 of 25

Task 6 - solution - part 1 - $defs

{

"$schema": "https://json-schema.org/draft/2020-12/schema",

"$id": "https://example.org/public-contracts-schema.json",

"$defs": {

"company": {

"type": "object",

"required": [

"name",

"id",

"address"

],

"properties": {

"name": {

"anyOf": [

{

"type": "object",

"required": [

"cs"

],

"properties": {

"cs": {

"type": "string"

}

}

},

{

"type": "object",

"required": [

"en"

],

"properties": {

"en": {

"type": "string"

}

}

}

]

},

"id": {

"type": "string",

"pattern": "^[0-9]{8}$"

},

"address": {

"type": "string"

}

}

}

}

}

[

{

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"contractData": {

"title": {

"cs": "Pomocné práce v závodní jídelně"

},

"price": {

"value": 35678,

"currency": "http://publications.europa.eu/resource/authority/currency/CZK"

},

"contracting_authority": {

"type": ["Company", "Contracting Authority"],

"name": {

"cs": "Česká republika - Ministerstvo životního prostředí"

},

"id": "00164801",

"address": "Vršovická 1442/65 Praha 10010 Czech Republic"

},

"supplier": {

"type": ["Company", "Supplier"],

"name": {

"cs": "Kamil M"

},

"id": "67416501",

"address": "Pernerova 536/6 Praha 18600 Czech Republic"

},

"publisher": "Ing. Miroslava, ředitelka odboru vnitřní správy"

}

}

]

15

16 of 25

Task 6 - solution - part 2 - language map

"anyOf": [

{

"type": "object",

"required": [

"cs"

],

"properties": {

"cs": {

"type": "string"

}

}

},

{

"type": "object",

"required": [

"en"

],

"properties": {

"en": {

"type": "string"

}

}

}

]

[

{

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"contractData": {

"title": {

"cs": "Pomocné práce v závodní jídelně"

},

"price": {

"value": 35678,

"currency": "http://publications.europa.eu/resource/authority/currency/CZK"

},

"contracting_authority": {

"type": ["Company", "Contracting Authority"],

"name": {

"cs": "Česká republika - Ministerstvo životního prostředí"

},

"id": "00164801",

"address": "Vršovická 1442/65 Praha 10010 Czech Republic"

},

"supplier": {

"type": ["Company", "Supplier"],

"name": {

"cs": "Kamil M"

},

"id": "67416501",

"address": "Pernerova 536/6 Praha 18600 Czech Republic"

},

"publisher": "Ing. Miroslava, ředitelka odboru vnitřní správy"

}

}

]

16

17 of 25

Task 6 - solution - part 3 - $ref

{

"$schema": "https://json-schema.org/draft/2020-12/schema",

"$id": "https://example.org/public-contracts-schema.json",

"type": "array",

"title": "Public contracts",

"minItems": 1,

"items": {

"type": "object",

"title": "Public contract",

"properties": {

"contractData": {

"type": "object",

"properties": {

"price": {

"type": "object",

"required": [

"value",

"currency"

],

"properties": {

"value": {

"type": "number"

},

"currency": {

"type": "string",

"format": "uri"

}

}

},

"contracting_authority": {

"$ref": "#/$defs/company"

},

"supplier": {

"$ref": "#/$defs/company"

},

}

[

{

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"contractData": {

"title": {

"cs": "Pomocné práce v závodní jídelně"

},

"price": {

"value": 35678,

"currency": "http://publications.europa.eu/resource/authority/currency/CZK"

},

"contracting_authority": {

"type": ["Company", "Contracting Authority"],

"name": {

"cs": "Česká republika - Ministerstvo životního prostředí"

},

"id": "00164801",

"address": "Vršovická 1442/65 Praha 10010 Czech Republic"

},

"supplier": {

"type": ["Company", "Supplier"],

"name": {

"cs": "Kamil M"

},

"id": "67416501",

"address": "Pernerova 536/6 Praha 18600 Czech Republic"

},

"publisher": "Ing. Miroslava, ředitelka odboru vnitřní správy"

}

}

]

17

18 of 25

Task 6 - solution (copy & paste somewhere else)

{

"$schema": "https://json-schema.org/draft/2020-12/schema",

"$id": "https://example.org/public-contracts-schema.json",

"$defs": {

"company": {

"type": "object",

"required": [

"name",

"id",

"address"

],

"properties": {

"name": {

"anyOf": [

{

"type": "object",

"required": [

"cs"

],

"properties": {

"cs": {

"type": "string"

}

}

},

{

"type": "object",

"required": [

"en"

],

"properties": {

"en": {

"type": "string"

}

}

}

]

},

"id": {

"type": "string",

"pattern": "^[0-9]{8}$"

},

"address": {

"type": "string"

}

}

}

},

"type": "array",

"title": "Public contracts",

"minItems": 1,

"items": {

"type": "object",

"title": "Public contract",

"properties": {

"uri": {

"type": "string",

"format": "uri"

},

"publishedTime": {

"type": "string",

"format": "date-time"

},

"contractData": {

"type": "object",

"properties": {

"title": {

"anyOf": [

{

"type": "object",

"required": [

"cs"

],

"properties": {

"cs": {

"type": "string"

}

}

},

{

"type": "object",

"required": [

"en"

],

"properties": {

"en": {

"type": "string"

}

}

}

]

},

"price": {

"type": "object",

"required": [

"value",

"currency"

],

"properties": {

"value": {

"type": "number"

},

"currency": {

"type": "string",

"format": "uri"

}

}

},

"contracting_authority": {

"$ref": "#/$defs/company"

},

"supplier": {

"$ref": "#/$defs/company"

},

"publisher": {

"type": "string"

}

},

"required": [

"title",

"price",

"contracting_authority",

"supplier"

]

}

},

"required": [

"uri",

"publishedTime",

"contractData"

]

}

}

[

{

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"contractData": {

"title": {

"cs": "Pomocné práce v závodní jídelně"

},

"price": {

"value": 35678,

"currency": "http://publications.europa.eu/resource/authority/currency/CZK"

},

"contracting_authority": {

"type": ["Company", "Contracting Authority"],

"name": {

"cs": "Česká republika - Ministerstvo životního prostředí"

},

"id": "00164801",

"address": "Vršovická 1442/65 Praha 10010 Czech Republic"

},

"supplier": {

"type": ["Company", "Supplier"],

"name": {

"cs": "Kamil M"

},

"id": "67416501",

"address": "Pernerova 536/6 Praha 18600 Czech Republic"

},

"publisher": "Ing. Miroslava, ředitelka odboru vnitřní správy"

}

},

{

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153341",

"publishedTime": "2018-02-01T07:33:14+01:00",

"contractData": {

"title": {

"cs": "Smlouva o projektové přípravě (akce III/3963, ul.Rakšická)"

},

"price": {

"value": 24,

"currency": "http://publications.europa.eu/resource/authority/currency/USD"

},

"contracting_authority": {

"type": ["Company", "Contracting Authority"],

"name": {

"cs": "Město Moravský Krumlov"

},

"id": "00293199",

"address": "Nám. Klášterní 125 Moravský Krumlov 67201 Czech Republic"

},

"supplier": {

"type": ["Company", "Supplier"],

"name": {

"cs": "Sivio Plan, s.r.o."

},

"id": "27738809",

"address": "Sochorova 3178/23 Brno 61600 Czech Republic"

}

}

},

{

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153345",

"publishedTime": "2019-02-01T07:33:39+01:00",

"contractData": {

"title": {

"cs": "Dohoda o zabezpečení vzdělávací aktivity zaměstnanců a potencionálních zaměstnanců a poskytnutí příspěvku v rámci projektu \"POVEZ II\" č. CVA-MN-26/2016"

},

"price": {

"value": 2159400,

"currency": "http://publications.europa.eu/resource/authority/currency/CZK"

},

"contracting_authority": {

"type": ["Company", "Contracting Authority"],

"name": {

"cs": "Úřad práce ČR - krajská pobočka v Ústí nad Labem"

},

"id": "72496991",

"address": "Cihlářská 4107 Chomutov 43003 Czech Republic"

},

"supplier": {

"type": ["Company", "Supplier"],

"name": {

"cs": "Etalon Industries s.r.o."

},

"id": "26729610",

"address": "Karlovarská 5578 Chomutov 43001 Czech Republic"

},

"publisher": "Mgr. et Mgr. Robert"

}

}

]

18

19 of 25

Task 7 - very basic JSON-LD

Using JSON-LD, map the following JSON file to the given RDF shape.

Use JSON-LD Playground,

Apache Jena riot: riot --pretty=turtle data.jsonld

@prefix dcterms: <http://purl.org/dc/terms/> .

@prefix ns1: <http://example.org/vocabulary/> .

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<https://smlouvy.gov.cz/smlouva/1153037> a ns1:PublicContract ;

ns1:publishTime "2017-02-01T00:13:13+01:00"^^xsd:dateTime ;

dcterms:title "Pomocné práce v závodní jídelně"@cs .

19

{

"@type": "http://example.org/vocabulary/PublicContract",

"@id": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"title": {

"cs": "Pomocné práce v závodní jídelně"

}

}

20 of 25

Task 7 - solution

{

"@context": {

"publishedTime": {

"@id": "http://example.org/vocabulary/publishTime",

"@type": "http://www.w3.org/2001/XMLSchema#dateTime"

},

"title": {

"@id": "http://purl.org/dc/terms/title",

"@container": "@language"

}

},

"@type": "http://example.org/vocabulary/PublicContract",

"@id": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"title": {

"cs": "Pomocné práce v závodní jídelně"

}

}

@prefix dcterms: <http://purl.org/dc/terms/> .

@prefix ns1: <http://example.org/vocabulary/> .

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<https://smlouvy.gov.cz/smlouva/1153037> a ns1:PublicContract ;

ns1:publishTime "2017-02-01T00:13:13+01:00"^^xsd:dateTime ;

dcterms:title "Pomocné práce v závodní jídelně"@cs .

20

21 of 25

Task 8 - basic JSON-LD

Using JSON-LD, map the following JSON file to the given RDF shape.

Use JSON-LD Playground, Apache Jena riot.

HINT: you can use "@nest" from JSON-LD 1.1 to deal with the "contractData" artificially nested object.

  • its contents in real world relates to the Public Contract itself, however, it is nested in the JSON file.

@prefix dcterms: <http://purl.org/dc/terms/> .

@prefix ns1: <http://example.org/vocabulary/> .

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<https://smlouvy.gov.cz/smlouva/1153037> a ns1:PublicContract ;

ns1:publishTime "2017-02-01T00:13:13+01:00"^^xsd:dateTime ;

dcterms:title "Pomocné práce v závodní jídelně"@cs .

21

{

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"contractData": {

"title": {

"cs": "Pomocné práce v závodní jídelně"

}

}

}

22 of 25

Task 8 - solution

{

"@context": {

"ex": "http://example.org/vocabulary/",

"dcterms": "http://purl.org/dc/terms/",

"xsd": "http://www.w3.org/2001/XMLSchema#",

"type": "@type",

"Contract": "ex:PublicContract",

"uri": "@id",

"publishedTime": {

"@id": "ex:publishTime",

"@type": "xsd:dateTime"

},

"contractData": "@nest",

"title": {

"@id": "dcterms:title",

"@container": "@language"

}

},

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"contractData": {

"title": {

"cs": "Pomocné práce v závodní jídelně"

}

}

}

@prefix dcterms: <http://purl.org/dc/terms/> .

@prefix ns1: <http://example.org/vocabulary/> .

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<https://smlouvy.gov.cz/smlouva/1153037> a ns1:PublicContract ;

ns1:publishTime "2017-02-01T00:13:13+01:00"^^xsd:dateTime ;

dcterms:title "Pomocné práce v závodní jídelně"@cs .

22

23 of 25

Task 8 - solutions with array

{

"@context": {

"ex": "http://example.org/vocabulary/",

"dcterms": "http://purl.org/dc/terms/",

"xsd": "http://www.w3.org/2001/XMLSchema#",

"type": "@type",

"Contract": "ex:PublicContract",

"uri": "@id",

"publishedTime": {

"@id": "ex:publishTime",

"@type": "xsd:dateTime"

},

"contractData": "@nest",

"title": {

"@id": "dcterms:title",

"@container": "@language"

}

},

"@graph": [

{

"@type": "Contract",

"@id": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00"

},

{

"@type": "Contract",

"@id": "https://smlouvy.gov.cz/smlouva/1154037",

"publishedTime": "2017-02-01T00:13:13+01:00"

}

]

}

[

{

"@context": {

"ex": "http://example.org/vocabulary/",

"dcterms": "http://purl.org/dc/terms/",

"xsd": "http://www.w3.org/2001/XMLSchema#",

"type": "@type",

"Contract": "ex:PublicContract",

"uri": "@id",

"contracts": "@nest",

"publishedTime": {

"@id": "ex:publishTime",

"@type": "xsd:dateTime"

},

"contractData": "@nest",

"title": {

"@id": "dcterms:title",

"@container": "@language"

}

},

"type": "Contract",

"uri": "https://smlouvy.gov.cz/smlouva/1153037",

"publishedTime": "2017-02-01T00:13:13+01:00",

"contractData": {

"title": {

"cs": "Pomocné práce v závodní jídelně"

}

}

}

]

23

24 of 25

Task 9

By adding JSON-LD @context to data from Task 6, transform the displayed subset of data to RDF Turtle.

  • For contract names, use dcterms:title
  • For the rest of classes and properties, use the following IRI pattern
    • http://example.org/vocabulary/*
  • For instances, use the following IRI pattern
    • http://example.org/resource/*
  • Keep the data types according to the JSON Schema
  • Validate the output using http://ttl.summerofcode.be/

24

25 of 25

Task 9 - solution

Add this to every object in the Contract array. In production, this can be shortened by using an external @context or embedding the array in an object alongside the @context.��If we would like to change companies to use IRIs and not be blank nodes, we would have to add their IRIs to the base JSON.

"@context": {

"ex": "http://example.org/vocabulary/",

"dcterms": "http://purl.org/dc/terms/",

"xsd": "http://www.w3.org/2001/XMLSchema#",

"type": "@type",

"Contract": "ex:PublicContract",

"Company": "ex:Company",

"Supplier": "ex:Supplier",

"Contracting Authority": "ex:ContractingAuthority",

"uri": "@id",

"publishedTime": {

"@id": "ex:publishTime",

"@type": "xsd:dateTime"

},

"contractData": "@nest",

"title": {

"@id": "dcterms:title",

"@container": "@language"

},

"contracting_authority": {

"@id": "ex:contractingAuthority"

},

"supplier": {

"@id": "ex:supplier"

},

"id": {

"@id": "ex:id"

}

},

@prefix dcterms: <http://purl.org/dc/terms/> .

@prefix ns1: <http://example.org/vocabulary/> .

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<https://smlouvy.gov.cz/smlouva/1153037> a ns1:PublicContract ;

ns1:contractingAuthority [ a ns1:Company,

ns1:ContractingAuthority ;

ns1:id "00164801" ] ;

ns1:publishTime "2017-02-01T00:13:13+01:00"^^xsd:dateTime ;

ns1:supplier [ a ns1:Company,

ns1:Supplier ;

ns1:id "67416501" ] ;

dcterms:title "Pomocné práce v závodní jídelně"@cs .

<https://smlouvy.gov.cz/smlouva/1153341> a ns1:PublicContract ;

ns1:contractingAuthority [ a ns1:Company,

ns1:ContractingAuthority ;

ns1:id "00293199" ] ;

ns1:publishTime "2018-02-01T07:33:14+01:00"^^xsd:dateTime ;

ns1:supplier [ a ns1:Company,

ns1:Supplier ;

ns1:id "27738809" ] ;

dcterms:title "Smlouva o projektové přípravě (akce III/3963, ul.Rakšická)"@cs .

<https://smlouvy.gov.cz/smlouva/1153345> a ns1:PublicContract ;

ns1:contractingAuthority [ a ns1:Company,

ns1:ContractingAuthority ;

ns1:id "72496991" ] ;

ns1:publishTime "2019-02-01T07:33:39+01:00"^^xsd:dateTime ;

ns1:supplier [ a ns1:Company,

ns1:Supplier ;

ns1:id "26729610" ] ;

dcterms:title "Dohoda o zabezpečení vzdělávací aktivity zaměstnanců a potencionálních zaměstnanců a poskytnutí příspěvku v rámci projektu \"POVEZ II\" č. CVA-MN-26/2016"@cs .

25