Blueprint: lease portfolio

Portfolio-wide lease answers without re-reading every PDF.

A property or asset manager rarely needs one lease — they need to know which leases across a portfolio are expiring soon, which have a specific escalation clause, or which tenants have a renewal option. This blueprint persists abstracted lease terms as Records connected to their property and tenant, so those questions run as one query.

A commercial lease portfolio memory persists abstracted lease terms — expiration, escalation, and renewal fields — as Records connected to their property and tenant, so portfolio-wide questions run as one query instead of a PDF review.

Portfolio questions require re-reading every lease by hand.

Lease terms, renewal windows, and escalation clauses usually live inside scanned PDFs attached to a PROPERTY. A question like "which LEASE records expire in the next 90 days with a fixed 3% escalation" normally means opening every lease again by hand, because nothing durable was extracted and stored as structured, queryable fields the first time it was read.

Before

  • Lease terms are re-read from PDFs for every portfolio question
  • Renewal windows and escalation clauses live in unstructured text
  • Portfolio-wide filtering happens in a spreadsheet maintained by hand
  • Tenant and property context are disconnected from the lease terms

With RushDB

  • Lease terms, renewal windows, and escalation clauses persist as typed Records
  • Property, tenant, and lease stay connected through relationships
  • Portfolio-wide filters run as one query instead of a manual PDF pass
  • New leases extend the same schema without a migration

Graph intelligence on ingest

Incoming data becomes queryable graph context.

Lease abstraction produces a PROPERTY nesting LEASE records, each carrying tenant, expiration, and escalation fields. RushDB links each LEASE to its PROPERTY and TENANT the moment that nested structure is imported, and suggested-relationship analysis can connect LEASE records imported flat from a document-processing pipeline back to the right property and tenant.

01

Normalize as data arrives

As PROPERTY and LEASE records are imported, RushDB infers types for expiresAt, escalationRate, and renewalOptionMonths without a schema migration.

02

Auto-link nested structure

A PROPERTY nesting its LEASE records becomes connected Records automatically, so each lease stays linked to its property from the first import.

03

Enrich scattered sources

For LEASE data extracted flat from a document-processing pipeline, suggested-relationship analysis can propose the missing links back to TENANT and PROPERTY.

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
Lease abstraction payload

One property write can carry nested leases, each with its own tenant, escalation, and renewal terms.

{
  "propertyId": "riverside-plaza",
  "LEASE": [{
    "leaseId": "lease-3391",
    "expiresAt": "2026-09-30",
    "escalationType": "fixed",
    "escalationRate": 3.0,
    "renewalOptionMonths": 6,
    "TENANT": [{ "name": "Northwind Logistics" }]
  }]
}

Working example

Find every lease that matches a portfolio-wide condition.

Once lease terms are extracted once and stored as Records, a portfolio question becomes a single filtered query instead of a document review.

Input
PROPERTY riverside-plaza
  LEASE lease-3391
    tenant: "Northwind Logistics"
    expiresAt: "2026-09-30"
    escalationType: "fixed"
    escalationRate: 3.0
    renewalOptionMonths: 6
Query
{
  "labels": ["LEASE"],
  "where": {
    "expiresAt": { "$lte": "2026-09-30" },
    "escalationType": "fixed",
    "escalationRate": { "$gte": 3.0 }
  },
  "limit": 50
}
Result
{
  "leaseId": "lease-3391",
  "property": "riverside-plaza",
  "tenant": "Northwind Logistics",
  "expiresAt": "2026-09-30",
  "escalationRate": 3.0
}

TypeScript SDK

Query the whole portfolio in one call.

Lease abstraction happens once, on import. Every portfolio-wide question after that is a filtered query, not a document re-read.

from rushdb import RushDB

db = RushDB('RUSHDB_API_KEY')

schema = db.ai.get_schema_markdown({'labels': ['PROPERTY', 'LEASE', 'TENANT']}).data

expiring_leases = db.records.find({
    'labels': ['LEASE'],
    'where': {
        'expiresAt': {'$lte': '2026-09-30'},
        'escalationType': 'fixed',
        'escalationRate': {'$gte': 3.0},
    },
    'limit': 50,
})

Implementation blueprint

Build the lease-abstraction portfolio path.

Use this sequence to turn extracted lease terms into a queryable portfolio memory instead of a per-building manual process.

  1. 01Import PROPERTY records, each with nested LEASE records
  2. 02Extract term, expiresAt, escalationType, escalationRate, and renewalOptionMonths per lease
  3. 03Link each LEASE to its TENANT record
  4. 04Query portfolio-wide conditions directly with where-filters
  5. 05Re-abstract and update a LEASE record when an amendment changes its terms

Build path

  • Keep escalation and renewal terms as typed fields, not prose, so they are filterable.
  • Link every LEASE to its PROPERTY and TENANT so portfolio questions can traverse both directions.
  • Update the LEASE record on amendment instead of leaving stale terms active.
  • Present abstracted terms as extracted data for review, not a substitute for reading the governing lease document.

How it works

Build the smallest useful workflow first.

01

Abstract lease terms once

Extract expiration, escalation, renewal, and tenant terms as typed fields when a lease is imported or amended.

02

Keep property and tenant connected

Link each lease to its property and tenant so questions can traverse either direction.

03

Query the portfolio directly

Run exact filters across every lease at once instead of reviewing documents building by building.

Know where it fits.

Amendments update, not duplicate

When a lease is amended, update the existing LEASE record’s terms rather than creating an untracked duplicate.

Abstracted terms need review

Present extracted terms as a starting point for portfolio analysis, not a substitute for reading the governing lease when a decision depends on it.

Questions developers ask.