W3C home > Mailing lists > Public > public-linked-json@w3.org > March 2016

Combining JSON-LD and JSON reference

From: Mitar <mmitar@gmail.com>
Date: Wed, 16 Mar 2016 02:41:06 -0700
Message-ID: <CAKLmikPn3WBFnkBakqYP80W-COJB+smFbLQXdwaTxw6X3+rx4A@mail.gmail.com>
To: public-linked-json@w3.org
Hi!

I have an issue how to combine JSON-LD and JSON reference in a meaningful way.

For example, if I have internally many-to-many relation of devices,
which I represent as an array:

{
  "id": 333,
  "devices": [
    {
      "id": 123,
      "name": "keyboard"
    }
  ,
    {
      "id": 567,
      "name": "mouse"
    }
  ],
  "interfaces": [
    {
      "id": 999,
      "path": "key0",
      "device": 123
    },
    {
      "id": 897,
      "path": "mouse0",
      "device": 567
    }
  ]
}

So IDs come from the rows in the database. And now I would like to
convert this to something meaningful in JSON-LD, but to keep
references working. So I tried with this:

{
  "@id": "http://example.com/mapping/333",
  "@base": "http://example.com/mapping/333",
  "@context": "http://example.com/context",
  "devices": [
    {
      "@id": "#/devices/0",
      "@type": "http://example.com/type/keyboard",
      "name": "keyboard"
    }
  ,
    {
      "@id": "#/devices/1",
      "@type": "http://example.com/type/mouse",
     "name": "mouse"
    }
  ],
  "interfaces": [
    {
      "@id": "#/interfaces/0,
      "path": "key0",
      "device": {
        "$ref": "#/devices/0"
      }
    },
    {
      "@id": "#/interfaces/1,
      "path": "mouse0",
      "device": {
        "$ref": "#/devices/1"
      }
   }
  ]
}

So this looks like it has desired properties. Relative @id fields
nicely combine with @base, and $ref can reference those array elements
as well. The issue is that getting array index is very hard,
especially for references which point to documents not part of the
current query. It would be much better if one could reuse row IDs.

But the issue is that JSON references support only array indexes,
nothing fancy like matching by @Id.

I was thinking of extending JSON reference with @ syntax, to something like:


{
  "@id": "http://example.com/mapping/333",
  "@base": "http://example.com/mapping/333",
  "@context": "http://example.com/context",
  "devices": [
    {
      "@id": "#/devices/@123",
      "@type": "http://example.com/type/keyboard",
      "name": "keyboard"
    }
  ,
    {
      "@id": "#/devices/@567",
      "@type": "http://example.com/type/mouse",
     "name": "mouse"
    }
  ],
  "interfaces": [
    {
      "@id": "#/interfaces/@999,
      "path": "key0",
      "device": {
        "$ref": "#/devices/@123"
      }
    },
    {
      "@id": "#/interfaces/@897,
      "path": "mouse0",
      "device": {
        "$ref": "#/devices/@567"
      }
   }
  ]
}

But it is unclear what exactly would be semantics of @ operator. Like,
to traverse the augmented JSON reference you traverse JSON object, and
then you get to @ you have to search for @id with the full reference
as a value? Strange definition.

So what is a recommended way to address this? To have references,
which you can as needed dereference to fill with subdocuments.


Mitar

-- 
http://mitar.tnode.com/
https://twitter.com/mitar_m
Received on Wednesday, 16 March 2016 09:41:35 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 16:18:47 UTC