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 patternsData 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.
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.
PROPERTY riverside-plaza
LEASE lease-3391
tenant: "Northwind Logistics"
expiresAt: "2026-09-30"
escalationType: "fixed"
escalationRate: 3.0
renewalOptionMonths: 6{
"labels": ["LEASE"],
"where": {
"expiresAt": { "$lte": "2026-09-30" },
"escalationType": "fixed",
"escalationRate": { "$gte": 3.0 }
},
"limit": 50
}{
"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.
- 01Import PROPERTY records, each with nested LEASE records
- 02Extract term, expiresAt, escalationType, escalationRate, and renewalOptionMonths per lease
- 03Link each LEASE to its TENANT record
- 04Query portfolio-wide conditions directly with where-filters
- 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.
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.
Import JSON data
Push nested property and lease data and let RushDB create the connected records automatically.
Open docsSearch introduction
Filter leases across the whole portfolio by expiration, escalation, and renewal fields in one query.
Open docsRelationships
Keep leases connected to their property and tenant instead of flattened into a spreadsheet row.
Open docsHow 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.
Next step
Start with one focused workflow.
Related use cases
Explore all use casesProperty intelligence marketplace
Match investors, sellers, and homeowners from vague search intent to schema-grounded property filters.
Explore property intelligenceAnalytical workloads
Move from ingest to KPI trends, dashboard drill-downs, and connected operational context.
Explore analytical workloads