Streaming & Counts
Production-scale APIs for processing millions of entities with constant memory and O(1) counting.
Counts API
O(1) counting operations that work instantly regardless of data size.
counts.js
const brain = new Brainy()
await brain.init()
// Total counts - O(1)
const entityCount = brain.counts.entities()
const relationCount = brain.counts.relationships()
console.log(`${entityCount} entities, ${relationCount} relationships`)
Count by Type
count-by-type.js
import { NounType, VerbType } from '@soulcraft/brainy'
// Count specific NounType - O(1)
const personCount = brain.counts.byTypeEnum(NounType.Person)
const docCount = brain.counts.byTypeEnum(NounType.Document)
// Get all type counts at once
const allNounCounts = brain.counts.allNounTypeCounts()
// Map<NounType, number>
const allVerbCounts = brain.counts.allVerbTypeCounts()
// Map<VerbType, number>
// Get top types
const topNouns = brain.counts.topTypes(5)
// [NounType.Document, NounType.Person, ...]
const topVerbs = brain.counts.topVerbTypes(5)
// [VerbType.RelatedTo, VerbType.PartOf, ...]
Relationship Counts
rel-counts.js
// Count by relationship type
const worksWith = brain.counts.byRelationshipType('WorksWith')
// Get all relationship type counts
const allRelCounts = brain.counts.byRelationshipType()
// { 'WorksWith': 150, 'PartOf': 89, 'RelatedTo': 234 }
Statistics
stats.js
// Get comprehensive stats
const stats = await brain.counts.getStats()
console.log(`Total: ${stats.entities.total}`)
console.log(`By type:`, stats.entities.byType)
console.log(`Relationships: ${stats.relationships.totalRelationships}`)
console.log(`Graph density: ${stats.density.toFixed(4)}`)
// Exclude VFS entities from stats
const knowledgeStats = await brain.counts.getStats({ excludeVFS: true })
Pagination API
Production-scale pagination with index-first optimization.
pagination.js
// Paginated search
const page1 = await brain.pagination.find({
query: 'machine learning',
page: 1,
pageSize: 20
})
// Get total count for pagination UI
const totalCount = await brain.pagination.count({
query: 'machine learning'
})
// Get full pagination metadata
const meta = await brain.pagination.meta({
query: 'machine learning',
page: 1,
pageSize: 20
})
console.log(meta)
// {
// page: 1,
// pageSize: 20,
// totalCount: 156,
// totalPages: 8,
// hasNext: true,
// hasPrev: false
// }
Pagination with Filters
paginate-filter.js
// Paginate with type and metadata filters
const results = await brain.pagination.find({
nounType: NounType.Document,
where: { status: 'published' },
page: 2,
pageSize: 50
})
Streaming API
Process millions of entities with constant memory using async iterators.
Stream All Entities
stream-entities.js
// Stream all entities without loading into memory
for await (const entity of brain.streaming.entities()) {
console.log(entity.id, entity.type)
}
// Stream with filter
for await (const entity of brain.streaming.entities({
nounType: NounType.Person
})) {
processUser(entity)
}
Stream Search Results
stream-search.js
// Stream search results in batches
for await (const result of brain.streaming.search(
{ query: 'AI research' },
100 // batch size
)) {
console.log(`${result.id}: ${result.score}`)
}
Stream Relationships
stream-relations.js
// Stream all relationships
for await (const rel of brain.streaming.relationships()) {
console.log(`${rel.from} -> ${rel.to} (${rel.type})`)
}
// Stream with filter
for await (const rel of brain.streaming.relationships({
type: 'WorksWith'
})) {
analyzeCollaboration(rel)
}
Batch Processing
batch-process.js
// Process all entities in parallel batches
await brain.streaming.process(
async (entity) => {
// Transform each entity
entity.metadata.processed = true
entity.metadata.processedAt = Date.now()
return entity
},
{ nounType: NounType.Document }, // filter
{ batchSize: 100, parallel: 4 } // options
)
Memory Comparison
| Approach | 1K Entities | 1M Entities |
|---|---|---|
find() (load all) |
~10 MB | ~10 GB (crash) |
streaming.entities() |
~1 MB | ~1 MB (constant) |
getNounCount() / getVerbCount()
Simple methods for total counts (alias for counts API).
const entityCount = await brain.getNounCount()
const relationCount = await brain.getVerbCount()
getStats()
Convenience method for complete statistics.
const stats = await brain.getStats()
// Same as brain.counts.getStats()
// Exclude VFS
const knowledgeOnly = await brain.getStats({ excludeVFS: true })
insights()
High-level insights about your data.
const insights = await brain.insights()
console.log(insights)
// {
// entities: 15000,
// relationships: 45000,
// types: { Person: 5000, Document: 8000, ... },
// services: ['default', 'user-service'],
// density: 0.0006
// }
See Also
- find() - Standard search
- Batch Operations - Bulk processing
- Storage Adapters - Performance tuning