Guides

GraphRAG vs RAG: when the graph is the point.

Traditional RAG ranks text chunks by embedding similarity and hands the top results to an LLM. GraphRAG adds a second retrieval path: once a chunk matches, the system can follow explicit relationships to the entities, documents, and decisions connected to it.

GraphRAG is retrieval-augmented generation that combines vector similarity search with graph traversal, so an answer can include not just the nearest matching text but also the entities and records connected to it.

What this guide covers

The practical decision points.

Same starting point

Both approaches begin with semantic search over indexed text to find candidate chunks.

Different next step

Traditional RAG stops at the ranked chunks. GraphRAG can traverse relationships from those chunks to pull in connected context.

The cost is real

GraphRAG needs relationships to exist and be trustworthy. A graph of guessed or unreviewed links can mislead an LLM as easily as help it.

Architecture sketch

Where GraphRAG adds a second hop

Traditional RAG stops once it ranks matching chunks. GraphRAG treats those ranked chunks as an entry point into the graph, then follows relationships before generation.

Implementation example

Rank chunks, then traverse from the match

The semantic search step is identical to flat RAG. The GraphRAG step is the follow-up query that pulls connected records for the top match.

from rushdb import RushDB

db = RushDB("RUSHDB_API_KEY")

matches = db.ai.search({
    "labels": ["CHUNK"],
    "propertyName": "text",
    "query": "What triggered the renewal discount policy change?",
    "limit": 3,
}).data

top_chunk_id = matches[0]["chunk_id"]

connected = db.records.find({
    "labels": ["CHUNK"],
    "where": {"chunk_id": top_chunk_id},
    "aggregate": {"citations": {"fn": "collect", "field": "CITATION.page"}},
})

print(matches)
print(connected.data)

When flat RAG is enough

If the answer is usually contained in one chunk — a single FAQ entry, a single policy paragraph — flat vector RAG is simpler and has less to maintain. Adding graph traversal for single-hop questions is unnecessary complexity.

Simple document Q&A where one chunk usually answers the question

Content that changes rarely, so relationship drift is not a concern

Early prototypes validating whether semantic search helps at all

When GraphRAG earns its cost

GraphRAG is worth the relationship-maintenance overhead when answers routinely depend on connected context: which account a policy applies to, which citation backs a claim, which prior decision a new one supersedes.

Relationships need a source, not a guess

RushDB draws a line between structure that is genuinely automatic and structure that requires review. Nested JSON creates real parent-child relationships on import. Relationships across separate flat sources are surfaced as suggested patterns that a person approves before they affect graph meaning — GraphRAG is only as trustworthy as that review step.

Decision table

GraphRAG vs traditional RAG

The two approaches share a retrieval layer. They diverge in what happens after the top matches are ranked.

Topic
Traditional RAG
GraphRAG
Retrieval unit

Ranked text chunks, usually with flat metadata.

Ranked chunks plus the Records they are connected to — entities, citations, owners, decisions.

Multi-hop questions

Struggles when the answer needs two or three connected facts, not one matching chunk.

Can traverse from the matched chunk to related Records to assemble a multi-hop answer.

Explainability

Answer provenance is usually "these chunks scored highest."

Answer provenance can include the explicit relationship path used to reach supporting context.

Operational cost

Lower — one index, one ranking step.

Higher — relationships must exist, be reviewed, and stay accurate, or traversal spreads bad context.