| <html> |
| <head> |
| <link href="http://jena.apache.org/css/jena.css" rel="stylesheet" type="text/css"/> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
| <title>RDF JSON - docs.api</title> |
| </head> |
| <body> |
| |
| <div id="content" style="margin-left: 20px"> |
| |
| <p> |
| <small>This page is taken from <a href="http://docs.api.talis.com/platform-api/output-types/rdf-json">The Talis Systems documentation for RDF/JSON</a>. |
| © Talis Systems Ltd. 2011. The content is available under |
| <a href="http://creativecommons.org/licenses/by-sa/3.0/" target="">Attribution-Share Alike 3.0</a> |
| </small> license. |
| </p> |
| |
| <h1>RDF JSON</h1> |
| |
| <p><a href="http://json.org/">JSON</a> (the serialisation of data |
| in javascript object notation) is an increasingly popular data format, |
| largely because it is easy to parse (or, in the case of javascript, simply |
| evaluate) into a data structure of the consumer's programming language of |
| choice.</p> |
| |
| <p>This is a specification for a resource-centric serialisation of RDF in |
| JSON. It aims to serialise RDF in a structure that is easy for developers |
| to work with.</p> |
| |
| <h2>SyntaxSpecification</h2> |
| |
| <p>RDF/JSON represents a set of RDF triples as a series of nested data structures. |
| Each unique subject in the set of triples is represented as a key in |
| JSON object (also known as associative array, dictionary or hash table). |
| The value of each key is a object whose keys are the URIs of the |
| properties associated with each subject. The value of each property key |
| is an array of objects representing the value of each property.</p> |
| |
| <p>Blank node subjects are named using a string conforming to the <a href="http://www.dajobe.org/2004/01/turtle/#nodeID">nodeID production in Turtle</a>. For example: |
| _:A1</p> |
| |
| <p>In general, a triple (subject <b>S</b>, predicate <b>P</b>, object <b>O</b>) is encoded in the following |
| structure:</p> |
| |
| <pre>{ "S" : { "P" : [ O ] } }</pre> |
| |
| <p>The object of the triple <b>O</b> is represented as a further JSON object with the following |
| keys:</p> |
| |
| <dl> |
| <dt>type</dt> |
| <dd>one of 'uri', 'literal' or 'bnode' (<b>required</b> |
| and must be lowercase)</dd> |
| |
| <dt>value</dt> |
| <dd>the lexical value of the |
| object (<b>required</b>, full URIs should be used, not |
| qnames)</dd> |
| <dt>lang</dt> |
| <dd>the language of a literal value |
| (<b>optional</b> but if supplied it must not be |
| empty)</dd> |
| <dt>datatype</dt> |
| <dd>the datatype URI of the literal value (<b>optional</b>)</dd> |
| </dl> |
| |
| <p>The 'lang' and 'datatype' keys should only be used if the value of the 'type' key is "literal".</p> |
| |
| <p>For example, the following triple:</p> |
| <pre><http://example.org/about> <http://purl.org/dc/elements/1.1/title> "Anna's Homepage" .</pre> |
| |
| <p>can be encoded in RDF/JSON as:</p> |
| |
| <pre>{ |
| "http://example.org/about" : |
| { |
| "http://purl.org/dc/elements/1.1/title": [ { "type" : "literal" , "value" : "Anna's Homepage" } ] |
| } |
| }</pre> |
| |
| <p>Here is an example of the RDF JSON specification in the format of |
| a <a href="http://json-schema.org/">JSON Schema</a>. The latest version can |
| also be found in the <a href="http://soapjr.org/schemas/RDF_JSON">schema |
| section</a> of the <a href="http://soapjr.org/">SOAPjr.org site</a>.</p> |
| |
| <pre>{ |
| "version":"0.3.0", |
| "id":"RDF-JSON", |
| "description":"RDF JSON definition", |
| "type":"object", |
| "properties":{ |
| }, |
| "additionalProperties":{ |
| "type":"object", |
| "description":"subject (root object)", |
| "optional":"true", |
| "properties":{ |
| }, |
| "additionalProperties":{ |
| "type":"array", |
| "description":"predicate (subject object)", |
| "optional":"true", |
| "items":{ |
| "type":"object", |
| "description":"object (value array)", |
| "properties":{ |
| "description":"content (value object)", |
| "type":{ |
| "type":"string", |
| "enum":["uri","bnode","literal"] |
| }, |
| "value":{ |
| "type":"string" |
| }, |
| "lang":{ |
| "optional":true, |
| "description":"See ftp://ftp.isi.edu/in-notes/bcp/bcp47.txt", |
| "type":"string" |
| }, |
| "datatype":{ |
| "optional":true, |
| "format":"uri", |
| "type":"string" |
| } |
| } |
| } |
| } |
| } |
| } |
| </pre> |
| |
| <h2>Examples</h2> |
| |
| <p>The following RDF/XML:</p> |
| <pre><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
| xmlns:foaf="http://xmlns.com/foaf/0.1/" |
| xmlns:dc="http://purl.org/dc/elements/1.1/"> |
| <rdf:Description rdf:about="http://example.org/about"> |
| <dc:creator>Anna Wilder</dc:creator> |
| <dc:title xml:lang="en">Anna's Homepage</dc:title> |
| <foaf:maker rdf:nodeID="person" /> |
| </rdf:Description> |
| <rdf:Description rdf:nodeID="person"> |
| <foaf:homepage rdf:resource="http://example.org/about" /> |
| <foaf:made rdf:resource="http://example.org/about" /> |
| <foaf:name>Anna Wilder</foaf:name> |
| <foaf:firstName>Anna</foaf:firstName> |
| <foaf:surname>Wilder</foaf:surname> |
| <foaf:depiction rdf:resource="http://example.org/pic.jpg" /> |
| <foaf:nick>wildling</foaf:nick> |
| <foaf:nick>wilda</foaf:nick> |
| <foaf:mbox_sha1sum>69e31bbcf58d432950127593e292a55975bc66fd</foaf:mbox_sha1sum> |
| </rdf:Description> |
| </rdf:RDF></pre> |
| <p>Can be represented as the following RDF/JSON structure:</p><pre>{ |
| "http://example.org/about" : { |
| "http://purl.org/dc/elements/1.1/creator" : [ { "value" : "Anna Wilder", "type" : "literal" } ], |
| "http://purl.org/dc/elements/1.1/title" : [ { "value" : "Anna's Homepage", "type" : "literal", "lang" : "en" } ] , |
| "http://xmlns.com/foaf/0.1/maker" : [ { "value" : "_:person", "type" : "bnode" } ] |
| } , |
| |
| "_:person" : { |
| "http://xmlns.com/foaf/0.1/homepage" : [ { "value" : "http://example.org/about", "type" : "uri" } ] , |
| "http://xmlns.com/foaf/0.1/made" : [ { "value" : "http://example.org/about", "type" : "uri" } ] , |
| "http://xmlns.com/foaf/0.1/name" : [ { "value" : "Anna Wilder", "type" : "literal" } ] , |
| "http://xmlns.com/foaf/0.1/firstName" : [ { "value" : "Anna", "type" : "literal" } ] , |
| "http://xmlns.com/foaf/0.1/surname" : [ { "value" : "Wilder", "type" : "literal" } ] , |
| "http://xmlns.com/foaf/0.1/depiction" : [ { "value" : "http://example.org/pic.jpg", "type" : "uri" } ] , |
| "http://xmlns.com/foaf/0.1/nick" : [ |
| { "type" : "literal", "value" : "wildling"} , |
| { "type" : "literal", "value" : "wilda" } |
| ] , |
| "http://xmlns.com/foaf/0.1/mbox_sha1sum" : [ { "value" : "69e31bbcf58d432950127593e292a55975bc66fd", "type" : "literal" } ] |
| } |
| }</pre> |
| |
| <h2>Serialisation Algorithm</h2> |
| |
| <p>Refer to <a href="http://json.org/">http://json.org/</a> for definitions of |
| terminology</p> |
| |
| <ol> |
| <li>Start a JSON object (called the root object)</li> |
| <li>Group all the triples by subject</li> |
| <li>For each subject: |
| <ol> |
| <li>Create a JSON object for the subject (called the subject |
| object)</li> |
| <li>Group all triples having the current subject by predicate</li> |
| <li>For each predicate:<ol> |
| <li>Create a JSON array (called the value array)</li> |
| <li>Select all triples having the current subject and current |
| predicate</li> |
| <li>For each value: |
| <ol> |
| <li>Create a JSON object (called the value object)</li> |
| |
| <li>Add a key/value pair to the value object with the key |
| being the string "value" and the value being the lexical |
| value of the triple value</li> |
| |
| <li>Add a key/value pair to |
| the value object with the key being the string "type" and |
| the value being one of "literal", "uri" or "bnode" |
| depending on the type of the triple's value</li> |
| #content |
| <li>If the triple's value is a plain literal and has a |
| language then add a key/value pair to the value object with the key being |
| the string "lang" and the value being the language token</li> |
| |
| <li>If the triple's value is a typed literal then add a |
| key/value pair to the value object with the key being the string |
| "datatype" and value being the URI of the datatype</li> |
| |
| <li>Push the value object onto the end of the value array</li> |
| </ol> |
| </li> |
| <li>Add a key/value pair to the subject object with the key being the predicate URI and the value being the value |
| array</li> |
| </ol> |
| </li> |
| <li>Add a key/value pair to the root object with the key being the |
| URI or blank node identifier of the subject and the value being the |
| subject object created in the previous step</li> |
| </ol> |
| </li> |
| </ol> |
| |
| <!-- |
| <h3>Further Examples</h3> |
| |
| <p>RDF/XML can be converted into the specified RDF/JSON format by using |
| the <a href="http://convert.test.talis.com/">http://convert.test.talis.com</a> |
| web service.</p> |
| --> |
| <h2>Publishing RDF/JSON on the web</h2> |
| |
| <p>If doing content-negotiation, respond to, and send the content-type |
| as <code>application/json</code>. An empty graph (ie: no triples) should |
| be served as an empty object: <code>{}</code>.</p> |
| |
| <h2>References</h2> |
| |
| <ol> |
| <li><a href="http://www.ietf.org/rfc/rfc3066.txt">Tags |
| for the Identification of |
| Languages</a></li> |
| <li><a href="http://docs.api.talis.com/system/errors/NodeNotFound?suri=wuid:gx:785d2e15fb97c7a4">RDF JSON |
| Brainstorming</a></li> |
| <li><a href="http://json.org/">http://json.org/</a></li> |
| <li><a href="http://www.ietf.org/rfc/rfc3986.txt">Uniform |
| Resource Identifier (URI): Generic |
| Syntax</a> |
| </li> |
| </ol> |
| </div> |
| </body> |
| </html> |