Organizations#

How to describe an organization — the manufacturers, labs, and publishers other records point at.

  • Identity is the same_as registry link (ROR, Wikidata); the body carries the display name and its variants.

  • Other records point here: manufacturer.id on specs, publisher on datasets.

  • An editorial block records curation decisions (for example, supersession on a name change).

Define one#

A manufacturer#

from battinfo.api import create_organization

record = create_organization(
    name="Example Instruments",
    type="Manufacturer",
    legal_name="Example Instruments GmbH",
    url="https://www.example-instruments.test",
    same_as=["https://ror.org/000000000"],
    location={"address_country": "DE", "address_locality": "Ulm"},
    description="Fictional bench-equipment manufacturer for this example.",
    source_url="https://www.example-instruments.test",
    retrieved_at=1750000000,
)
{
  "schema_version": "0.2.0",
  "organization": {
    "id": "https://w3id.org/battinfo/organization/7d9k-2m4p-8t3x-6nq5",
    "short_id": "7d9k2m",
    "name": "Example Instruments",
    "type": "Manufacturer",
    "legal_name": "Example Instruments GmbH",
    "url": "https://www.example-instruments.test",
    "same_as": [
      "https://ror.org/000000000"
    ],
    "location": {
      "address_country": "DE",
      "address_locality": "Ulm"
    },
    "description": "Fictional bench-equipment manufacturer for this example."
  },
  "provenance": {
    "source_type": "manual",
    "retrieved_at": 1750000000,
    "battinfo_version": "0.7.0",
    "source_url": "https://www.example-instruments.test"
  }
}

Emitted by record_to_jsonld, hosted-context mode.

{
  "@context": "https://w3id.org/battinfo/context/records/v1.json",
  "@type": "schema:Organization",
  "@id": "https://w3id.org/battinfo/organization/7d9k-2m4p-8t3x-6nq5",
  "schema:name": "Example Instruments",
  "schema:legalName": "Example Instruments GmbH",
  "schema:additionalType": "Manufacturer",
  "schema:url": "https://www.example-instruments.test",
  "schema:sameAs": {
    "@id": "https://ror.org/000000000"
  },
  "schema:address": {
    "@type": "schema:PostalAddress",
    "schema:addressCountry": "DE",
    "schema:addressLocality": "Ulm"
  },
  "schema:description": "Fictional bench-equipment manufacturer for this example.",
  "dcterms:source": {
    "@type": "prov:Entity",
    "dcterms:type": "manual",
    "prov:hadPrimarySource": {
      "@id": "https://www.example-instruments.test"
    },
    "prov:generatedAtTime": "2025-06-15T15:06:40+00:00"
  }
}

What to notice:

  • create_organization mints the IRI deterministically from the normalized name — creating “A123 Systems” twice lands on the same record.

  • Pure schema.org emission (schema:Organization, with Corporation/ResearchOrganization/… stacked when the type IS a schema.org class); same_as carries the Wikidata/ROR identity anchors.

Common examples#

A selection of real, validated records from the packaged examples corpus — each one click away, included from its single source under examples/. The full, living library is the registry: browse it there.

A123 Systems (organization)

The record ships in the installed wheel — load it as a starting point:

import json
from importlib import resources

record = json.loads(
    resources.files("battinfo")
    .joinpath("data/examples/organization/A123.json")
    .read_text(encoding="utf-8")
)
{
  "schema_version": "0.2.0",
  "organization": {
    "id": "https://w3id.org/battinfo/organization/8z6j-n7vw-e73w-smh7",
    "short_id": "8z6jn7",
    "type": "Manufacturer",
    "name": "A123 Systems",
    "url": "https://www.a123systems.com",
    "same_as": [
      "https://www.wikidata.org/wiki/Q279389"
    ],
    "location": {
      "address_country": "US",
      "address_region": "Massachusetts"
    },
    "description": "Lithium iron phosphate cell and battery system manufacturer.",
    "legal_name": "A123 Systems LLC",
    "alternate_name": [
      "A123"
    ]
  },
  "provenance": {
    "source_type": "manual",
    "source_url": "https://www.a123systems.com",
    "retrieved_at": 1750000000
  }
}
Celgard (organization)

The record ships in the installed wheel — load it as a starting point:

import json
from importlib import resources

record = json.loads(
    resources.files("battinfo")
    .joinpath("data/examples/organization/Celgard.json")
    .read_text(encoding="utf-8")
)
{
  "schema_version": "0.2.0",
  "organization": {
    "id": "https://w3id.org/battinfo/organization/9jcc-71jq-m4vk-r8jm",
    "short_id": "9jcc71",
    "type": "Manufacturer",
    "name": "Celgard",
    "description": "Separator manufacturer (microporous polyolefin membranes) referenced in the Discovery-Benchmark cells.",
    "url": "https://www.celgard.com"
  },
  "provenance": {
    "source_type": "manual",
    "retrieved_at": 1750000000
  }
}
Empa (organization)

The record ships in the installed wheel — load it as a starting point:

import json
from importlib import resources

record = json.loads(
    resources.files("battinfo")
    .joinpath("data/examples/organization/EMPA.json")
    .read_text(encoding="utf-8")
)
{
  "schema_version": "0.2.0",
  "organization": {
    "id": "https://w3id.org/battinfo/organization/mtf8-84d1-addg-nnvv",
    "short_id": "mtf884",
    "type": "ResearchOrganization",
    "name": "Empa",
    "url": "https://www.empa.ch",
    "same_as": [
      "https://ror.org/02x681a42",
      "https://www.wikidata.org/wiki/Q683116"
    ],
    "location": {
      "address_country": "CH",
      "address_locality": "Dübendorf"
    },
    "description": "Swiss Federal Laboratories for Materials Science and Technology, an interdisciplinary research institute of the ETH Domain with battery materials and electrochemistry activity.",
    "legal_name": "Swiss Federal Laboratories for Materials Science and Technology",
    "alternate_name": [
      "EMPA",
      "Empa"
    ]
  },
  "provenance": {
    "source_type": "manual",
    "source_url": "https://www.empa.ch",
    "retrieved_at": 1750000000
  }
}

Fields#

Generated from the packaged JSON Schemas — the same files battinfo validate and the registry’s publish gate enforce. Every record also carries the shared envelope (schema_version, provenance, and optional notes, funding, contributor, license). Quantities are {value, unit} maps and may also carry value_basis (Measured, Conventional, Rated, or Nominal) and conditions (the parameters under which the value holds, each itself a quantity; a qualitative condition may be value_text alone). In JSON-LD, conditions ride a measurement node the quantity isOutputOf; the voltage_reference key instead becomes a hasMetrologicalReference datum on the quantity, beside its unit. When authoring, an instance references its spec with the spec_id= kwarg; the record stores the self-describing <type>_spec_id key shown in the tables below.

organization fields#

Schema: organization.schema.json · required at top level: schema_version, organization, provenance

The organization block:

Field

Type

Required

Description

id

→ OrganizationIri

yes

Canonical IRI of this organization record.

short_id

→ ShortId

type

Organization | Corporation | Manufacturer | ResearchOrganization … (8 values)

Organization kind (schema.org type).

name

string

yes

Current preferred name of the organization.

legalName

string

DEPRECATED alias of legal_name (pre-snake_case spelling): accepted forever, normalized on round-trip, never taught.

alternateName

string or array of string

DEPRECATED alias of alternate_name (pre-snake_case spelling): accepted forever, normalized on round-trip, never taught.

url

string

Official website URL.

same_as

string or array of string

Canonical external IRIs (Wikidata, ROR, GRID, LEI) that identify this organization.

location

object

Headquarters or principal location.

foundingDate

string

DEPRECATED alias of founding_date (pre-snake_case spelling): accepted forever, normalized on round-trip, never taught.

dissolutionDate

string

DEPRECATED alias of dissolution_date (pre-snake_case spelling): accepted forever, normalized on round-trip, never taught.

description

string

Short description of the organization.

parentOrganization

→ OrganizationIri or object

DEPRECATED alias of parent_organization (pre-snake_case spelling): accepted forever, normalized on round-trip, never taught.

legal_name

string

Full legal name, if different from name.

alternate_name

string or array of string

Former names, abbreviations, or brand names (e.g. ‘LG Chem’ for LG Energy Solution).

founding_date

string

Year or ISO 8601 date the organization was founded.

dissolution_date

string

Year or ISO 8601 date the organization was dissolved, if applicable.

parent_organization

→ OrganizationIri or object

Parent organization, if this is a subsidiary or division.

Top-level editorial: Internal editorial metadata — not forwarded to the registry semantic payload.

Design notes#

The reasoning behind the model

Identity is the whole job. An organization record exists so other records can point at one thing: manufacturer on a spec, publisher and funders on a dataset, supplier on equipment. New IRIs mint deterministically from the normalized name, so independently created records for the same organization collate instead of duplicating; same_as carries the external anchors (Wikidata, ROR, GRID, LEI) that make the identity verifiable beyond the registry.

The one pure schema.org family. Everything an organization record says already has a home in schema.org — name, legal name, address, founding date, parent organization — so the JSON-LD emits a plain schema:Organization node with no EMMO terms and nothing minted. Where the type value is itself a schema.org class (Corporation, ResearchOrganization, EducationalOrganization, GovernmentOrganization, NGO) it stacks as a second @type; Manufacturer is a schema.org property, not a class, so it stays data under schema:additionalType.

Spelling. Organization records predate the snake_case migration; the canonical keys are now legal_name, alternate_name, founding_date, dissolution_date, parent_organization (and address_country/address_region/address_locality in location). The original camelCase spellings stay accepted forever as deprecated aliases — as kwargs and in stored records — and normalize on round-trip, never taught.