Transcript
Page 1: JSON-LD: Linked Data for Web Apps

JSON-LDLinked Data for Web Apps

Gregg [email protected]

@gkellogg

Tuesday, July 10, 12

Page 2: JSON-LD: Linked Data for Web Apps

Introducing JSON-LD

JSON-based syntax to express linked data

@context@id

@type

@value

@language

@graph

@list

@set

Tuesday, July 10, 12

JSON-LD brings a standard representation for expressing entity-value relationships using a few standard keywords and a consistent organizational structure for JSON Objects.•Objects represent entities, with keys acting as properties.•Properties always expand to full IRIs.

•Arrays express a set of values associated with a property, unordered by default.•Order expressed in @context or as an expanded value representation.

•Values are Object, string or native, with standard XSD representations for native types.•Expanded form allows for more datatype and language variations.

Page 3: JSON-LD: Linked Data for Web Apps

Self-describing Messages• Give objects types

(@type){ "@context": { "schema": "http://schema.org/", "Person": "schema:Person", "knows": {"@id": "schema:knows", "@type": "@id"}, "name": "schema:name", "image": {"@id": "schema:image", "@type": "@id"}, "url": {"@id": "schema:url", "@type": "@id"} }}

{ "@context": "http://example.com/context.jsonld", "@type": "Person", "image": "http://localhost:9393/examples/schema.org/janedoe.jpg", "knows": [ "http://www.xyz.edu/students/alicejones.html", "http://www.xyz.edu/students/bobsmith.html" ], "name": "Jane Doe", "url": "http://www.janedoe.com"}

Tuesday, July 10, 12

The @type key gives an object with one or more types, described with an IRI.The @context provides a way to express IRIs as simple terms, and allows values to be typed.

Page 4: JSON-LD: Linked Data for Web Apps

Self-describing Messages• Give objects types

(@type)

• Associate properties with IRIs

{ "@context": { "schema": "http://schema.org/", "Person": "schema:Person", "knows": {"@id": "schema:knows", "@type": "@id"}, "name": "schema:name", "image": {"@id": "schema:image", "@type": "@id"}, "url": {"@id": "schema:url", "@type": "@id"} }}

{ "@context": "http://example.com/context.jsonld", "@type": "Person", "image": "http://localhost:9393/examples/schema.org/janedoe.jpg", "knows": [ "http://www.xyz.edu/students/alicejones.html", "http://www.xyz.edu/students/bobsmith.html" ], "name": "Jane Doe", "url": "http://www.janedoe.com"}

Tuesday, July 10, 12

Page 5: JSON-LD: Linked Data for Web Apps

Self-describing Messages• Give objects types

(@type)

• Associate properties with IRIs

• Use terms defined in a referenced context

{ "@context": { "schema": "http://schema.org/", "Person": "schema:Person", "knows": {"@id": "schema:knows", "@type": "@id"}, "name": "schema:name", "image": {"@id": "schema:image", "@type": "@id"}, "url": {"@id": "schema:url", "@type": "@id"} }}

{ "@context": "http://example.com/context.jsonld", "@type": "Person", "image": "http://localhost:9393/examples/schema.org/janedoe.jpg", "knows": [ "http://www.xyz.edu/students/alicejones.html", "http://www.xyz.edu/students/bobsmith.html" ], "name": "Jane Doe", "url": "http://www.janedoe.com"}

Tuesday, July 10, 12

Page 6: JSON-LD: Linked Data for Web Apps

Self-describing Messages• Give objects types

(@type)

• Associate properties with IRIs

• Use terms defined in a referenced context

• Specify property types in context

{ "@context": { "schema": "http://schema.org/", "Person": "schema:Person", "knows": {"@id": "schema:knows", "@type": "@id"}, "name": "schema:name", "image": {"@id": "schema:image", "@type": "@id"}, "url": {"@id": "schema:url", "@type": "@id"} }}

{ "@context": "http://example.com/context.jsonld", "@type": "Person", "image": "http://localhost:9393/examples/schema.org/janedoe.jpg", "knows": [ "http://www.xyz.edu/students/alicejones.html", "http://www.xyz.edu/students/bobsmith.html" ], "name": "Jane Doe", "url": "http://www.janedoe.com"}

Tuesday, July 10, 12

Page 7: JSON-LD: Linked Data for Web Apps

RDF Mapping

{ "@context": { "schema": "http://schema.org/", "schema:knows": {"@type": "@id"}, "schema:image": {"@type": "@id"}, "schema:url": {"@type": "@id"} }}

{ "@context": "http://example.com/context.jsonld", "@type": "schema:Person", "schema:image": "http://localhost:9393/examples/schema.org/janedoe.jpg", "schema:knows": [ "http://www.xyz.edu/students/alicejones.html", "http://www.xyz.edu/students/bobsmith.html" ], "schema:name": "Jane Doe", "schema:url": "http://www.janedoe.com"}

@prefix schema: <http://schema.org/> .[ a schema:Person; schema:image <http://localhost:9393/examples/schema.org/janedoe.jpg >; schema:knows <http://www.xyz.edu/students/alicejones.html>, <http://www.xyz.edu/students/bobsmith.html>; schema:name “Jane Doe”; schema:url <http://www.janedoe.com>] .

Tuesday, July 10, 12

Page 8: JSON-LD: Linked Data for Web Apps

History

• 2010 – Started as a way to project from the RDFa API

• Developers want solutions to work within HTML applications

• Desire for JSON-idiomatic way of representing RDF (Linked Data)

• Adapt existing JSON APIs to Linked Data

Tuesday, July 10, 12

Page 9: JSON-LD: Linked Data for Web Apps

History

• 2011 – W3C Community Group launched

• Broad Participation

• Separation of Syntax from API

• Proposed to W3C RDF 1.1 Working Group

Tuesday, July 10, 12

Page 10: JSON-LD: Linked Data for Web Apps

History

• 2012 – RDF WG abandons other JSON serialization efforts (RDF/JSON)

• JSON-LD accepted as official work item

• Community Group drafts final report

• RDF WG to publish JSON-LD (Syntax and API) as FPWD

Tuesday, July 10, 12

Page 11: JSON-LD: Linked Data for Web Apps

Language Principles

Tuesday, July 10, 12

Page 12: JSON-LD: Linked Data for Web Apps

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": "http://www.markus-lanthaler.com/"}

•Make full use of JSON syntactic representations

• Object defines a subject definition

Tuesday, July 10, 12

Page 13: JSON-LD: Linked Data for Web Apps

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": "http://www.markus-lanthaler.com/"}

•Make full use of JSON syntactic representations

• Object defines a subject definition

{ "@id": "http://greggkellogg.net/foaf#me" }• Also used for subject

reference and value representations

Tuesday, July 10, 12

Page 14: JSON-LD: Linked Data for Web Apps

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": "http://www.markus-lanthaler.com/"}

•Make full use of JSON syntactic representations

• Object defines a subject definition

{ "@id": "http://greggkellogg.net/foaf#me" }• Also used for subject

reference and value representations

•Arrays describe sets of unordered values

• Single values can skip array

{ "@type": "Recipe", "name": "Mom's World Famous Banana Bread", "ingredients": [ "3 or 4 ripe bananas, smashed", "1 egg", "3/4 cup of sugar" ], "nutrition": [{ "@type": ["NutritionInformation"], "calories": ["240 calories"], "fatContent": ["9 grams fat"] }]}

Tuesday, July 10, 12

Page 15: JSON-LD: Linked Data for Web Apps

{ "@id": "http://greggkellogg.net/foaf#me", "@type": "http://schema.org/Person", "http://schema.org/name": "Gregg Kellogg", "http://schema.org/knows": { "@id": "http://www.markus-lanthaler.com/" }}

• Define terms to use short property names

• Convenient for JavaScript “.” notation

{ "@context": { "Person": "http://schema.org/Person", "name": "http://schema.org/name", "knows”: "http://schema.org/knows" }, "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": {"@id": "http://www.markus-lanthaler.com/"}}

Tuesday, July 10, 12

Page 16: JSON-LD: Linked Data for Web Apps

• Define terms to use short property names

• Convenient for JavaScript “.” notation

• Add @type coercions to use simple string value.

{ "@id": "http://greggkellogg.net/foaf#me", "@type": "http://schema.org/Person", "http://schema.org/name": "Gregg Kellogg", "http://schema.org/knows": { "@id": "http://www.markus-lanthaler.com/" }}{ "@context": { "schema": "http://schema.org/", "Person": "schema:Person", "name": "schema:name", "knows”: { "@id": "schema:knows", "@type": "@id" }, "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": "http://www.markus-lanthaler.com/"}

Tuesday, July 10, 12

Page 17: JSON-LD: Linked Data for Web Apps

• Define terms to use short property names

• Convenient for JavaScript “.” notation

• Add @type coercions to use simple string value.

{ "@id": "http://greggkellogg.net/foaf#me", "@type": "http://schema.org/Person", "http://schema.org/name": "Gregg Kellogg", "http://schema.org/knows": { "@id": "http://www.markus-lanthaler.com/" }}{ "@context": { "schema": "http://schema.org/", "Person": "schema:Person", "name": "schema:name", "knows”: { "@id": "schema:knows", "@type": "@id" }}

• Use external @context.

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": "http://www.markus-lanthaler.com/"}

Tuesday, July 10, 12

Page 18: JSON-LD: Linked Data for Web Apps

• Define referenced subject definition with chaining

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": { "@id": "http://www.markus-lanthaler.com/", "@type": "Person", "name": "Markus Lanthaler", "knows" "http://greggkellogg.net/foaf#me" }}

Tuesday, July 10, 12

Subject reference identifies an object with @id in the same document, or references an external document (Linked Data).

Page 19: JSON-LD: Linked Data for Web Apps

• Define referenced subject definition with chaining

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": { "@id": "http://www.markus-lanthaler.com/", "@type": "Person", "name": "Markus Lanthaler", "knows" "http://greggkellogg.net/foaf#me" }}

• Add @language to values.

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "honorificSuffix": {"@value": "M.S.", "@language": "en"}, "knows": { "@id": "http://www.markus-lanthaler.com/", "@type": "Person", "name": "Markus Lanthaler", "honorificSuffix": {"@value": "Dipl.Ing.", "@language": "de"}, "knows" "http://greggkellogg.net/foaf#me" }}

Tuesday, July 10, 12

Subject reference identifies an object with @id in the same document, or references an external document (Linked Data).

Page 20: JSON-LD: Linked Data for Web Apps

• Add @type to values.

• Link to externally defined resources.

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "birthDate": {"@value": "1957-02-27", "@type": "xsd:date"}, "honorificSuffix": {"@value": "M.S.", "@language": "en"}, "knows": "http://www.markus-lanthaler.com/"}

Tuesday, July 10, 12

Page 21: JSON-LD: Linked Data for Web Apps

• Add property @type and @language definitions to context

{ "@context": { "schema": "http://schema.org/", "Person": "schema:Person", "name": "schema:name", "birthDate”: { "@id": "schema: birthDate","@type": "xsd:date" }, "honorificSuffix”: { "@id": "schema:honorificSuffix","@language": "en" }, "knows”: {"@id": "schema:knows","@type": "@id"} }, "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "birthDate": "1957-02-27", "honorificSuffix": "M.S.", "knows": "http://www.markus-lanthaler.com/"}

Tuesday, July 10, 12

Page 22: JSON-LD: Linked Data for Web Apps

• More features defined in the syntax specification*:

• @set, @list, Compact IRIs, Unlabeled Nodes

• Embedded @context definitions

• Named Graphs

* http://json-ld.org/spec/latest/json-ld-syntax

Tuesday, July 10, 12

Page 23: JSON-LD: Linked Data for Web Apps

Retrofit existing APIs

GET /foaf.json HTTP/1.1Host: greggkellogg.netAccept: application/json,*/*;q=0.1

====================================

HTTP/1.0 200 OK...Content-Type: application/jsonLink: <http://json-ld.org/contexts/person>; rel="describedby"; type="application/ld+json"

{ "name": "Gregg Kellogg", "homepage": "http://greggkellogg.net/", "depiction": "http://twitter.com/account/profile_image/gkellogg"}

Tuesday, July 10, 12

Normal JSON can be made JSON-LD by adding an external context through an HTTP link relation.

Page 24: JSON-LD: Linked Data for Web Apps

The “LD” in JSON-LD• IRIs are first-class

citizens { "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": "http://www.markus-lanthaler.com/"}

http://greggkellogg.net/foaf

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://www.markus-lanthaler.com/", "@type": "Person", "name": "Markus Lanthaler", "knows" "http://greggkellogg.net/foaf#me"}

http://www.markus-lanthaler.com

Tuesday, July 10, 12

Page 25: JSON-LD: Linked Data for Web Apps

The “LD” in JSON-LD• IRIs are first-class

citizens

• Object definitions may be referenced or embedded

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": { "@id": "http://www.markus-lanthaler.com/", "@type": "Person", "name": "Markus Lanthaler", "knows" "http://greggkellogg.net/foaf#me" }}

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://greggkellogg.net/foaf#me", "@type": "Person", "name": "Gregg Kellogg", "knows": "http://www.markus-lanthaler.com/"}

http://greggkellogg.net/foaf

{ "@context": "http://json-ld.org/contexts/person", "@id": "http://www.markus-lanthaler.com/", "@type": "Person", "name": "Markus Lanthaler", "knows" "http://greggkellogg.net/foaf#me"}

http://www.markus-lanthaler.com

Tuesday, July 10, 12

Page 26: JSON-LD: Linked Data for Web Apps

JSON-LD API

• compact – use minimal representation using a supplied @context

• expand – expand to full form, removing embedded @context definitions

• frame – query for JSON-LD

• fromRDF/toRDF

Tuesday, July 10, 12

Page 27: JSON-LD: Linked Data for Web Apps

More Information

json-ld.org

w3c

JavaScript

Ruby

Python

Java

C++

PHP

Gregg Kellogg

@gkellogg

[email protected]://greggkellogg.net/

Tuesday, July 10, 12


Top Related