- From: Melvin Carvalho <melvincarvalho@gmail.com>
- Date: Sun, 12 May 2024 18:42:32 +0200
- To: "Michael C. Thornburgh" <zenomt@zenomt.com>
- Cc: public-linked-json@w3.org
- Message-ID: <CAKaEYhLrTbUC1sqYwR-GoA5zwHXuPZ-=sf1fJafGNVs+Y-m9OQ@mail.gmail.com>
ne 31. 3. 2024 v 12:19 odesÃlatel Michael C. Thornburgh <zenomt@zenomt.com> napsal: > i expected this to have come up already, but i didn't find this sentiment > in > list archives (including the CG and WG lists) or GitHub issues. i'm sure > i'm > not the only one to have thought this, though. > > in the interest of brevity (and foreshadowing), i'll leave most of this as > bullets instead of prose. > > * the full JSON-LD spec is large and complex, and isn't really > "lightweight" (anymore) > * common implementations are huge (jsonld.js is 1.2 MB unminified, 287 KB > minified, 84 KB min+gzip) > * "developer friendly idiomatic JSON": > - counterproductive for pure LD applications > - coercions and other mappings mean a casual human reader can't actually > be sure what the document is saying (as RDF) > - need to know the JSON schema (formal or informal) of every document > type one expects to encounter > - assumes it's too hard, or too much code, to parse and work with RDF > directly > - relative URIs are desirable; those still need to be resolved > * external contexts are problematic: > - privacy > - complexity > - availability, especially when disconnected > - temporal decoupling > * i'd use Turtle for pure Linked Data applications, but processing Turtle > is a lot of code and complexity too, unfortunately > > i propose a simplified profile of JSON-LD, inspired by Turtle: > > * @context can only define an @base, @vocab, and compact IRI prefixes > * IRIs are always in an @id member (except for @type) > * one graph per document (no @graph, use @included if needed) > > * no external contexts (documents are self-contained) > * no recursive compact IRI prefix definitions > * no coercions (except for @type itself) or other transformations > * no @index, @reverse, @nest, @protected, @propogate, @import, etc. > > i'm calling this the "Terse" profile (since Turtle is the "Terse RDF Triple > Language"), identified (for now) by profile URI > > http://zenomt.com/ns/jsonld-terse > > dereferencing that URI yields a more detailed and precise description of > the > constraints. > > my reference implementation for this profile is at > > https://github.com/zenomt/jsonld-terse > > it's currently 201 lines of plain JavaScript (about 7 KB, GitHub says "170 > loc") > with no external dependencies, and gzips to 2116 bytes. it parses and > expands > conforming documents to interconnected Plain Old JavaScript Objects, > resolves > relative URIs given the document's URI and any @base directives, and can > render a graph as a JSON-LD tree rooted from any node (optionally > relativizing > URIs to a provided base, but not "compacting" with an @context) or as an > array > of triples. there's a test page included in the repo, and it's published to > GitHub Pages so there's a live test page to play with. > > limitations of this implementation: @list is intentionally not expanded to > an RDF List, since RDF Lists are harder to work with than JavaScript > Arrays; > only URIs are processed, since web browser JavaScript doesn't provide > native > IRI processing functions. IRIs in documents might end up transformed to > URIs > according to the JavaScript `URL` API. > > example Terse JSON-LD document: > ``` > { > "@context": { > "@base": "https://example.com/people/card", > "foaf": "http://xmlns.com/foaf/0.1/", > "schema": "http://schema.org/" > }, > "@id": "#me", > "@type": ["foaf:Person", "schema:Person"], > "foaf:name": { "@value": "Michael Thornburgh", "@language": "en-us" }, > "foaf:nick": "Mike", > "foaf:depiction": { "@id": "mike.jpg" }, > "schema:worksFor": { > "@type": "schema:Corporation", > "schema:name": "Example Corp.", > "schema:employee": { "@id": "#me" } > }, > "@included": [ > { "@id": "", "@type": "foaf:PersonalProfileDocument", > "foaf:primaryTopic": { "@id": "#me" } }, > { "@id": "_:b86", "foaf:knows": { "@id": "_:b99" } }, > { "@id": "_:b99", "foaf:knows": { "@id": "_:b86" } } > ] > } > ``` > > equivalently expressed as idiomatic Turtle: > ``` > @base <https://example.com/people/card> . > @prefix foaf: <http://xmlns.com/foaf/0.1/> . > @prefix schema: <http://schema.org/> . > > <#me> > a foaf:Person, schema:Person; > foaf:name "Michael Thornburgh"@en-us; > foaf:nick "Mike"; > foaf:depiction <mike.jpg>; > schema:worksFor [ > a schema:Corporation; > schema:name "Example Corp."; > schema:employee <#me> > ] . > > <> a foaf:PersonalProfileDocument; foaf:primaryTopic <#me> . > > _:b86 foaf:knows _:b99 . > _:b99 foaf:knows _:b86 . > ``` > > i hope this is of interest and use to others. > Hi Michael This is great work. You inspired me to create a minimal subset of JSON-LD, which focuses on the @id part: https://linkedobjects.org/Linked-JSON It's called Linked-JSON, and simply aims to make URIs in JSON first class. Community feedback is welcome. Slight interest so far, one researcher at a uni seems to like it. If there's more I'll make some libraries. There is one more possible extension that could align with turtle, and that is to put <URIs> in angle brackets and then transpile them to JSON-LD. Unsure whether or not that's a good idea, but it would make JSON(-LD) look a bit more like turtle. That part is not yet in the spec, just playing around with the idea. Best Melvin > > -michael thornburgh > > >
Received on Sunday, 12 May 2024 16:42:49 UTC