## TL;DR
Weaviate class names are case-sensitive and must start with an uppercase letter. If you created `article` but query `Article` (or vice versa), you get "class not found". Check the exact casing in the schema and match it everywhere.

## Error
```text
{"errors": [{"message": "Query failed with reason: class Article not found"}]}
```

## Steps

1. Read the actual schema and copy the exact class name casing:
```bash
curl YOUR_HOST/v1/schema | python -m json.tool
```
Expected output: the real class list, e.g. `Article` with a capital A. Whatever casing appears here is the only casing that works.

2. Fix your queries to use that exact casing. Weaviate expects class names in PascalCase (`Article`) and property names in camelCase (`title`):
```graphql
{
  Get {
    Article(limit: 5) {
      title
    }
  }
}
```
Expected output: results instead of "class not found".

3. If the schema itself has the wrong casing, recreate the class with the right name and reimport the data. There is no rename; it is create-new plus reimport.
Expected output: one correctly cased class, no duplicates.

4. Pin the class name as a constant in your code so casing cannot drift between the schema script and the query code:
```python
ARTICLE_CLASS = "Article"
```
Expected output: future queries reuse the constant and the gotcha stops recurring.

## When to use
- Queries fail with "class not found" for a class you believe exists
- You created the schema with lowercase names out of habit
- Behavior changed after a Weaviate or client upgrade

## When not to use
- The class genuinely does not exist (create it first)
- Connection or authentication errors (those fail before any class lookup)
- Empty results without an error (thats a filter problem, not casing)

## Variant phrasings

### "class 'article' not found" with lowercase
You created or queried with a lowercase name. Weaviate class names must start uppercase; fix the casing.

### collection not found in the v4 Python client
The v4 client renamed classes to collections (`client.collections.get("Article")`), but the capitalization rule is unchanged.

## Why it happens
Weaviate validates class names on creation (uppercase first letter) but the check is easy to miss when creating via scripts, and queries do exact case-sensitive matching. A mismatch means you are asking for a class that, as far as the schema is concerned, was never created.

## Edge cases
- Property names have the opposite convention (lowercase first); getting both conventions backwards at once is common.
- Multi-tenancy does not change the rule; tenant names have their own format, class casing still applies.
- Cached schemas in long-running apps can hide a rename; restart or refetch after schema changes.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_PzOVxmy6V4OSZmN6lmKfsA
