Introduction


Gram is a textual format for data graphs. Named values are packed into records, qualified with labels, given identity, and organized into expressive patterns. It’s JSON for data graphs!

Invaluable values

Gram offers a rich set of value types. Foundational values like string can be prepended with a tag to specialize the string format. Similarly, integers or decimals can have a unit appended – no more guessing whether a weight is metrics or imperial.

({
  name: "Gram",
  stars: 42,
  since: date`2020-06-06`,
  homepage: url`https://github.com/`,
  weight: 22kg
})

Highly qualified records

Gram’s semi-structured data records have an extra layer of information. The record can be given an explicit identity and qualified with labels.

(g:Text:Data { name: "Gram", stars: 42, since: date`2020-06-06`, weight: 22kg })

Multiple records can be listed together, forming a sequence of records.

(g:Text:Data   { name: "Gram", stars: 42, since: date`2020-06-06`, weight: 22kg })
(a:Ast:Data    { specification: "@gram-data/gram-ast", extends:"unist" })
(j:Object:Data { language: "javascript" })

Well composed data

Individual records can be composed into data patterns called paths, inspired by Neo4j’s Cypher language. Path members can reference previously defined records.

Here we arrange g,a, and j into a path:

(g)-->(a)-->(j)

Footnotes

  • gram-ast for text literal data types
  • gram-value for standard conversions to JS primitives
  • Semi-structured data use arbitrary nesting of lists and maps. There is structure without a constraining schema.
  • Cypher data patterns innovated the ascii-art representation of round graph nodes (a) and interrupted arrows -[e]-> for graph relationships.