zlf layers four retrieval capabilities over the graph, all selected through an IndexProfile.
Full-text search via Tantivy with a pinned contract (k1=1.2, b=0.75, analyzer unicode_jieba_v1):
? bm25("software engineer", Node, Score).
Only fields selected by an active profile are indexed.
Symbol BM25 plus bounded graph composition over ingested repositories.
No vector embedding required. The code_symbol analyzer does
identifier-boundary subtokenization only (no ngram/fuzzy):
? code_search("Dispatcher", 10, Symbol).
? code_callers(Symbol, Caller, 8, Status).
? code_callees(Symbol, Callee, 8, Status).
? code_path(From, To, Path, Rank, Status).
? code_cycle(Symbol, Cycle, Status).
Status is ok or exhausted(budget) — every request carries finite
budgets and exhaustion is explicit.
Ordinary Prolog joins compose with code facts:
? code_symbol(S), prop_simple_name(S, "main"), code_calls(S, T).
The same CodeQuery AST backs both Prolog predicates and JSON/HTTP.
See the full code indexing guide.
Optional embedding retrieval. Disabled by default; enable embedding.enabled=true to use it.
? vector_similar(alice, Node, Score).
index_engine is exact (RocksDB brute force) or hnsw (approximate nearest neighbor with exact RocksDB as source of truth and automatic fallback).vector_similar/3 returns an explicit index-unavailable error when embedding is disabled.? temporal_on("2026-07-15", Node).
? temporal_between("2026-07-01", "2026-08-01", Node).
? valid_at("2026-07-15T00:00:00Z", Node).
? valid_overlaps("2026-07-01T00:00:00Z", "2026-08-01T00:00:00Z", Node).
A field may be declared an event instant, validity start (valid_from), or validity end (valid_to); valid_to requires valid_from. Node versions carry the timestamps that temporal queries read.