pathwaycom/pathway · error · ValueError

Column(s) {reserved_property_columns!r} use a name reserved

Error message

Column(s) {reserved_property_columns!r} use a name reserved by Weaviate ('id' and 'vector' cannot be object properties). Rename the column(s), or pass one as the primary_key / vector argument.

What it means

Weaviate reserves the object-level keys `id` and `vector` and rejects them as property names. Pathway encodes the primary key into the UUID and sends the vector separately, so those two column names are legal only for the columns designated as primary_key / vector arguments; any other column named `id` or `vector` would be rejected by Weaviate at runtime. The connector enumerates table.schema.column_names() up front and raises this ValueError listing the offending reserved columns.

Source

Thrown at python/pathway/io/weaviate/__init__.py:143

            f"e.g. vector=table.{vector._name}."
        )

    pk = primary_key._name if primary_key is not None else None
    vector_field = vector._name if vector is not None else None

    # Weaviate reserves "id" and "vector" as object-level keys and rejects them as
    # property names. The primary key (encoded in the UUID) and the vector column
    # are never sent as properties, so they may freely use these names; any other
    # column that does collides and is reported up front.
    reserved_property_columns = [
        column_name
        for column_name in table.schema.column_names()
        if column_name in ("id", "vector")
        and column_name != pk
        and column_name != vector_field
    ]
    if reserved_property_columns:
        raise ValueError(
            f"Column(s) {reserved_property_columns!r} use a name reserved by "
            f"Weaviate ('id' and 'vector' cannot be object properties). Rename "
            f"the column(s), or pass one as the primary_key / vector argument."
        )

    scheme = "https" if http_secure else "http"
    url = f"{scheme}://{http_host}:{http_port}"

    data_storage = api.DataStorage(
        storage_type="weaviate",
        weaviate_params=api.WeaviateParams(
            url=url,
            collection_name=collection_name,
            pk_field=pk,
            vector_field=vector_field,
            api_key=api_key,
            headers=headers,
            batch_size=batch_size,

View on GitHub (pinned to fa2f74a464)

Solutions

  1. Rename the offending column before writing: t = t.select(**{('prop_' + c if c in ('id','vector') else c): pw.this[c] for c in t.schema.columns()}).
  2. Drop it if redundant: t = t.without(pw.this.id).
  3. Designate the reserved-named column as the primary_key (or vector) argument if it is indeed the key/vector, which makes the name legal.

Example fix

# before
t = pw.debug.table_from_markdown('uuid | id | text')
pw.io.weaviate.write(t, collection_name="Docs", primary_key=t.uuid)

# after
t = t.rename_columns(source_id=pw.this.id)
pw.io.weaviate.write(t, collection_name="Docs", primary_key=t.uuid)
Defensive patterns

Strategy: validation

Validate before calling

def check_weaviate_reserved(table, pk=None, vector=None):
    hits = [
        c for c in table.schema.column_names()
        if c in ("id", "vector") and c != pk and c != vector
    ]
    if hits:
        raise ValueError(f"reserved property names present: {hits}")
    return True

Prevention

When it happens

Trigger: Calling pw.io.weaviate.write(table, ...) where the schema contains a column named `id` or `vector` that is NOT the column passed as primary_key or vector — e.g. primary_key=t.uuid with a separate t.id column still present, or an unused t.vector column.

Common situations: Source data (CSV/JSON) that already has an `id` field while the user designates a different UUID key; embedding pipelines that store a raw `vector` column alongside the designated vector argument; reusing a generic schema across multiple sinks.

Related errors


AI-assisted analysis of pathwaycom/pathway@fa2f74a464 (2026-08-15). Data as JSON: /api/errors/0ee2669e9ca7a270. Report an issue: GitHub.