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

  1. Broaden or remove the source/target where filters so unclassified objects are included
  2. Check via GraphQL how many objects matching your filters still lack the classifyProperties values
  3. Wait for the previous classification run to complete before re-submitting (it may still be marking objects)
  4. 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

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


AI-assisted analysis of weaviate/weaviate@75aa4b6d11 (2026-09-04). Data as JSON: /api/errors/6e275dac2282fdfe. Report an issue: GitHub.