Soon it becomes apparent that, wait, that same electrode group collects multiple timeseries, so it should probably be its own thing that I can reference in multiple places. So the ability to create references is added, and the ability to create anonymous sub-things is also retained, because not everything is reused.
so electrode is its own thing, but it too has its own anonymous untyped things, and I want to reference those. So now I need to create a reference with subselection - "this electrode within electrode group x." This is often done by creating another anonymous subthing within the referring thing - "a table that contains indices with which I select from the thing I'm referring to." When you un-nest the schema, these kinds of references are actually most of the anonymous classes.
This is a pretty tight analogical map to blank nodes, this tension in #RDF where "everything should be uniquely, globally identifiable" but "actually not literally everything because that would be ridiculous." And blank nodes have caused a ton of work to be needed to eg. canonicalize graphs so you can automatically assign unique names to things.
See also #IPLD which makes some different choices, notably being to treat every subgraph as ordered even though graphs don't have an intrinsic ordering: https://ipld.io/design/tricky-choices/ordering/
(Side note every project should have a "tricky choices" section in the docs. Props to protocol labs for that)