Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
hashintel avatar

Writing Hashql Jexpr

  • 2 installs
  • 1.6k repo stars
  • Updated August 5, 2026
  • hashintel/hash

Explains HashQL J-Expr, a JSON-based expression syntax for writing typed HashQL queries with #literal, #struct, and #list constructs.

About

Documents J-Expr, the JSON-based expression syntax used to write typed HashQL queries in .jsonc files. A developer uses it when writing or parsing J-Expr code and understanding function-call syntax.

  • Represents typed expressions using JSON primitives
  • Covers #literal, #struct, #list, and #tuple constructs

Writing Hashql Jexpr by the numbers

  • 2 all-time installs (skills.sh)
  • +1 installs in the week ending Aug 2, 2026 (Skillselion tracking)
  • Ranked #3,774 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/hashintel/hash --skill writing-hashql-jexpr

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs2
repo stars1.6k
Last updatedAugust 5, 2026
Repositoryhashintel/hash

What it does

Explains HashQL J-Expr, a JSON-based expression syntax for writing typed HashQL queries with #literal, #struct, and #list constructs.

Files

SKILL.mdMarkdownGitHub ↗

Writing HashQL J-Expr

J-Expr is a JSON-based expression syntax for HashQL. It represents typed expressions using JSON primitives.

Expression Types

J-Expr has three expression types:

JSON TypeJ-Expr Meaning
StringPath/identifier/symbol
ArrayFunction call
ObjectData constructor (with # keys)

Paths (Strings)

Strings are parsed as paths or identifiers:

"x"                           // Simple variable
"vertex.id.entity_id"         // Dotted path access
"::core::types::String"       // Namespaced/rooted path
"::graph::head::entities"     // Graph function path

Function Calls (Arrays)

Arrays represent function calls: [function, arg1, arg2, ...]

// Basic function call
["add", {"#literal": 1}, {"#literal": 2}]

// Namespaced function
["::graph::head::entities", ["::graph::tmp::decision_time_now"]]

// Labeled argument with :prefix in object
["greet", {":name": {"#literal": "Alice"}}]

// Shorthand labeled argument (string with :prefix)
["func", ":name"]

Data Constructors (Objects with # Keys)

Objects with special # keys construct data:

KeyPurposeExample
#literalPrimitive values{"#literal": 42}
#structNamed fields{"#struct": {"x": ...}}
#listVariable-size ordered{"#list": [...]}
#tupleFixed-size ordered{"#tuple": [...]}
#dictKey-value map{"#dict": {"k": ...}}
#typeType annotationUsed with other keys

Literals

{"#literal": 42}
{"#literal": "hello"}
{"#literal": true}
{"#literal": null}
{"#literal": 3.14, "#type": "Float"}

Struct

{"#struct": {"name": {"#literal": "Alice"}, "age": {"#literal": 30}}}
{"#struct": {"x": {"#literal": 1}}, "#type": "Point"}

List and Tuple

{"#list": [{"#literal": 1}, {"#literal": 2}]}
{"#tuple": [{"#literal": 1}, {"#literal": "text"}]}

Dict

{"#dict": {"key": {"#literal": "value"}}}

Common Patterns

Let Binding

["let", "varName", {"#literal": 10}, ["add", "varName", {"#literal": 5}]]

Function Definition

["fn", {"#tuple": []}, {"#struct": {"vertex": "_"}}, "_", body_expr]

Conditionals

["if", condition_expr, then_expr, else_expr]

Comparison

["==", "left", "right"]
[">", {"#literal": 5}, {"#literal": 3}]

Do

  • Use #literal for all primitive values (numbers, strings, booleans, null)
  • Use :: prefix for namespaced paths
  • Use : prefix for labeled arguments
  • Combine #type with other constructors for type annotations

Don't

  • Don't use bare JSON numbers/booleans - wrap in {"#literal": ...}
  • Don't confuse #list (variable-size) with #tuple (fixed-size)
  • Don't use # prefix for labeled arguments (use :)
  • Don't nest # keys incorrectly - each object should have one primary # key

Examples

Entity query:

["::graph::head::entities", ["::graph::tmp::decision_time_now"]]

Filtering with comparison:

["filter", "entities", 
  ["fn", {"#tuple": []}, {"#struct": {"entity": "_"}}, "_",
    ["==", "entity.draft_id", {"#literal": null}]]]

Struct with type:

{"#struct": {"value": {"#literal": 100}}, "#type": "Amount"}

References

  • Syntax Reference - Paths, function calls, operators
  • Special Forms - Language constructs (if, let, fn, type, use, etc.)
  • Data Constructors - Typed data (#literal, #struct, #tuple, #list, #dict, #type)
  • Type DSL - Embedded type annotation syntax
  • Parser: libs/@local/hashql/syntax-jexpr/src/parser/
  • Object forms: libs/@local/hashql/syntax-jexpr/src/parser/object/
  • Type DSL: libs/@local/hashql/syntax-jexpr/src/parser/string/type.rs

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.