RESONATE / RESEARCH GitHub
Preliminary resultsResearch in progress, self-reported from our own runs of the official evaluators; three OGB entries are filed and await validation, STaRK-Prime is not filed yet. Code, weights and logs: OGB, STaRK, reproduction guide. Act II asks what else this memory can do — numbers, arithmetic from three examples, instructions in words, kinship reasoning at 0.99 over ten hops: resonate.page/resonate2.

Independent research / 2026

A structure
for knowledge.

A research graph representation, measured for link prediction and missing-fact prediction, for multi-hop graph queries whose cost is O(1) in depth, and, with a separately trained retrieval pipeline around it, for natural-language questions with no generative model at query time.

Explore the research Discover Act II
RESONATERESEARCH PREVIEW
Conceptual sculpture of layered ceramic plates above a limestone cube
Representation / a conceptual study

Act II / September 2026 / in progress

The same memory, asked to compute.

Eighteen rows hold every number below a billion. Arithmetic found from three worked examples and stored in the table. "To double something, add it to itself." Kinship reasoning over ten hops from a graph — and a clear negative from raw text. One seed, told in order.

Read Act II
rows for every number below 10⁹
18
worked examples per operation
3
commands and definitions in words
1.00
CLUTRR, ten hops, from the graph
0.99

01 / What we found

One representation supports several operations

We trained the representation to predict links. Then we measured what else it could do. The graph operations use the link-trained representation as it is. Language did need more: the representation was continued on edges and training questions together, and a separately trained retrieval pipeline was built around it.

Knowledge graphedges, typed entities ResonatE embeddingunit-norm entity vectors+ block relation operators Link predictionthree Stanford leaderboards Missing-link completionAUROC 0.98 against random false claims Direct accesscost O(1) in depth · the index is the deployable Natural-language retrievalno generative model at query time 110M encoder + learned headquestion text → the same space
One representation, trained on edges, serves the three graph operations as it is. For language it is continued on edges and questions, and a question reaches it through a pretrained 110M text encoder with a learned head, inside a separately trained pipeline; nothing generative sits between the question and the answer.
The surprise
The same learned representation turned out to be useful for more than the task it was trained for. Once continued on questions, it answers written questions with the same readout that scores a graph edge, and it got better at links while learning to do so.

In plain words: we taught a compact model to guess which facts are missing from a medical knowledge graph. It then turned out to also answer questions typed in English, and to answer long chained questions as fast as short ones, without a chatbot anywhere in the loop.

02 / Evidence

Three benchmarks, three findings

Stanford's Open Graph Benchmark link-prediction task, scored by the official Evaluator: the true answer is ranked among 500 sampled alternatives per query, so MRR is a rank statistic, not a percentage of questions answered.

About these preliminary results

The OGB rows are means of ten seeds with one test read per run, under the official evaluator, with the expected range written down before the read. The STaRK rows are one frozen pipeline read once per split; four such reads happened over the project and all four are listed below. The RotatE control is one seed. Three OGB entries (biokg C and C′, wikikg2 E) were filed on 9 September 2026 and await OGB's validity check; the STaRK-Prime entry is not filed. Every number on this page is self-reported from our own runs.

Stanford OGB leaderboard · ogbl-biokgBiomedical graph — 93,773 entities, 51 relations

Test MRR on the live board (fetched 2026-09-09, unchanged since 2026-09-04) with the four ResonatE rows; the 9.56M compact row is the smallest entry anywhere on the chart. The four bottom rows are the official OGB baselines at 188M parameters each.
ResonatE row (ten seeds, one test read each)test MRRparamsstatus
A. single model0.8158 ± 0.000627.1Mnot filed
B. + four label-free retrieval members read from the training graph0.8463 ± 0.000427.1Mnot filed — beaten by C′ on both axes
C. + distilled at training time from ten seeds (T=2)0.8528 ± 0.000227.1MFiled 9 Sep best MRR
C′. C with the entity table compressed after training (no retraining)0.8468 ± 0.00039.56MFiled 9 Sep best MRR per parameter

Two of the four rows were filed on OGB's form on 9 September 2026: C, the best MRR, and C′, the best MRR per parameter. A and B are left off for a plain reason — B is beaten by C′ on both axes the board reports, lower MRR at 2.84× the parameters, and A sits below both, so neither adds a claim the other two do not already make. Against the board as fetched 9 September 2026 (unchanged since 4 September) C would rank 5th and C′ 6th, C′ at 9.8× fewer parameters than the smallest entry currently listed. The filing fields are in SUBMISSION_BIOKG.md. Both await OGB's validity check.

Finding
Competitive performance from a compact representation. The bare model beats the official RotatE, ComplEx and DistMult baselines (0.7989, 0.8095, 0.8043) at a seventh of their parameters; the recipe adds 0.037 on top.
Finding
Most of a trained entity table is removable. Grouping entities by training degree and replacing each group’s rows with a narrow coefficient vector over a small bank of shared subspaces — k-means plus a per-cluster PCA, about ten seconds, no retraining — takes row C from 27.1M to 9.56M parameters for 0.0061 MRR. The four graph-read members absorb 57% of the loss: the narrow table gives up 0.0143 on its own scores but only 0.0061 after blending, because those features read the training graph rather than the table. The cost is steady across seeds (0.0056–0.0067 over ten, one mild outlier), so it is a property of the trained table rather than a lucky draw. The same construction collapses on wikikg2, where 2.5M near-isotropic rows leave no shared narrow subspace to project onto — the method needs a graph whose rows cluster.
What 9.56M means to serve
The compact row ships as a 39 MB file — 38.2 MB of fp32 weights, 19.1 MB at half precision. The entries it sits between on the board carry 188M parameters, which is 750 MB resident in fp32: 19.6× more memory to answer the same query. Row C, at 27.1M, is 108 MB. Nothing here is sharded or paged — the whole index fits in the memory a single conventional embedding table needs, and rebuilding an entity row is one small matmul (coef @ P + mu) before the relation operator applies. For speed at this shape: the ten released 27.1M checkpoints re-score the entire test split — 162,870 queries in each direction, 500 candidates each — in 40 seconds on one RTX 5090, about 4 seconds per model, and the compact tables are re-scored the same way by verify_compact.py.

Stanford OGB leaderboard · ogbl-wikikg2Wikidata subset — 2,500,604 entities, 535 relations

Same architecture, one dial changed on validation (k=8 with one dense 64×64 block per relation instead of k=12 with 4×4 blocks). A row-sparse training shell trains the 329M-parameter model in 36 minutes on one RTX 5090.

Test MRR on the live board (top eight of 28 plus lower rows) with the ResonatE rows. The filed row is the compact 50.2M model, E (9 September 2026, awaiting OGB's validity check); the two combiner rows are excluded by OGB's rule.
ResonatE rowtest MRRparamsstatus
A. single model0.6676 ± 0.0010329Mreported
distilled single model (T=2, ten teachers)0.6855 ± 0.0008329Mnot filed
E. distilled model compressed to clustered narrow rows, then refit, + nine graph-read members0.7100 ± 0.001450.2MFiled 9 Sep ten seeds
+ retrieval members + learned per-relation combiner0.7320 ± 0.0010329Mreported, not filed: the combiner is fit by gradient descent on validation labels, which the OGB rule excludes
ten-seed ensemble + members + combiner (leave-one-out)0.7426 ± 0.00023.29Breported, not filed, same reason; would sit above the current first entry

The row filed here is E, the compact one: the 329M student with every entity row replaced by a narrow row of width 4 to 64 by training degree, expanded through one of 4,096 learned subspaces per tier and refit against the student, then combined with nine members read from the training graph by the same fixed-candidate selection used on biokg. It reads 0.7100 ± 0.0014 over ten seeds at 50,244,249 parameters — 6.5× smaller than the model it was built from, and larger in MRR than every uncompressed row above it except the two the combiner rule excludes. Fields in SUBMISSION_WIKIKG2.md. Filed 9 September 2026, awaiting OGB's validity check.

Finding
The architecture generalises to a very different graph. It is not compact here: the entity table dominates, and a 36M-parameter entry (TripleRE + NodePiece, 0.6866) scores the same as our 329M model. We say so.

Stanford STaRK leaderboard · PrimeQuestions in words over PrimeKG — 129,375 entities, 18 relations

Stanford's STaRK benchmark asks written questions ("Which drugs target GCK and are indicated for diabetes?", or a researcher's own phrasing) and scores the ranked entities over the whole graph: Hit@1, Hit@5, Recall@20, MRR. The strongest published rows run a large language model on every query (GPT-4o, Llama 3.3 70B, gpt-oss-120b); the strongest without one, mFAR, is a trained multi-field retriever.

Question in wordsany phrasing Learned parser headanswer type · anchors ·relation operators Exact adjacency walkwhich candidates are graph-supported ResonatE operatorsin what order Fine-tuned text ranker110M encoder over node text ResonatE readoutfrom the question itself Fuse +rerank→ entities no generative LLM anywhere · 32 ms per question at batch size 1 · 1.9 GB of GPU memory · every stage measured
The reference pipeline (P3, prepared for filing, not yet filed; P1, P2 and P4 are reported but not entered). The two ResonatE stages are the representation's own operations; the rest is a walk over the graph, two pretrained 110M text encoders with learned heads, and a logistic reranker. Parameters at query time: graph table + operators 37.3M, joint table + operators 37.3M, parser encoder + heads 110.2M, question encoder + head 109.7M, text ranker 109.5M, 404M in all, of which 330M are pretrained encoders fine-tuned here.
Synthesized (full), 2,801 questions: Hit@1 for every row on the Stanford STaRK leaderboard (fetched from the leaderboard's source on 2026-09-06) and for the later published rows that evaluate on the full split — KAR (NAACL 2025), mFAR (ICLR 2025), AF-Retriever (TMLR 2026), each copied from its paper on 2026-09-09 — sorted by Hit@1, MRR after the dot. ResonatE is second on Hit@1 to AF-Retriever, which generates graph queries and reranks with a 120B language model per question, and first on Hit@5, Recall@20 and MRR.
splitResonatE (no llm), P3 To filebest published number per column (who)
Synthesized (full, 2,801)43.1 / 68.8 / 75.5 / 54.746.2 / 63.7 / 68.3 / 54.0 (AF-Retriever, gpt-oss-120b at query time; Recall@20 from mFAR, no LLM)
Synthesized (10%, 280)41.8 / 72.5 / 77.8 / 54.346.4 / 63.9 / 65.5 / 53.7 (FocusedRetriever, Llama 3.3 70B at query time; this subset only)
Human-generated (98)28.6 / 53.1 / 61.9 / 40.758.8 / 69.4 / 59.9 / 62.7 (FocusedRetriever / AF-Retriever / KAR / AF-Retriever)

Hit@1 / Hit@5 / Recall@20 / MRR; bold is the better of the two cells. The comparison column is the Stanford leaderboard plus the later published Prime rows — KAR (Xia et al., NAACL 2025), mFAR (Li et al., ICLR 2025), 4StepFocus (Boer, Koch, Kramer, 2024), FocusedRetriever (Boer, Roth, Kramer, 2025) and its published successor AF-Retriever (TMLR 2026) — each number copied from the paper's own table on 2026-09-09. The 10% caveat: 4StepFocus and FocusedRetriever evaluate only on the 280-question subset ("for methods that use proprietary LLMs, only 10% of synthetic test sets are used"), so they appear in the 10% row and never against the full split; KAR, mFAR and AF-Retriever evaluate on all 2,801. Each read is one frozen pipeline run once per split after a dry run reproduced the validation number to four decimals. All four reads, Hit@1 on test / test-0.1 / human: P1, hand-written parser and off-the-shelf embedder, 28.7 / 28.2 / 20.4. P2, learned parser, fine-tuned ranker, joint table, out-of-fold reranker, 41.8 / 41.8 / 30.6. P3, P2 plus one correctness fix (gene symbols shorter than four characters were never matched), 43.1 / 41.8 / 28.6: the reference system. P4, P3 plus a learned selector over four readings of each question, 43.7 / 41.8 / 25.5: rejected, because the selector is a bolt fit to the synthesized templates and it cost five human questions. The rule we chose before P4 was read: publish the best model and architecture, not the best score, so a bug fix stays and a dataset-specific selector goes. On 98 human questions the differences among P2, P3 and P4 are two to five questions, inside the noise.

Finding
The same representation can be reached from language through a pretrained encoder with a learned head. Continued on edges and training questions, it answers a question from the text alone at 26.7 ± 0.2 Hit@1 (three seeds), its sensitivity to phrasing is under one point, and its link MRR rose from 0.557 to 0.568 while it learned. The pipeline around it runs no generative model.

In plain words: nobody types a database query. You type the question, a learned reader (a pretrained encoder with three small heads) turns it into "which thing, which relation", the graph and the model answer, and no chatbot is consulted.

03 / Examples

What the queries look like

Four kinds of use, each with real, unedited output. The oracle labels are the graph's: [ok] means a supporting path exists in the training graph, which can itself be incomplete, outdated or wrong; [NOVEL] means the graph holds no such edge, an unverified prediction and not a discovery. How much a [NOVEL] answer is worth is measured, not assumed: on 598,543 held-out Wikidata facts the model's score separates a true unseen fact from a random false claim at AUROC 0.98, and from the most plausible false alternative at 0.71.

1. Drug repurposing queries (Hetionet, 2026-09-01)

Ask what else a drug might treat. The model ranks every disease against Metformin in about 3 ms, the oracle labels each answer in under 1 ms, and every [NOVEL] answer carries analogy evidence: the most similar drugs that already have that edge.

$ uv run python query.py Metformin CtD -k 8          # CtD = Compound-treats-Disease
  #    score  oracle   entity
  1    13.26  [NOVEL]  obesity                     ↳ analogy: Phendimetrazine (0.48), Cimetidine (0.47), Benzphetamine (0.46)
  2    12.94  [ok]     type 2 diabetes mellitus
  3    12.87  [ok]     metabolic syndrome X
  4    12.80  [ok]     polycystic ovary syndrome
  5    11.86  [NOVEL]  hypertension                ↳ analogy: Reserpine (0.47), Fosinopril (0.45), Carvedilol (0.45)
  6    10.39  [NOVEL]  type 1 diabetes mellitus    ↳ analogy: Ramipril (0.41)
  7    10.22  [NOVEL]  coronary artery disease     ↳ analogy: Atorvastatin (0.43), Losartan (0.42), Pitavastatin (0.41)
  8    10.07  [NOVEL]  hematologic cancer          ↳ analogy: Doxorubicin (0.43), Methotrexate (0.40), Epirubicin (0.39)
3/8 oracle-verified, 5 flagged [NOVEL] by our oracle · exact-answer set |valid| = 3 · model 3.42 ms · oracle 0.44 ms
$ uv run python query.py Ibuprofen CbG.~DaG -k 6      # binds gene → gene linked to disease (two hops)
  1    12.24  [ok]     hypertension
  2    11.68  [ok]     prostate cancer
  3    11.56  [ok]     breast cancer
  4    11.51  [ok]     obesity
  5    11.46  [ok]     epilepsy syndrome
  6    11.43  [ok]     hematologic cancer
6/6 oracle-verified · model 3.50 ms · oracle 0.71 ms
$ uv run python query.py Metformin CbG.GiG.~DaG -k 5  # three hops through gene interactions, same cost
  1    11.61  [ok]     hematologic cancer
  2    11.56  [ok]     lung cancer
  3    11.41  [ok]     breast cancer
  4    11.35  [ok]     epilepsy syndrome
  5    11.19  [ok]     hypertension
5/5 oracle-verified · model 3.56 ms · oracle 0.79 ms

On the trained metapath libraries the top answer is oracle-verified 94.6–100% of the time across all ten DRKG paths and 99–100% on all eight Hetionet paths. On DRKG's 496 held-out treats edges the model ranks the true disease 4.0× better than a popularity baseline. The analogy evidence is measured, not decorative: on the benchmark's rarest side effects it alone outperforms the full embedding.

2. Absorbing new knowledge in minutes (DRKG)

Knowledge graphs go stale and retraining is the usual price. Fine-tuning the 496 held-out treats edges into a trained model took 1,500 steps, 223 seconds of wall-clock on a single laptop GPU, and absorbed all of them to rank 1 (MRR 0.147 → 1.000), with a worst regression elsewhere of −0.008. That closes a loop: the model proposes a [NOVEL] edge, a caller corroborates it against literature, a minutes-long fine-tune absorbs it.

3. Wikidata lookup and completion (ogbl-wikikg2, 2026-09-03)

The same tool on the 2.5M-entity graph: an exact readout over all rows in about 33 ms per query on the GPU, Python and top-k dominated (the readout itself is 2.4–3.3 ms; the fp16 HNSW index answers in 2.2 ms on CPU). Run against an early 200k-step checkpoint with a per-entity bias term, not the final model; transcript verbatim, scores omitted for width. The third block is included because it shows the failure mode: confident, plausible, wrong proposals.

$ uv run python query_wiki.py Q42 ~P50 -k 10       # Douglas Adams, reverse of "author": his works · oracle: 13 reachable
   1  [ok]     The Restaurant at the End of the Universe
   2  [ok]     Douglas Adams's Guide to The Hitchhiker's…
   3  [ok]     So Long and Thanks for All the Fish
   4  [ok]     The Salmon of Doubt
   5  [ok]     The Long Dark Tea-Time of the Soul
   6  [ok]     The Meaning of Liff
   7  [ok]     Last Chance to See
   8  [ok]     Life the Universe and Everything
   9  [ok]     Dirk Gently's Holistic Detective Agency
  10  [ok]     Mostly Harmless
10/10 oracle-verified · ~33 ms per query end to end on the GPU (the exact readout over 2.5M rows is 2.4–3.3 ms; the rest is Python and top-k)
$ uv run python query_wiki.py Q42 P800 -k 10       # notable work · oracle: 2 reachable
   1  [NOVEL]  Last Chance to See
   2  [NOVEL]  The Restaurant at the End of the Universe
   3  [NOVEL]  Douglas Adams's Guide to The Hitchhiker's…
   4  [ok]     Dirk Gently's Holistic Detective Agency
   5  [NOVEL]  Mostly Harmless
   6  [NOVEL]  Dirk Gently
   7  [NOVEL]  The Long Dark Tea-Time of the Soul
   8  [NOVEL]  So Long and Thanks for All the Fish
   9  [NOVEL]  The Hitchhiker's Guide to the Galaxy
  10  [NOVEL]  The Hitchhiker's Guide to the Galaxy (Q3107329, a second item with the same label)
our oracle flagged 9 of 10 as [NOVEL], unverified by the graph; they are real Adams works or adaptations that the benchmark graph does not hold under this relation · ~33 ms
$ uv run python query_wiki.py Q42 P69 -k 10        # educated at · oracle: 2 reachable
   1  [ok]     University of Cambridge
   2  [ok]     St John's College
   3  [NOVEL]  Harvard University
   4  [NOVEL]  Trinity College
   5  [NOVEL]  University of York
   6  [NOVEL]  University of Oxford
   7  [NOVEL]  University College London
   8  [NOVEL]  Pembroke College
   9  [NOVEL]  Royal Academy of Dramatic Art
  10  [NOVEL]  University of Manchester
our oracle flagged 8 of 10 as [NOVEL] · ~33 ms · the two known edges rank 1 and 2. The flagged proposals are WRONG: Adams was not educated at any of these eight. Measured on the 598,543 held-out wikikg2 facts, the model's score separates a true unseen fact from a random false claim at AUROC 0.98, but from the most plausible false alternative at only 0.71 — these universities are the 0.71 kind, and the [NOVEL] flag is what keeps them from being read as facts
4. Questions in words, no language model in the loop (STaRK-Prime)

Free-form questions typed into ask.py, the pipeline from the command line, on jinx's GTX 1080 Ti, warm (the same stages take 32 ms on an RTX 5090). There is no ground truth here; the flags are the graph's. The first line of each answer is what the parser read. [ok] means the entity is reached by the exact walk from the anchors it read; [--] means it is not graph-supported from what was read and came from the text ranker or the question readout. Nine questions, chosen to show both what works and what does not. The first eight were recorded with the P2 parser; the P3 fix changes only how two- and three-letter gene symbols are matched, and the ninth question, which turns on exactly that, was re-run under P3.

$ uv run python ask.py "Which drugs are used to treat Parkinson disease and also carry a risk of hallucinations?"
  read: answer type = drug · anchors = Parkinson disease (disease), Hallucinations (effect/phenotype)
   1  [ok]  Selegiline
   2  [ok]  Apomorphine
   3  [ok]  Pramipexole
   4  [ok]  Ropinirole
   5  [ok]  Entacapone
5/5 graph-supported · two constraints, both read, intersected by the walk · 291 ms as the first question of the session (warm-up), about 100 ms after
$ uv run python ask.py "shared gene targets of diethylstilbestrol and levothyroxine?"
  read: answer type = gene/protein · anchors = Diethylstilbestrol (drug), Levothyroxine (drug)
   1  [ok]  TTR
   2  [ok]  SERPINA7
   3  [ok]  SHBG
   4  [ok]  THRB
   5  [ok]  SLC7A5
5/5 graph-supported · parse 17 ms · walk+model 73 ms · text 10 ms · readout 7 ms · rerank 1 ms · total 109 ms
$ uv run python ask.py "which pathways involve the BRCA1 protein"
  read: answer type = pathway · anchors = BRCA1 (gene/protein)
   1  [ok]  Defective DNA double strand break response due to BRCA1 loss of function
   2  [ok]  Homologous DNA Pairing and Strand Exchange
   3  [ok]  G2/M DNA damage checkpoint
   4  [ok]  Meiotic recombination
   5  [ok]  Defective DNA double strand break response due to BARD1 loss of function
5/5 graph-supported · total 68 ms
$ uv run python ask.py "diseases associated with the CFTR gene"
  read: answer type = disease · anchors = CFTR (gene/protein), cystic fibrosis (disease)
   1  [ok]  cystic fibrosis
   2  [ok]  congenital bilateral aplasia of vas deferens from CFTR mutation
   3  [ok]  congenital bilateral absence of vas deferens
   4  [ok]  polycystic kidney disease
   5  [ok]  bronchiectasis with or without elevated sweat chloride
5/5 graph-supported · total 70 ms
$ uv run python ask.py "genes linked to Noonan syndrome that are expressed in the dorsolateral prefrontal cortex"
  read: answer type = gene/protein · anchors = dorsolateral prefrontal cortex (anatomy), Noonan syndrome (disease)
   1  [ok]  BRAF
   2  [ok]  SOS2
   3  [ok]  MAGEL2
   4  [ok]  NDN
   5  [ok]  SHOC2
5/5 graph-supported · total 82 ms
$ uv run python ask.py "which proteins interact with TP53 and are targeted by an approved drug"
  read: answer type = gene/protein · anchors = TP53 (gene/protein) · relation hints = ppi
   1  [ok]  MDM4
   2  [ok]  MDM2
   3  [ok]  AKT1
   4  [ok]  TP63
   5  [--]  TP53
4/5 graph-supported · total 71 ms · the second constraint (targeted by an approved drug) was read as a hint only; TP53 itself is returned at rank 5, unsupported, by the text ranker
$ uv run python ask.py "what conditions is metformin used for"
  read: answer type = disease · anchors = Metformin (drug)
   1  [ok]  diabetes mellitus
   2  [ok]  hemoglobinopathy
   3  [ok]  hypoglycemia
   4  [ok]  type 2 diabetes mellitus
   5  [ok]  gestational diabetes
5/5 graph-supported · total 72 ms · hemoglobinopathy and hypoglycemia are supported through Metformin's contraindication edges: the walk found them, the question did not ask for them, and no stage removed them
$ uv run python ask.py "rare genetic disorders that present with hearing loss and kidney problems"
  read: answer type = disease · anchors = kidney (anatomy) · relation hints = expression present
   1  [--]  deafness, autosomal recessive
   2  [--]  retinitis pigmentosa-hearing loss-premature aging-short stature-facial dysmorphism syndrome
   3  [--]  nephropathy, progressive, with deafness
   4  [--]  Alport syndrome
   5  [--]  autosomal recessive Alport syndrome
0/5 graph-supported · total 95 ms · the parser read only kidney, so the walk had nothing to intersect; Alport syndrome and progressive nephropathy with deafness are the text ranker's and the readout's answers, plausible and unverified. This is what the flag is for
$ uv run python ask.py --parser models/lp_p3.pt "Which drugs target GCK and are indicated for diabetes?"
  read: answer type = drug · anchors = GCK (gene/protein) · relation hints = target
   1  [ok]  Beta-D-Glucose
   2  [ok]  3-[(4-fluorophenyl)sulfanyl]-N-(4-methyl-1,3-thiazol-2-yl)-6-[(4-methyl-4H-1,2,4-triazol-3-yl)sulfanyl]pyridine-2-carboxamide
   3  [ok]  2-(methylamino)-N-(4-methyl-1,3-thiazol-2-yl)-5-[(4-methyl-4H-1,2,4-triazol-3-yl)sulfanyl]benzamide
   4  [ok]  2-AMINO-4-FLUORO-5-[(1-METHYL-1H-IMIDAZOL-2-YL)SULFANYL]-N-(1,3-THIAZOL-2-YL)BENZAMIDE
   5  [--]  Insulin glargine
4/5 graph-supported · parse 7.7 ms · walk+model 30.1 ms · text 6.9 ms · readout 7.4 ms · rerank 0.5 ms · total 52.6 ms · under P2 this question anchored nothing (three-letter symbols were skipped) and returned the text ranker's antidiabetics, all unsupported; under P3, GCK is anchored and the four supported answers are glucokinase ligands from the graph. The second constraint (indicated for diabetes) was read as a hint only, so nothing enforced it; Insulin glargine at rank 5 is the text ranker's, unsupported

Every stage of these answers runs without a generative model: a learned parser head reads the question, the graph walk and the ResonatE operators propose and order candidates, a text ranker and the question readout add theirs, a logistic reranker combines them. Where it fails, it fails on reading, as in the eighth example and in the P2 version of the ninth, not on the facts; the flag says which answers rest on the graph and which on plausibility.

04 / The controlled experiment

Is it just any good embedding?

Maybe any similarly accurate knowledge-graph embedding would take the language projection equally well. We tested that: RotatE trained on the same graph at the same width (288 numbers per entity), under the same regime, tuned by held-out link quality only, and the identical projector trained on top of both.

link MRRfrozen, STaRK Hit@1joint, STaRK Hit@1link MRR after joint
ResonatE0.55719.726.90.570
tuned RotatE (inner-product readout)0.54915.821.20.552
tuned RotatE (its own distance readout)0.54915.516.70.550
Finding
Nearly equal link-prediction quality did not produce equal downstream retrieval. The ResonatE table took the same projection 4 points better frozen and 6 points better jointly, and joint training raised its link quality four times as much.

Caveats, stated with the result: one seed each, one dataset, RotatE's L2 variant, the same training recipe for both. Our first pass used an untuned RotatE and showed a two-fold gap; that number is retracted in the record and the tuned one stands. We do not claim to know why the difference exists.

05 / What produced these results

The architecture

The representation

Each entity is a unit-norm vector of k² complex numbers: k=12 (144 numbers) on biokg and PrimeKG, k=8 (64) on wikikg2. Each relation and direction is a block-diagonal operator, unitary at initialisation and free afterwards: 36 blocks of 4×4 on biokg, one dense 64×64 block on wikikg2. A hop applies the operator and renormalises. The score of a triple is an inner product against the raw target row.

Because the per-hop renormalisation is a scalar, a chain of operators compiles into one operator, and a multi-hop question is one inner-product search over the entity rows. That is what "O(1) in depth" means: the readout is linear in the number of entities, or sublinear through an fp16 HNSW index (recall@10 0.993–0.994); the cost in chain depth is constant.

The training shell and the recipe

The entity table is stored through its real view and read with a sparse lookup, so a step touches only the rows in the batch and the optimiser keeps one number per row (row-wise Adagrad): 21× faster per step than dense Adam at identical quality, 2.5M entities in 36 minutes on one GPU.

The recipe, each lever measured with ten seeds: label-free retrieval members read from the training graph (+0.031 on biokg), distillation at training time from ten seeds at temperature 2 (+0.007), two capacity dials set on validation, and for language a fine-tuned text ranker, a learned parser head and a logistic reranker fit on train with out-of-fold features.

Total rented compute for the two OGB boards: $52.93, every RTX 5090 hour over three days at $0.60 per hour. The STaRK pipeline's own training is about an hour on one RTX 5090: the table (50k steps, ~4 min), its continuation on edges and questions (~5 min), the text-ranker fine-tune (~2 min), the parser head (~4 min), the reranker (seconds), and five out-of-fold refits of the continued table and parser head for honest reranker features. The offline 7B augmentation (paraphrases of the training questions, weak labels for the parser) is on top of that.

graphentitiesparamsdialtraining (one RTX 5090)GPU memoryserving (fp16)
ogbl-biokg93,77327.1Mk=12, 4×4 blocks50k steps in 231 s0.7 GB54 MB
ogbl-wikikg22,500,604328.8Mk=8, dense 64×64800k steps in 36.5 min3.0 GB0.6 GB
PrimeKG (STaRK)129,37537.3M
(404M for the whole language pipeline)
k=12, 4×4 blocks50k steps in ~4 min8.5 GB75 MB

GPU memory is the peak allocated by PyTorch during training steps (row-sparse shell, measured over a 300-step run of each recipe). PrimeKG's figure is the largest because its recipe scores 2,048 queries against 4,096 shared negatives per step over 144 complex dimensions; wikikg2 uses 64. Serving needs only the fp16 table: 54 MB, 0.6 GB and 75 MB; the fp16 HNSW index on wikikg2 is 1.98 GB. The STaRK pipeline at query time holds 1.9 GB in total, most of it the three 110M text encoders (parser, question readout, text ranker); the two 37M tables are a tenth of its 404M parameters.

06 / What we can and cannot conclude

Observed, and not established

Observed

  • Strong link prediction on two OGB boards; on the synthesized STaRK splits, first on Hit@5, Recall@20 and MRR and second on Hit@1 to pipelines that run a 70B–120B language model per question; well behind those pipelines on the 98 human questions.
  • A compact representation on biokg: 27M parameters, above the 188M official baselines.
  • Missing-link completion: true unseen facts separated from random false ones at AUROC 0.98, from the most plausible false alternative at 0.71; 496 new facts absorbed to rank 1 in 223 s on a laptop GPU.
  • Direct access to the graph, O(1) in depth: compiled chains at 0.08–0.11 ms for depth 1–6; for these graph queries the fp16 table or index is the whole deployable; an exact oracle labels every answer graph-supported or unverified. This describes the graph operations, not the language pipeline.
  • Natural-language retrieval with no generative model at query time, through a separately trained pipeline around the representation: two pretrained 110M encoders with learned heads, a text ranker, a graph walk and a logistic reranker.
  • Better STaRK transfer than the tested, tuned RotatE control.

Not established

  • A new geometry. The operator family is close to existing ones and is not the claim.
  • Why ResonatE transfers to language better than the control.
  • That the language pipeline and the representation form one model. They do not: the pipeline is a separate stack trained around the table. A shared encoder for both is an untested proposal.
  • Universality across graphs and tasks: three graphs, one seed on the control.
  • That LLMs are unnecessary for arbitrary knowledge reasoning. This is retrieval over one graph.
  • That the architecture is optimal, or compact on large graphs: on wikikg2 it is not.
  • An intersection operator. "Drugs that target X and treat Y" still needs the exact graph walk; two pre-registered attempts to put the AND into the representation failed.

In plain words: we know what it does because we measured it. We do not yet know why it does some of it better than a standard alternative, and we do not claim it can reason.

07 / Paper · code · checkpoints · experiments · reproduce

Beyond Link Prediction: Compact Knowledge Representations for Prediction, Retrieval, and Direct Access

Preprint, draft of 9 September 2026, not peer reviewed. Cristian Malaia. Every number on this page is in the paper with its receipt.

Negative results, changed hypotheses, corrections

The whole story in one paragraph: we built a compact knowledge representation to predict links. It performed well. We then found that the same representation supports direct access as it is, and natural-language retrieval once continued on questions and wrapped in a separately trained pipeline of pretrained encoders, a graph walk and a reranker. We ran a control to see whether that property was generic, and it was not entirely. We do not yet claim to know why.

Filing status

Three rows were filed on 9 September 2026 and are marked Filed above — biokg C and C′ and the compact 50.2M wikikg2 model E — awaiting OGB's validity check. One more is prepared and marked To file: the STaRK-Prime reference pipeline P3. The rest are reported only, and shown greyed. The experiments still open are listed under Limits and in the research record.

Acknowledgements

The code, experiments and text were written with Claude Fable 5 (Anthropic) as pair programmer; the design, the protocol and every claim are the author's responsibility.