Blueprint: legal research

Case law that stays connected to what cites it.

A holding read in isolation can mislead if a later case narrowed, distinguished, or overturned it. This blueprint stores CASE, STATUTE, and HOLDING records as connected graph nodes linked by typed CITES relationships, so retrieval can follow citation edges outward from a matching case instead of returning it as an unconnected chunk of text.

A legal research citation graph connects cases, statutes, and holdings as Records linked by typed CITES relationships, letting a researcher traverse from a matching holding to later cases that followed, distinguished, or overturned it.

Similar-sounding case law is not the same as controlling case law.

Flat semantic search over case text finds passages that sound relevant, but a researcher needs to know what happened after: was this holding cited approvingly, distinguished, or overturned by a later court? That answer lives in the citation graph connecting CASE records through CITES relationships, not in any single chunk of retrieved text, however similar it reads.

Before

  • Semantic search returns isolated case excerpts
  • Citation status is checked manually in a separate tool
  • Jurisdiction and date filters are bolted on after retrieval
  • Statute references are copied as plain text with no live link back to the statute record

With RushDB

  • Cases, statutes, and holdings are connected Records with typed citation edges
  • Retrieval can traverse from a matching case to what cites, distinguishes, or overturns it
  • Jurisdiction and date are exact filters applied before ranking
  • Statute citations stay linked to the actual statute record, not just a text reference

Graph intelligence on ingest

Incoming data becomes queryable graph context.

Citation research arrives as CASE records nesting HOLDING text and CITES references to other cases and STATUTE sections. RushDB keeps that nested structure linked on import, so a CASE-to-CASE citation is a traversable relationship immediately, and suggested-relationship analysis can propose STATUTE links for cases imported flat from a docket feed.

01

Normalize as data arrives

As CASE records are imported with jurisdiction, decidedAt, and holding_text, RushDB infers property types immediately for filtering and semantic search.

02

Auto-link nested structure

A CASE nesting its CITES references to other cases or STATUTE sections becomes connected Records automatically, preserving citation structure already in the payload.

03

Enrich scattered sources

For cases imported flat from a docket feed, suggested-relationship analysis can propose CITES and statute-reference links for your review before they’re added.

Suggested relationship analysis requires an LLM configured for the project. Suggestions stay in draft form until you approve them, so inferred domain meaning never mutates the graph silently. You can also add explicit relationships through the SDK or API.

Review suggested relationship patterns

Data model

One flexible graph for the workflow.

Start with the payload shape your product already produces. RushDB stores it as Records, infers typed properties, and keeps nested or approved domain relationships queryable.

Schema sketch
Case citation payload

A case write carries its holding and statute references; a later case links back through a typed CITES relationship.

{
  "caseId": "doe-v-acme-2023",
  "jurisdiction": "9th Circuit",
  "decidedAt": "2023-08-02",
  "HOLDING": [{ "text": "Email notice satisfies the statute when actual receipt is shown." }],
  "CITES": [{ "caseId": "smith-v-jones-2019", "treatment": "distinguished" }]
}

Working example

Find the holding, then check what happened to it.

Semantic search finds the matching case. Graph traversal from that case surfaces later cases that cite, distinguish, or overturn its holding.

Input
CASE smith-v-jones-2019
  jurisdiction: "9th Circuit"
  decidedAt: "2019-04-11"
  HOLDING: "Notice by email satisfies the statutory notice requirement."

CASE doe-v-acme-2023
  jurisdiction: "9th Circuit"
  decidedAt: "2023-08-02"
  CITES smith-v-jones-2019 treatment: "distinguished"
Query
{
  "labels": ["CASE"],
  "propertyName": "holding_text",
  "query": "Does email notice satisfy statutory notice requirements?",
  "where": { "jurisdiction": "9th Circuit" },
  "limit": 10
}
Result
{
  "matched_case": "smith-v-jones-2019",
  "holding": "Notice by email satisfies the statutory notice requirement.",
  "later_treatment": [
    { "case": "doe-v-acme-2023", "treatment": "distinguished", "decidedAt": "2023-08-02" }
  ]
}

TypeScript SDK

Load schema, search holdings, then follow the citation graph.

The search step finds the matching holding. The traversal step is what tells the researcher whether that holding still stands.

from rushdb import RushDB

db = RushDB('RUSHDB_API_KEY')

schema = db.ai.get_schema_markdown({'labels': ['CASE', 'STATUTE', 'HOLDING']}).data

db.ai.indexes.create({'label': 'CASE', 'propertyName': 'holding_text'})

matches = db.ai.search({
    'labels': ['CASE'],
    'propertyName': 'holding_text',
    'query': 'Does email notice satisfy statutory notice requirements?',
    'where': {'jurisdiction': '9th Circuit'},
    'limit': 10,
})

later_treatment = db.records.find({
    'labels': ['CASE'],
    'where': {'CITES': {'caseId': matches.data[0]['caseId']}},
})

Implementation blueprint

Build the citation-graph research path.

Use this sequence to keep case law connected to its later treatment instead of returning isolated matching text.

  1. 01Import CASE records with jurisdiction, decidedAt, and holding_text
  2. 02Import STATUTE records referenced by cases
  3. 03Create a managed index on CASE.holding_text
  4. 04Attach CITES relationships with a treatment field (followed, distinguished, overturned)
  5. 05Search holdings, then traverse CITES to surface later treatment

Build path

  • Keep jurisdiction and decidedAt as exact filters, not part of the semantic query.
  • Model CITES as a relationship with a treatment property, not a plain text reference.
  • Link statute citations to STATUTE records so a statute amendment is traceable to affected cases.
  • Present citation traversal as research support — a researcher still confirms current validity before relying on it.

Relevant docs

Read the exact primitives behind this pattern.

These links point to the RushDB docs pages that map directly to this blueprint: ingestion, labels, properties, values, SearchQuery, relationships, semantic search, MCP, or deployment.

How it works

Build the smallest useful workflow first.

01

Load schema before searching

Give the research agent the real case, statute, and holding fields it can filter and traverse.

02

Search holdings by meaning

Rank cases by semantic similarity to the research question, scoped by exact jurisdiction and date filters.

03

Traverse citations from the match

Follow CITES relationships from the matched case to see what later cases followed, distinguished, or overturned it.

Know where it fits.

Citation treatment is a typed relationship

Store whether a later case followed, distinguished, or overturned a holding as a property on the CITES relationship, not as prose to re-parse later.

This is research support, not legal advice

The graph surfaces connected case law for a researcher to review. It does not determine current validity or provide legal conclusions.

Questions developers ask.