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

Next: Neural API →