jsonjson-ldlinked-dataturtle-rdf

Alias a JSON-LD keyword and simultaneously provide a @context for it


I have the following JSON document (based on GitHub API output):

{
  "@id": "https://github.com/octadocs/octadocs",
  "license": {
    "key": "mit",
    "name": "MIT License",
    "spdx_id": "MIT",
    "url": "https://api.github.com/licenses/mit",
    "node_id": "MDc6TGljZW5zZTEz"
  }
}

Using JSON-LD, I'd like to retrieve the following triple from this:

<https://github.com/octadocs/octadocs>
    <https://octadocs.io/github/license>
    <https://spdx.org/licenses/MIT> .

Context:

{
  "@base": "https://octadocs.io/github/",
  "@vocab": "https://octadocs.io/github/",
  "spdx_id": {
    "@type": "@id",
    "@context": {
      "@base": "https://spdx.org/licenses/"
    }
  }
}

See a demonstration in JSON-LD playground.

But, this creates a slightly different structure than the desired one:

<https://github.com/octadocs/octadocs> <https://octadocs.io/github/license> _:b0 .
_:b0 <https://octadocs.io/github/spdx_id> <https://spdx.org/licenses/MIT> .

I'd like to avoid the blank node.

This can be achieved by JSON-LD keyword aliasing:

{
  ...,
  "spdx_id": "@id"
}

but how to simultaneously


Solution

  • What you want to do is remove the @vocab definition within license, alias spdx_id to @id, and remove the default vocabulary. This treats the object value of license as a node object (really node reference) as all keys other than spdx_id are ignored. See playground link here.

    {
      "@context": {
        "@base": "https://octadocs.io/github/",
        "@vocab": "https://octadocs.io/github/",
        "license": {
          "@context": {
            "@vocab": null,
            "spdx_id": "@id"
          }
        }
      },
      "@id": "https://github.com/octadocs/octadocs",
      "license": {
        "key": "mit",
        "name": "MIT License",
        "spdx_id": "MIT",
        "url": "https://api.github.com/licenses/mit",
        "node_id": "MDc6TGljZW5zZTEz"
      }
    }