fix: properly reconstruct GraphVerb objects in getVerbsWithPagination
- Fixed verb retrieval to include vector field from HNSWVerb - Properly merge HNSWVerb data with metadata to create complete GraphVerb - Skip verbs without metadata instead of returning incomplete objects - Fix field mapping for sourceId/targetId and source/target - Properly handle connections Map deserialization - Fix filter logic to check correct fields This fixes the issue where brain.getVerbs() returned empty array even after successfully adding verbs. The problem was that verbs are stored as HNSWVerb + metadata separately but weren't being properly reconstructed when retrieved.
This commit is contained in:
parent
6396fe0662
commit
aa8a19248d
1 changed files with 41 additions and 11 deletions
|
|
@ -1023,22 +1023,49 @@ export class FileSystemStorage extends BaseStorage {
|
||||||
const id = file.replace('.json', '')
|
const id = file.replace('.json', '')
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Read the verb data
|
// Read the verb data (HNSWVerb stored as edge)
|
||||||
const filePath = path.join(this.verbsDir, file)
|
const filePath = path.join(this.verbsDir, file)
|
||||||
const data = await fs.promises.readFile(filePath, 'utf-8')
|
const data = await fs.promises.readFile(filePath, 'utf-8')
|
||||||
const edge = JSON.parse(data)
|
const edge = JSON.parse(data)
|
||||||
|
|
||||||
// Also try to get metadata if it exists
|
// Get metadata which contains the actual verb information
|
||||||
const metadata = await this.getVerbMetadata(id)
|
const metadata = await this.getVerbMetadata(id)
|
||||||
|
|
||||||
// Convert to GraphVerb format
|
// If no metadata exists, skip this verb (it's incomplete)
|
||||||
|
if (!metadata) {
|
||||||
|
console.warn(`Verb ${id} has no metadata, skipping`)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert connections Map to proper format if needed
|
||||||
|
let connections = edge.connections
|
||||||
|
if (connections && typeof connections === 'object' && !(connections instanceof Map)) {
|
||||||
|
const connectionsMap = new Map<number, Set<string>>()
|
||||||
|
for (const [level, nodeIds] of Object.entries(connections)) {
|
||||||
|
connectionsMap.set(Number(level), new Set(nodeIds as string[]))
|
||||||
|
}
|
||||||
|
connections = connectionsMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// Properly reconstruct GraphVerb from HNSWVerb + metadata
|
||||||
const verb: GraphVerb = {
|
const verb: GraphVerb = {
|
||||||
id: edge.id,
|
id: edge.id,
|
||||||
source: metadata?.source || '',
|
vector: edge.vector, // Include the vector field!
|
||||||
target: metadata?.target || '',
|
connections: connections,
|
||||||
type: metadata?.type || 'relationship',
|
sourceId: metadata.sourceId || metadata.source,
|
||||||
...(metadata || {})
|
targetId: metadata.targetId || metadata.target,
|
||||||
} as GraphVerb
|
source: metadata.source || metadata.sourceId,
|
||||||
|
target: metadata.target || metadata.targetId,
|
||||||
|
verb: metadata.verb || metadata.type,
|
||||||
|
type: metadata.type || metadata.verb,
|
||||||
|
weight: metadata.weight,
|
||||||
|
metadata: metadata.metadata || metadata,
|
||||||
|
data: metadata.data,
|
||||||
|
createdAt: metadata.createdAt,
|
||||||
|
updatedAt: metadata.updatedAt,
|
||||||
|
createdBy: metadata.createdBy,
|
||||||
|
embedding: metadata.embedding || edge.vector
|
||||||
|
}
|
||||||
|
|
||||||
// Apply filters if provided
|
// Apply filters if provided
|
||||||
if (options.filter) {
|
if (options.filter) {
|
||||||
|
|
@ -1047,19 +1074,22 @@ export class FileSystemStorage extends BaseStorage {
|
||||||
// Check verbType filter
|
// Check verbType filter
|
||||||
if (filter.verbType) {
|
if (filter.verbType) {
|
||||||
const types = Array.isArray(filter.verbType) ? filter.verbType : [filter.verbType]
|
const types = Array.isArray(filter.verbType) ? filter.verbType : [filter.verbType]
|
||||||
if (!types.includes(verb.type || '')) continue
|
const verbType = verb.type || verb.verb
|
||||||
|
if (verbType && !types.includes(verbType)) continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check sourceId filter
|
// Check sourceId filter
|
||||||
if (filter.sourceId) {
|
if (filter.sourceId) {
|
||||||
const sources = Array.isArray(filter.sourceId) ? filter.sourceId : [filter.sourceId]
|
const sources = Array.isArray(filter.sourceId) ? filter.sourceId : [filter.sourceId]
|
||||||
if (!sources.includes(verb.source || '')) continue
|
const sourceId = verb.sourceId || verb.source
|
||||||
|
if (!sourceId || !sources.includes(sourceId)) continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check targetId filter
|
// Check targetId filter
|
||||||
if (filter.targetId) {
|
if (filter.targetId) {
|
||||||
const targets = Array.isArray(filter.targetId) ? filter.targetId : [filter.targetId]
|
const targets = Array.isArray(filter.targetId) ? filter.targetId : [filter.targetId]
|
||||||
if (!targets.includes(verb.target || '')) continue
|
const targetId = verb.targetId || verb.target
|
||||||
|
if (!targetId || !targets.includes(targetId)) continue
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check service filter
|
// Check service filter
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue