TrustGraph
key conceptsintermediate

Knowledge Cores as Modular Memory

Understand how Knowledge Cores provide modular, swappable Knowledge Graph storage for AI agents. Learn to organize, version, and manage multiple knowledge bases.

8 min read
Updated 12/24/2025
TrustGraph Team
#knowledge-cores#modular-memory#knowledge-graphs#architecture

Knowledge Cores are modular, isolated Knowledge Graph instances that serve as swappable memory units for AI agents and applications. Each Knowledge Core contains a complete, independent graph of entities and relationships, enabling multi-tenancy, version control, and specialized knowledge domains within a single TrustGraph deployment.

What Are Knowledge Cores?

Think of Knowledge Cores as self-contained memory modules for your AI system:

// A Knowledge Core is an isolated graph instance
const knowledgeCore = {
  id: "core_production_v1",
  name: "Production Knowledge Base",
  type: "graph_database",

  // Complete graph instance
  storage: {
    nodes: 1_000_000,
    edges: 5_000_000,
    properties: 10_000_000
  },

  // Metadata
  version: "1.0.0",
  created: "2025-01-01",
  lastModified: "2025-12-24",

  // Access control
  permissions: {
    read: ["agent_1", "agent_2"],
    write: ["agent_1"],
    admin: ["user_123"]
  },

  // Backend configuration
  backend: {
    type: "cassandra",
    cluster: ["node1:9042", "node2:9042", "node3:9042"],
    keyspace: "trustgraph_production"
  }
};

Key characteristics:

  • Isolated: Each core is completely independent
  • Swappable: Switch between cores without downtime
  • Versioned: Track changes and roll back if needed
  • Specialized: Optimize each core for specific domains
  • Scalable: Scale cores independently

Why Use Knowledge Cores?

1. Multi-Tenancy

Isolate data for different customers or organizations:

// Create separate cores for each tenant
await trustgraph.cores.create({
  name: "tenant_acme_corp",
  type: "cassandra",
  isolation: "complete",
  config: {
    keyspace: "acme_corp_data"
  }
});

await trustgraph.cores.create({
  name: "tenant_globex_inc",
  type: "cassandra",
  isolation: "complete",
  config: {
    keyspace: "globex_inc_data"
  }
});

// Agents automatically use the correct core
const agent = await trustgraph.createAgent({
  id: "customer_support_agent",
  knowledgeCore: "tenant_acme_corp"  // Isolated to this tenant
});

2. Domain Specialization

Create specialized cores for different knowledge domains:

// Medical knowledge core
const medicalCore = await trustgraph.cores.create({
  name: "medical_knowledge",
  type: "neo4j",
  schema: {
    entityTypes: ["disease", "symptom", "treatment", "drug", "patient"],
    relationshipTypes: ["causes", "treats", "prescribed_for", "contraindicated"]
  }
});

// Legal knowledge core
const legalCore = await trustgraph.cores.create({
  name: "legal_knowledge",
  type: "memgraph",
  schema: {
    entityTypes: ["case", "statute", "regulation", "precedent", "party"],
    relationshipTypes: ["cites", "overturns", "applies_to", "governed_by"]
  }
});

// Financial knowledge core
const financialCore = await trustgraph.cores.create({
  name: "financial_knowledge",
  type: "cassandra",
  schema: {
    entityTypes: ["company", "transaction", "account", "asset", "liability"],
    relationshipTypes: ["owns", "trades", "invests_in", "owes"]
  }
});

3. Version Control

Version your knowledge graphs like code:

// Production core
const prodCore = await trustgraph.cores.create({
  name: "production",
  version: "2.1.0"
});

// Create staging core as copy
const stagingCore = await trustgraph.cores.clone({
  source: "production",
  name: "staging",
  version: "2.2.0-beta"
});

// Make changes in staging
await trustgraph.useCore("staging");
await trustgraph.ingest({ source: "new_data.json" });
await trustgraph.updateSchema({ ... });

// Test in staging
const testResults = await runTests(stagingCore);

if (testResults.passed) {
  // Promote staging to production
  await trustgraph.cores.promote({
    source: "staging",
    target: "production",
    version: "2.2.0"
  });
} else {
  // Roll back - discard staging changes
  await trustgraph.cores.delete("staging");
}

4. Temporal Separation

Separate current vs historical data:

// Current data (frequently updated)
const currentCore = await trustgraph.cores.create({
  name: "current_knowledge",
  type: "memgraph",  // In-memory for speed
  config: {
    retention: "90_days"
  }
});

// Historical archive (read-only)
const archiveCore = await trustgraph.cores.create({
  name: "historical_archive",
  type: "cassandra",  // Distributed for scale
  config: {
    readonly: true,
    compression: "high"
  }
});

// Periodically archive old data
await trustgraph.cores.archiveData({
  source: "current_knowledge",
  target: "historical_archive",
  olderThan: "90_days"
});

Creating and Managing Knowledge Cores

Creating a Core

const core = await trustgraph.cores.create({
  name: "my_knowledge_core",

  // Backend type
  type: "cassandra",  // or "neo4j", "memgraph", "nebula"

  // Backend configuration
  config: {
    cluster: ["cassandra1:9042", "cassandra2:9042"],
    keyspace: "my_core",
    replicationFactor: 3
  },

  // Schema definition
  schema: {
    entityTypes: ["person", "organization", "document"],
    relationshipTypes: ["works_at", "authored", "cites"],
    ontology: "schema/ontology.owl"
  },

  // Metadata
  metadata: {
    description: "Core knowledge base for main application",
    owner: "team_data",
    tags: ["production", "primary"]
  }
});

Switching Between Cores

// Set active core for current context
await trustgraph.useCore("production");

// All operations now use production core
await trustgraph.query({ query: "..." });

// Switch to different core
await trustgraph.useCore("staging");

// Now using staging core
await trustgraph.query({ query: "..." });

// Or specify core explicitly
await trustgraph.query({
  query: "...",
  core: "production"  // Override active core
});

Listing and Inspecting Cores

// List all cores
const cores = await trustgraph.cores.list();

for (const core of cores) {
  console.log(`Core: ${core.name}`);
  console.log(`  Type: ${core.type}`);
  console.log(`  Nodes: ${core.stats.nodeCount}`);
  console.log(`  Edges: ${core.stats.edgeCount}`);
  console.log(`  Size: ${core.stats.sizeGB} GB`);
  console.log(`  Status: ${core.status}`);
}

// Get detailed info about specific core
const coreInfo = await trustgraph.cores.inspect("production");
console.log(coreInfo);
// {
//   name: "production",
//   version: "2.1.0",
//   schema: { ... },
//   stats: { ... },
//   config: { ... },
//   health: "healthy"
// }

Deleting a Core

// Delete a core (careful - permanent!)
await trustgraph.cores.delete("old_core", {
  confirm: true,
  backup: true  // Create backup before deletion
});

Multi-Core Architectures

Pattern 1: Read/Write Separation

// Write core - optimized for ingestion
const writeCore = await trustgraph.cores.create({
  name: "write_core",
  type: "memgraph",
  config: {
    memoryLimit: "64GB",
    writeOptimized: true
  }
});

// Read core - optimized for queries
const readCore = await trustgraph.cores.create({
  name: "read_core",
  type: "cassandra",
  config: {
    readOptimized: true,
    cacheSize: "32GB"
  }
});

// Ingest to write core
await trustgraph.useCore("write_core");
await trustgraph.ingest({ source: "data/" });

// Replicate to read core
await trustgraph.cores.replicate({
  source: "write_core",
  target: "read_core"
});

// Queries use read core
await trustgraph.useCore("read_core");
const results = await trustgraph.query({ query: "..." });

Pattern 2: Hierarchical Knowledge

// General knowledge (large, shared)
const generalCore = await trustgraph.cores.create({
  name: "general_knowledge",
  type: "cassandra",
  shared: true
});

// Domain-specific knowledge (smaller, focused)
const domainCore = await trustgraph.cores.create({
  name: "domain_medical",
  type: "neo4j",
  extends: "general_knowledge"  // Inherits general knowledge
});

// Query across both cores
const results = await trustgraph.query({
  query: "medical question",
  cores: ["domain_medical", "general_knowledge"],
  priority: "domain_first"  // Check domain core first
});

Pattern 3: Geographic Distribution

// Regional cores for data sovereignty
const usCore = await trustgraph.cores.create({
  name: "knowledge_us_east",
  type: "cassandra",
  config: {
    datacenter: "us-east-1",
    region: "us"
  }
});

const euCore = await trustgraph.cores.create({
  name: "knowledge_eu_west",
  type: "cassandra",
  config: {
    datacenter: "eu-west-1",
    region: "eu"
  }
});

// Route queries to appropriate core based on user location
async function getCore(userLocation: string) {
  if (userLocation.startsWith("EU")) {
    return "knowledge_eu_west";
  } else {
    return "knowledge_us_east";
  }
}

Knowledge Core Operations

Cloning a Core

// Create exact copy of existing core
const cloned = await trustgraph.cores.clone({
  source: "production",
  name: "experiment_1",
  type: "same",  // Use same backend as source
  copyData: true
});

// Now experiment without affecting production
await trustgraph.useCore("experiment_1");
await experimentalChanges();

Merging Cores

// Merge two cores
await trustgraph.cores.merge({
  source1: "medical_core_v1",
  source2: "medical_core_v2",
  target: "medical_core_merged",

  // Conflict resolution strategy
  conflicts: {
    entities: "prefer_source2",  // Use source2 entities on conflict
    relationships: "union"       // Keep relationships from both
  }
});

Exporting and Importing

// Export core to file
await trustgraph.cores.export({
  core: "production",
  format: "graphml",  // or "json", "cypher", "rdf"
  output: "backup/production_2025-12-24.graphml",
  compress: true
});

// Import core from file
await trustgraph.cores.import({
  file: "backup/production_2025-12-24.graphml",
  target: "production_restored",
  format: "graphml"
});

Syncing Cores

// Keep two cores synchronized
await trustgraph.cores.sync({
  source: "production",
  target: "disaster_recovery",

  // Sync strategy
  mode: "incremental",  // Only sync changes
  direction: "one-way",  // source -> target only
  interval: "5m",        // Sync every 5 minutes

  // Conflict handling
  onConflict: "source_wins"
});

Performance Optimization

Core-Specific Optimization

// Optimize core for specific workload
await trustgraph.cores.optimize({
  core: "production",

  workload: {
    readHeavy: true,
    writeHeavy: false,
    complexTraversals: true,
    avgQueryDepth: 3
  },

  tuning: {
    // Cache settings
    cache: {
      nodeCache: "16GB",
      edgeCache: "8GB",
      queryCache: "4GB"
    },

    // Indexing
    indexes: {
      nodeProperties: ["name", "type", "created"],
      edgeTypes: ["relates_to", "connects"]
    },

    // Compression
    compression: {
      properties: true,
      edges: false  // Don't compress for fast traversal
    }
  }
});

Sharding Large Cores

// Shard large core across multiple backends
await trustgraph.cores.shard({
  core: "very_large_core",

  // Sharding strategy
  strategy: "hash",  // or "range", "geographic"
  shards: 8,

  // Shard key
  shardKey: "entity_type",

  // Backend for each shard
  backends: [
    { shard: 0, cluster: ["shard0-1:9042", "shard0-2:9042"] },
    { shard: 1, cluster: ["shard1-1:9042", "shard1-2:9042"] },
    // ... more shards
  ]
});

Agent Memory with Knowledge Cores

Use Knowledge Cores to provide agents with specialized memory:

// Create agent with dedicated memory core
const agent = await trustgraph.createAgent({
  id: "research_agent",

  // Personal memory core
  memoryCore: await trustgraph.cores.create({
    name: "agent_research_memory",
    type: "memgraph",
    config: {
      persistent: true,
      size: "small"
    }
  }),

  // Shared knowledge core (read-only)
  knowledgeCore: "shared_research_knowledge",

  // Core access
  coreAccess: {
    memory: ["read", "write"],
    knowledge: ["read"]
  }
});

// Agent can write to its memory core
await agent.remember({
  fact: "User prefers detailed explanations",
  confidence: 0.9
});

// Agent reads from shared knowledge core
const context = await agent.retrieve({
  query: "quantum computing",
  core: "knowledge"
});

Best Practices

  1. Use Cores for Isolation: Separate cores for tenants, environments, domains
  2. Version Your Cores: Track changes and enable rollback
  3. Optimize Per Core: Tune each core for its specific workload
  4. Regular Backups: Export cores regularly for disaster recovery
  5. Monitor Core Health: Track performance metrics per core
  6. Clean Up Unused Cores: Delete old experimental or staging cores
  7. Document Core Purpose: Clear naming and metadata for each core
  8. Control Access: Use permissions to restrict core access appropriately

Related Concepts

Learn More