weaviate/weaviate · warning
no classes to be classified - did you run a previous classif
Error message
no classes to be classified - did you run a previous classification already?
What it means
The classification run aborted because the source/target filters matched zero objects that still need classification. This typically means every candidate already has a classification verdict (or the filters are too restrictive), so there is nothing to do.
Source
Thrown at usecases/classification/classifier_run.go:51
func (c *Classifier) run(params models.Classification,
filters Filters,
) {
ctx, cancel := contextWithTimeout(30 * time.Minute)
defer cancel()
go c.monitorClassification(ctx, cancel, params.Class)
c.logBegin(params, filters)
unclassifiedItems, err := c.vectorRepo.GetUnclassified(ctx,
params.Class, params.ClassifyProperties, params.BasedOnProperties, filters.Source())
if err != nil {
c.failRunWithError(params, errors.Wrap(err, "retrieve to-be-classifieds"))
return
}
if len(unclassifiedItems) == 0 {
c.failRunWithError(params,
fmt.Errorf("no classes to be classified - did you run a previous classification already?"))
return
}
c.logItemsFetched(params, unclassifiedItems)
classifyItem, err := c.prepareRun(params, filters, unclassifiedItems)
if err != nil {
c.failRunWithError(params, errors.Wrap(err, "prepare classification"))
return
}
params, err = c.runItems(ctx, classifyItem, params, filters, unclassifiedItems)
if err != nil {
c.failRunWithError(params, err)
return
}
c.succeedRun(params)
}View on GitHub (pinned to 75aa4b6d11)
Solutions
- Broaden or remove the source/target where filters so unclassified objects are included
- Check via GraphQL how many objects matching your filters still lack the classifyProperties values
- Wait for the previous classification run to complete before re-submitting (it may still be marking objects)
- If re-classification is intended, reset/clear the property values or use different filters
Example fix
// before
curl -X POST /v1/classifications -d '{...same params as the completed run...}'
// after
// adjust targetWhere to select objects whose property is still empty, or submit new filters
{"type":"knn","class":"Article","classifyProperties":["category"],"targetWhere":{"path":["category"],"operator":"IsEmpty"}} Defensive patterns
Strategy: retry
Validate before calling
const still = await graphqlQuery(`{Aggregate{Article{meta{count}}}}`);
// or query objects missing the classifyProperties before submitting Try / catch
try { await startClassification(params); } catch (e) {
if (String(e).includes('no classes to be classified')) console.log('nothing left to classify; previous run likely completed');
} Prevention
- Check whether the previous classification run finished before re-submitting
- Track classification status via GET /v1/classifications/{id}
- Design targetWhere filters to select only unclassified objects
When it happens
Trigger: POST /v1/classifications where the unclassified-object query returns 0 items — e.g. re-running a completed classification with the same filters, or filters that exclude all objects.
Common situations: Re-running the same classification job after it succeeded; source/target where-filters too narrow; waitingForTrueVotes/other settings already satisfied in previous runs; classifyProperties already filled for all matching objects.
Related errors
- data save error
- no groups found in aggregate result
- classifications are not supported in the current cluster con
- expecteded element[%d].Schema to be map, got: %T
- expecteded element[%d].Schema to have property %q, but didn'
AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04).
Data as JSON: /api/errors/6e275dac2282fdfe.
Report an issue: GitHub.