{"record":{"id":"fd2296a24879585a","repo":"mem0ai/mem0","slug":"neptune-analytics-vector-search-does-not-support-c","errorCode":null,"errorMessage":"Neptune Analytics vector search does not support case-insensitive contains filters.","messagePattern":"Neptune Analytics vector search does not support case-insensitive contains filters\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"mem0-ts/src/oss/src/vector_stores/neptune_analytics.ts","lineNumber":655,"sourceCode":"            value: operand,\n          },\n        };\n      case \"contains\":\n        return {\n          stringContains: {\n            property: key,\n            value: operand,\n          },\n        };\n      case \"startsWith\":\n        return {\n          startsWith: {\n            property: key,\n            value: operand,\n          },\n        };\n      case \"icontains\":\n        throw new Error(\n          \"Neptune Analytics vector search does not support case-insensitive contains filters.\",\n        );\n      default:\n        throw new Error(\n          `Unsupported Neptune Analytics filter operator: ${operator}`,\n        );\n    }\n  }\n\n  private negateVertexFilter(filter: NeptuneVertexFilter): NeptuneVertexFilter {\n    if (Array.isArray(filter.andAll)) {\n      return this.combineVertexFilters(\n        \"orAll\",\n        filter.andAll.map((entry: NeptuneVertexFilter) =>\n          this.negateVertexFilter(entry),\n        ),\n      )!;\n    }","sourceCodeStart":637,"sourceCodeEnd":673,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0-ts/src/oss/src/vector_stores/neptune_analytics.ts#L637-L673","documentation":"The Neptune Analytics filter builder supports a fixed operator set (equality, in, contains, startsWith), but icontains (case-insensitive contains) has no Neptune vector-search equivalent, so it fails fast with an explicit message rather than degrading to case-sensitive contains and returning wrong results.","triggerScenarios":"Advanced filter objects like { data: { icontains: 'memory' } } or { key: 'data', operator: 'icontains', value: ... } on the neptune-analytics provider; porting filter logic from SQL/SQLAlchemy-based stores (where icontains is common) or from Mem0's Python providers that support it.","commonSituations":"Cross-provider filter code; search UIs offering case-insensitive substring search; LLM filter generation picking icontains from a generic operator vocabulary.","solutions":["Use contains (case-sensitive) if acceptable: { data: { contains: 'Memory' } }.","Post-filter client-side: run contains, then case-insensitive match on returned payloads in JS.","Store a lowercased copy of the field at insert time and contains against the lowercased query value."],"exampleFix":"// before\nstore.search(q, 5, { data: { icontains: 'hello' } }); // throws\n\n// after\nconst res = await store.search(q, 20, { data: { contains: 'hello' } });\nconst hits = res.filter(r => r.payload?.data?.toLowerCase().includes('hello'));","handlingStrategy":"fallback","validationCode":"const UNSUPPORTED_OPS = new Set(['icontains']);\nfunction hasUnsupportedOps(filters: any): boolean {\n  return Object.values(filters ?? {}).some(\n    (v) => v && typeof v === 'object' && !Array.isArray(v) && UNSUPPORTED_OPS.has(Object.keys(v)[0])\n  );\n}","typeGuard":"type NeptuneOp = { eq?: string | number; in?: (string | number)[]; contains?: string; startsWith?: string };\nconst isNeptuneOp = (v: unknown): v is NeptuneOp =>\n  !!v && typeof v === 'object' && Object.keys(v).every((k) => ['eq', 'in', 'notIn', 'contains', 'startsWith'].includes(k));","tryCatchPattern":"try { results = await store.search(q, k, filters); }\ncatch (e) {\n  if (e instanceof Error && e.message.includes('case-insensitive contains')) {\n    // fallback: contains search + client-side case-insensitive refinement\n    const wide = await store.search(q, k * 4, replaceOp(filters, 'icontains', 'contains'));\n    results = wide.filter((r) => JSON.stringify(r.payload).toLowerCase().includes(needle.toLowerCase()));\n  } else throw e;\n}","preventionTips":["Know the Neptune operator whitelist: eq/in/notIn/contains/startsWith — no case-insensitive ops.","Store lowercased copies of searchable fields at insert time if you need icontains behavior.","Restrict LLM/user-supplied operator vocabularies to the supported set."],"tags":["neptune","filters","unsupported-operation","case-insensitive","vector-store"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}