Skip to content
A proposal for representing graph structure (nodes / edges) in JSON.
Ruby
Branch: master
Clone or download

README.md

json-graph-specification

A proposal for representing graph structures in JSON.

Links

Continuous Integration

image

Design principles

  • Use meaningful property names that reflect the semantic type of the value.
  • Property names should not be excessively long.
  • Property names should be plural when value is an array.
  • Properties that allow a null value can be omitted.
  • Define a JSON graph schema for content validation purposes.

Structure

node object

A node object represents a node in a graph.

node properties

  • Each node object must contain a string key which is the unique id for the node
  • A label property provides a text display for an object. Its value is defined as a JSON string.
  • A metadata property allows for custom data on an object. Its values is defined as a JSON object.

edge array

Edges are an array of objects, each of which represents an edge in the graph.

edge properties

  • A source property references the key value of the source [node object](#node object). Its value is defined as a JSON string.
  • A relation property provides the interaction between source and target nodes. Its value is defined as a JSON string.
  • A target property references the key value of the target node object. Its value is defined as a JSON string.
  • A directed property provides the edge mode (e.g. directed or undirected). Its value is JSON true for directed and JSON false for undirected. The edge direction is determined by graph.directed property if not present.
  • A metadata property allows for custom data on an object. Its values is defined as a JSON object.

graph object

A graph object represents a single conceptual graph.

graph properties

  • An optional id property provides an identifier for this graph object
  • A type property provides a classification for an object. Its value is defined as a JSON string.
  • A label property provides a text display for an object. Its value is defined as a JSON string.
  • A directed property provides the graph mode (e.g. directed or undirected). Its value is JSON true for directed and JSON false for undirected. This property default to JSON true indicating a directed graph.
  • A nodes property provides the nodes in the graph. Its value is an array of [node object](#node object).
  • An edges property provides the edges in the graph. Its value is an array of edge objects.
  • A metadata property allows for custom data on an object. Its values is defined as a JSON object.

graphs object

A graphs object groups zero or more graph objects into one JSON document.

  • The graphs object is defined as a JSON array.

Examples

empty single graph

{
  "graph": {}
}

empty multi graph

{
  "graphs": []
}

nodes-only single graph

{
  "graph": {
    "nodes": {
      "A": {},
      "B": {}
    }
  }
}

nodes/edges single graph

{
  "graph": {
    "nodes": {
      "A": {},
      "B": {}
    },
    "edges": [
      {
        "source": "A",
        "target": "B"
      }
    ]
  }
}

complete single graph

{
  "graph": {
    "directed": false,
    "type": "graph type",
    "label": "graph label",
    "metadata": {
      "user-defined": "values"
    },
    "nodes": {
      "0": {
        "type": "node type",
        "label": "node label(0)",
        "metadata": {
          "user-defined": "values"
        }
      },
      "1": {
        "type": "node type",
        "label": "node label(1)",
        "metadata": {
          "user-defined": "values"
        }
      }
    },
    "edges": [
      {
        "source": "0",
        "relation": "edge relationship",
        "target": "1",
        "directed": false,
        "label": "edge label",
        "metadata": {
          "user-defined": "values"
        }
      }
    ]
  }
}

complete multi graph

{
  "graphs": [
    {
      "directed": true,
      "type": "graph type",
      "label": "graph label",
      "metadata": {
        "user-defined": "values"
      },
      "nodes": {
        "0": {
          "type": "node type",
          "label": "node label(0)",
          "metadata": {
            "user-defined": "values"
          }
        },
        "1": {
          "type": "node type",
          "label": "node label(1)",
          "metadata": {
            "user-defined": "values"
          }
        }
      },
      "edges": [
        {
          "source": "0",
          "relation": "edge relationship",
          "target": "1",
          "directed": true,
          "label": "edge label",
          "metadata": {
            "user-defined": "values"
          }
        }
      ]
    },
    {
      "directed": true,
      "type": "graph type",
      "label": "graph label",
      "metadata": {
        "user-defined": "values"
      },
      "nodes": {
        "0": {
          "type": "node type",
          "label": "node label(0)",
          "metadata": {
            "user-defined": "values"
          }
        },
        "1": {
          "type": "node type",
          "label": "node label(1)",
          "metadata": {
            "user-defined": "values"
          }
        }
      },
      "edges": [
        {
          "source": "1",
          "relation": "edge relationship",
          "target": "0",
          "directed": true,
          "label": "edge label",
          "metadata": {
            "user-defined": "values"
          }
        }
      ]
    }
  ]
}

More real world examples.

Schema

The JSON graph schema(version 2) is provided for the json graph format.

Media Type

The media type to describe JSON Graph Format is application/vnd.jgf+json. The approach to use a media type suffix like +json is described by RFC 6839.

In addition to the media type a profile media type parameter MUST be set to a URL that dereferences to the JSON schema for JSON Graph Format. The expected usage of the profile media type parameter is defined by RFC 6906. For example to communicate plain JSON Graph Format content the Content-Type header could be set as:

Content-Type: application/vnd.jgf+json

A child schema of JSON Graph Format can communicate its JSON schema using additional profile media type parameters. Each profile media type parameter MUST dereference a JSON schema. For example the BEL JSON Graph Format could be communicated as:

Content-Type: application/vnd.jgf+json;
          profile=http://jsongraphformat.info/schema.json;
          profile=http://jsongraphformat.info/child-schemas/bel-json-graph.schema.json

NPM support

You can import the schema into your JS projects by installing it via NPM and requiring it.

npm install --save json-graph-specification
var JSONGraph = require('json-graph-specification')

Clients

  1. jay-gee-eff - An npm package for manipulating JGF files in nodejs.
  2. jay-gee-eff-for-web - An npm package for using JGF graphs with OOP in the web, i.e. web browsers, without capabilities of file handling, but a fully fledged JGF feature set.

Project Tests

See TESTING.

Related Standards {#links}

Graph data in JSON is usually modelled in application-specific ad-hoc formats. In addition there are several text-based graph formats:

and XML-based graph formats:

  • Directed Graph Markup Language (DGML)
  • Graph Exchange XML Format (GEXF)
  • Graph eXchange Language (GXL)
  • GraphML
  • DotML (XML representation of DOT)
  • XGMML (XML representation of GML)

Several semi-standardized JSON-based graph formats are found in applications, for instance Cytoscape JSON. Simple graphs can also be expressed in CSV format.

Links

You can’t perform that action at this time.