HashQL J-Expr syntax for writing queries. Use when writing J-Expr code, using #literal/#struct/#list constructs, understanding function call syntax, or working with HashQL query files (.jsonc).
69
87%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
J-Expr is a JSON-based expression syntax for HashQL. It represents typed expressions using JSON primitives.
J-Expr has three expression types:
| JSON Type | J-Expr Meaning |
|---|---|
| String | Path/identifier/symbol |
| Array | Function call |
| Object | Data constructor (with # keys) |
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 pathArrays 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"]Objects with special # keys construct data:
| Key | Purpose | Example |
|---|---|---|
#literal | Primitive values | {"#literal": 42} |
#struct | Named fields | {"#struct": {"x": ...}} |
#list | Variable-size ordered | {"#list": [...]} |
#tuple | Fixed-size ordered | {"#tuple": [...]} |
#dict | Key-value map | {"#dict": {"k": ...}} |
#type | Type annotation | Used with other keys |
{"#literal": 42}
{"#literal": "hello"}
{"#literal": true}
{"#literal": null}
{"#literal": 3.14, "#type": "Float"}{"#struct": {"name": {"#literal": "Alice"}, "age": {"#literal": 30}}}
{"#struct": {"x": {"#literal": 1}}, "#type": "Point"}{"#list": [{"#literal": 1}, {"#literal": 2}]}
{"#tuple": [{"#literal": 1}, {"#literal": "text"}]}{ "#dict": { "key": { "#literal": "value" } } }["let", "varName", { "#literal": 10 }, ["add", "varName", { "#literal": 5 }]]["fn", {"#tuple": []}, {"#struct": {"vertex": "_"}}, "_", body_expr]["if", condition_expr, then_expr, else_expr]["==", "left", "right"]
[">", {"#literal": 5}, {"#literal": 3}]#literal for all primitive values (numbers, strings, booleans, null):: prefix for namespaced paths: prefix for labeled arguments#type with other constructors for type annotations{"#literal": ...}#list (variable-size) with #tuple (fixed-size)# prefix for labeled arguments (use :)# keys incorrectly - each object should have one primary # keyEntity 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" }if, let, fn, type, use, etc.)#literal, #struct, #tuple, #list, #dict, #type)libs/@local/hashql/syntax-jexpr/src/parser/libs/@local/hashql/syntax-jexpr/src/parser/object/libs/@local/hashql/syntax-jexpr/src/parser/string/type.rshashintel/hash
ab5d057
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.