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).
78
100%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
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.rs4f2d2ce
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.