mastra-ai/mastra · error
Edge references unknown node: ${edge.target}
Error message
Edge references unknown node: ${edge.target} What it means
Same integrity check as the source-side one: deserialize() also verifies that edge.target exists among the restored nodes before assigning the edge list. A snapshot with an edge pointing at a nonexistent target is rejected because queries and random walks would traverse to missing nodes.
Source
Thrown at packages/rag/src/graph-rag/index.ts:157
const graph = new GraphRAG(snapshot.dimension, snapshot.threshold);
for (const node of snapshot.nodes ?? []) {
// Route through addNode so embedding presence and dimension are validated
// at load time rather than failing later inside query().
graph.addNode({
...node,
...(node.embedding ? { embedding: [...node.embedding] } : {}),
...(node.metadata ? { metadata: structuredClone(node.metadata) } : {}),
});
}
for (const edge of snapshot.edges ?? []) {
if (!graph.nodes.has(edge.source)) {
throw new Error(`Edge references unknown node: ${edge.source}`);
}
if (!graph.nodes.has(edge.target)) {
throw new Error(`Edge references unknown node: ${edge.target}`);
}
}
// Assign directly rather than via addEdge: the serialized edge list already
// contains both directions, and addEdge would add the reverse edge again.
graph.edges = (snapshot.edges ?? []).map(edge => ({ ...edge }));
return graph;
}
clear(): void {
this.nodes.clear();
this.edges = [];
}
updateNodeContent(id: string, newContent: string): void {
const node = this.nodes.get(id);
if (!node) {View on GitHub (pinned to 75dd419e61)
Solutions
- Filter or repair edges whose target is missing from snapshot.nodes before deserializing.
- Regenerate the snapshot via serialize() from a consistent in-memory graph.
- Apply id migrations to both nodes and edges together.
- Run a referential-integrity check (Set of node ids) on snapshots before loading them.
Example fix
// before
const graph = GraphRAG.deserialize(savedSnapshot);
// after
const ids = new Set(savedSnapshot.nodes.map(n => n.id));
for (const e of savedSnapshot.edges) {
if (!ids.has(e.target)) throw new Error(`snapshot corrupt: edge target ${e.target} missing`);
}
const graph = GraphRAG.deserialize(savedSnapshot); Defensive patterns
Strategy: validation
Validate before calling
const ids = new Set(snapshot.nodes.map(n => n.id));
const dangling = snapshot.edges.filter(e => !ids.has(e.target));
if (dangling.length) throw new Error(`Edges with unknown target: ${dangling.map(e => e.target).join(',')}`); Type guard
const edgesHaveKnownTargets = (s: GraphRAGSnapshot): boolean => {
const ids = new Set(s.nodes.map(n => n.id));
return s.edges.every(e => ids.has(e.target));
}; Try / catch
try {
const graph = GraphRAG.deserialize(snapshot);
} catch (e) {
if ((e as Error).message.startsWith('Edge references unknown node')) {
snapshot.edges = snapshot.edges.filter(e =>
snapshot.nodes.some(n => n.id === e.target));
// retry deserialize
} else throw e;
} Prevention
- Apply id migrations to nodes and edges together
- Filter both source and target when sanitizing edges
- Prefer serialize()/deserialize() round-trips over manual JSON edits
- Run an integrity check on load: every edge endpoint must exist in nodes
When it happens
Trigger: GraphRAG.deserialize(snapshot) with an edge whose target id is absent from snapshot.nodes — typically from hand-edited/pruned snapshots, id remapping, or a snapshot merged from incompatible graphs.
Common situations: Deleting a node's entry in persisted JSON while keeping its edges; exporting edges but a subset of nodes; id scheme changes (e.g. numeric to hash ids) applied only to nodes.
Related errors
- Edge references unknown node: ${edge.source}
- Unsupported GraphRAG snapshot version: ${snapshot?.version}
- Model ${config.provider}/${config.modelId} is a metadata-onl
- DATASET_ITEM_PAYLOAD_NOT_SERIALIZABLE
- HttpRemoteStrategy: requestContext is not JSON-serializable.
AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30).
Data as JSON: /api/errors/9db7a869f6be0c72.
Report an issue: GitHub.