197 lines
6.9 KiB
TypeScript
197 lines
6.9 KiB
TypeScript
|
|
/**
|
||
|
|
* Complete Import System Demo
|
||
|
|
*
|
||
|
|
* Demonstrates ALL phases working together:
|
||
|
|
* - Phase 1: Auto-detection + Dual Storage
|
||
|
|
* - Phase 2: Entity Deduplication
|
||
|
|
* - Phase 3: Streaming Support
|
||
|
|
* - Phase 4: Import History + Rollback
|
||
|
|
*/
|
||
|
|
|
||
|
|
import { Brainy } from '../src/brainy.js'
|
||
|
|
|
||
|
|
async function main() {
|
||
|
|
console.log('🧠 Complete Unified Import System Demo')
|
||
|
|
console.log('═'.repeat(60))
|
||
|
|
console.log()
|
||
|
|
|
||
|
|
const brain = new Brainy({
|
||
|
|
storage: { type: 'memory' as const }
|
||
|
|
})
|
||
|
|
|
||
|
|
await brain.init()
|
||
|
|
|
||
|
|
// ============================================================
|
||
|
|
// PHASE 1: Auto-Detection + Dual Storage
|
||
|
|
// ============================================================
|
||
|
|
console.log('📌 PHASE 1: Auto-Detection + Dual Storage')
|
||
|
|
console.log('─'.repeat(60))
|
||
|
|
|
||
|
|
const dataset1 = {
|
||
|
|
technologies: [
|
||
|
|
{ name: 'Artificial Intelligence', category: 'concept', description: 'Intelligence demonstrated by machines' },
|
||
|
|
{ name: 'Machine Learning', category: 'concept', description: 'Algorithms that improve through experience' }
|
||
|
|
]
|
||
|
|
}
|
||
|
|
|
||
|
|
const import1 = await brain.import(dataset1, {
|
||
|
|
vfsPath: '/imports/ai-tech',
|
||
|
|
onProgress: (p) => {
|
||
|
|
if (p.stage === 'complete') console.log(` ✅ ${p.message}`)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
console.log(` Format detected: ${import1.format} (${import1.formatConfidence * 100}%)`)
|
||
|
|
console.log(` VFS root: ${import1.vfs.rootPath}`)
|
||
|
|
console.log(` Graph entities: ${import1.entities.length}`)
|
||
|
|
console.log(` Import ID: ${import1.importId}`)
|
||
|
|
console.log()
|
||
|
|
|
||
|
|
// ============================================================
|
||
|
|
// PHASE 2: Entity Deduplication
|
||
|
|
// ============================================================
|
||
|
|
console.log('📌 PHASE 2: Entity Deduplication (Shared Knowledge)')
|
||
|
|
console.log('─'.repeat(60))
|
||
|
|
|
||
|
|
const dataset2 = {
|
||
|
|
ml_concepts: [
|
||
|
|
{ name: 'Machine Learning', category: 'concept', description: 'A subset of AI focused on data-driven learning' },
|
||
|
|
{ name: 'Deep Learning', category: 'concept', description: 'Advanced ML using neural networks' }
|
||
|
|
]
|
||
|
|
}
|
||
|
|
|
||
|
|
const import2 = await brain.import(dataset2, {
|
||
|
|
vfsPath: '/imports/ml-concepts',
|
||
|
|
enableDeduplication: true, // Default: true
|
||
|
|
deduplicationThreshold: 0.85,
|
||
|
|
onProgress: (p) => {
|
||
|
|
if (p.stage === 'complete') console.log(` ✅ ${p.message}`)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
console.log(` Entities extracted: ${import2.stats.entitiesExtracted}`)
|
||
|
|
console.log(` New entities: ${import2.stats.entitiesNew}`)
|
||
|
|
console.log(` Merged entities: ${import2.stats.entitiesMerged}`)
|
||
|
|
console.log()
|
||
|
|
|
||
|
|
// Verify deduplication
|
||
|
|
const mlResults = await brain.find({
|
||
|
|
query: 'Machine Learning',
|
||
|
|
limit: 1
|
||
|
|
})
|
||
|
|
|
||
|
|
if (mlResults.length > 0) {
|
||
|
|
console.log(' 🔍 Verifying "Machine Learning" entity:')
|
||
|
|
const ml = mlResults[0]
|
||
|
|
console.log(` Imports: ${ml.entity.metadata?.imports?.join(', ') || 'N/A'}`)
|
||
|
|
console.log(` Merge count: ${ml.entity.metadata?.mergeCount || 0}`)
|
||
|
|
console.log(` Confidence: ${((ml.entity.metadata?.confidence || 0) * 100).toFixed(1)}%`)
|
||
|
|
}
|
||
|
|
console.log()
|
||
|
|
|
||
|
|
// ============================================================
|
||
|
|
// PHASE 3: Streaming Support (simulated with progress)
|
||
|
|
// ============================================================
|
||
|
|
console.log('📌 PHASE 3: Streaming Support')
|
||
|
|
console.log('─'.repeat(60))
|
||
|
|
|
||
|
|
const largeDataset = {
|
||
|
|
items: Array.from({ length: 50 }, (_, i) => ({
|
||
|
|
name: `Concept ${i + 1}`,
|
||
|
|
category: 'concept',
|
||
|
|
description: `Description for concept ${i + 1}`
|
||
|
|
}))
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log(` Importing ${largeDataset.items.length} entities with progress tracking...`)
|
||
|
|
|
||
|
|
const import3 = await brain.import(largeDataset, {
|
||
|
|
vfsPath: '/imports/large-dataset',
|
||
|
|
chunkSize: 10, // Process in chunks of 10
|
||
|
|
onProgress: (p) => {
|
||
|
|
if (p.stage === 'extracting' && p.processed && p.total) {
|
||
|
|
if (p.processed % 10 === 0 || p.processed === p.total) {
|
||
|
|
process.stdout.write(`\r Progress: ${p.processed}/${p.total}`)
|
||
|
|
}
|
||
|
|
} else if (p.stage === 'complete') {
|
||
|
|
console.log(`\n ✅ ${p.message}`)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
console.log(` Processing time: ${import3.stats.processingTime}ms`)
|
||
|
|
console.log()
|
||
|
|
|
||
|
|
// ============================================================
|
||
|
|
// PHASE 4: Import History & Rollback
|
||
|
|
// ============================================================
|
||
|
|
console.log('📌 PHASE 4: Import History & Rollback')
|
||
|
|
console.log('─'.repeat(60))
|
||
|
|
|
||
|
|
// Access import history through coordinator
|
||
|
|
const { ImportCoordinator } = await import('../src/import/ImportCoordinator.js')
|
||
|
|
const coordinator = new ImportCoordinator(brain)
|
||
|
|
await coordinator.init()
|
||
|
|
|
||
|
|
const history = coordinator.getHistory()
|
||
|
|
const allImports = history.getHistory()
|
||
|
|
|
||
|
|
console.log(` Total imports: ${allImports.length}`)
|
||
|
|
|
||
|
|
allImports.forEach((entry, i) => {
|
||
|
|
console.log(` ${i + 1}. [${entry.importId.substring(0, 8)}...] ${entry.source.filename || entry.source.type}`)
|
||
|
|
console.log(` Format: ${entry.source.format}`)
|
||
|
|
console.log(` Entities: ${entry.entities.length}`)
|
||
|
|
console.log(` Status: ${entry.status}`)
|
||
|
|
})
|
||
|
|
|
||
|
|
console.log()
|
||
|
|
|
||
|
|
// Statistics
|
||
|
|
const stats = history.getStatistics()
|
||
|
|
console.log(' 📊 Overall Statistics:')
|
||
|
|
console.log(` Total imports: ${stats.totalImports}`)
|
||
|
|
console.log(` Total entities: ${stats.totalEntities}`)
|
||
|
|
console.log(` Total relationships: ${stats.totalRelationships}`)
|
||
|
|
console.log(` By format: ${JSON.stringify(stats.byFormat)}`)
|
||
|
|
console.log()
|
||
|
|
|
||
|
|
// Rollback demo (rollback the large dataset import)
|
||
|
|
console.log(' 🔄 Demonstrating Rollback...')
|
||
|
|
console.log(` Rolling back import: ${import3.importId.substring(0, 16)}...`)
|
||
|
|
|
||
|
|
const rollbackResult = await history.rollback(import3.importId)
|
||
|
|
|
||
|
|
console.log(` ✅ Rollback complete!`)
|
||
|
|
console.log(` Entities deleted: ${rollbackResult.entitiesDeleted}`)
|
||
|
|
console.log(` Relationships deleted: ${rollbackResult.relationshipsDeleted}`)
|
||
|
|
console.log(` VFS files deleted: ${rollbackResult.vfsFilesDeleted}`)
|
||
|
|
console.log(` Errors: ${rollbackResult.errors.length}`)
|
||
|
|
|
||
|
|
console.log()
|
||
|
|
|
||
|
|
// Final stats after rollback
|
||
|
|
const finalStats = history.getStatistics()
|
||
|
|
console.log(' 📊 After Rollback:')
|
||
|
|
console.log(` Total imports: ${finalStats.totalImports}`)
|
||
|
|
console.log(` Total entities: ${finalStats.totalEntities}`)
|
||
|
|
|
||
|
|
console.log()
|
||
|
|
console.log('═'.repeat(60))
|
||
|
|
console.log('✨ Complete Demo Finished!')
|
||
|
|
console.log()
|
||
|
|
console.log('Features Demonstrated:')
|
||
|
|
console.log(' ✅ Phase 1: Auto-detection, Dual Storage (VFS + Graph)')
|
||
|
|
console.log(' ✅ Phase 2: Entity Deduplication, Provenance Tracking')
|
||
|
|
console.log(' ✅ Phase 3: Streaming with Progress Tracking')
|
||
|
|
console.log(' ✅ Phase 4: Import History, Statistics, Rollback')
|
||
|
|
console.log()
|
||
|
|
console.log('🎉 All Phases Working in Production!')
|
||
|
|
}
|
||
|
|
|
||
|
|
main().catch(err => {
|
||
|
|
console.error('❌ Error:', err.message)
|
||
|
|
console.error(err.stack)
|
||
|
|
process.exit(1)
|
||
|
|
})
|