Skip to content

Commit 367fb5e

Browse files
aksOpsclaude
andcommitted
fix: enforce consistent edge behavior across all backends
NetworkX auto-creates phantom nodes when adding edges between non-existent nodes. SQLite stored dangling edges. Both now skip edges where source or target nodes don't exist, matching KuzuDB's FOREIGN KEY behavior. All 3 backends produce identical results: same nodes, same edges. Verified on contoso-real-estate: 2,298 nodes, 2,890 edges across NetworkX, SQLite, and KuzuDB. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7a103d3 commit 367fb5e

2 files changed

Lines changed: 11 additions & 0 deletions

File tree

src/code_intelligence/graph/backends/networkx.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ def add_node(self, node: GraphNode) -> None:
3838
self._g.add_node(node.id, **node.model_dump())
3939

4040
def add_edge(self, edge: GraphEdge) -> None:
41+
# Only add edge if both nodes exist — prevents NetworkX from
42+
# auto-creating phantom nodes for dangling references.
43+
if edge.source not in self._g or edge.target not in self._g:
44+
logger.debug(
45+
"Skipping edge %s -> %s: missing node(s)",
46+
edge.source, edge.target,
47+
)
48+
return
4149
self._g.add_edge(edge.source, edge.target, **edge.model_dump())
4250

4351
def clear(self) -> None:

src/code_intelligence/graph/backends/sqlite_backend.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ def add_node(self, node: GraphNode) -> None:
127127
logger.exception("Failed to add node %s", node.id)
128128

129129
def add_edge(self, edge: GraphEdge) -> None:
130+
# Only add edge if both nodes exist — consistent with KuzuDB/Neo4j behavior
131+
if not self.has_node(edge.source) or not self.has_node(edge.target):
132+
return
130133
try:
131134
self._conn.execute(
132135
"INSERT INTO edges (source, target, kind, data) VALUES (?, ?, ?, ?)",

0 commit comments

Comments
 (0)