Datomic's definition of an atomic 'fact' is a value at a time. The latest value is equivalent to the 'current value' of a field in an 'imperative database' but all the previous versions are held too, allowing time-travel. Great so far but:
A datom is "an immutable, point-in-time fact: [entity, attribute, value, transaction (TIME really), added (or RETRACTED)]"
I've never felt it is possible to distinguish cleanly, for all future cases, between an entity and an attribute.
e.g. I've been looking at vertex/edge graphs from discreet mathematics. What are the entities, the vertices, the edges or each end of the edges? Obviously I'm confusing the model I choose with the object I'm modelling but isn't that the point of an object model? If I can't do that, I'm storing data about my model not my observations of reality against a simulation of reality. I've been thinking of graphs in graphical form, how I normally deal with them but they aren't necessarily real. They are a mathematical concept of connected nothings. Magic again.
Exhibit 2: Point A, Point B and the distance between them. What is that distance an attribute of? It's a thing we invent isn't it, which is subject to change in the state of either? Or it's a computation, whenever needed, from the position of the 2 objects so was never an attribute in the first place.
I think I've just argued myself into a corner where nothing in software is real, again, so none of this matters:
An entity is a thing, possibly imaginary and the attribute is a name for some value about it we want to store. I think my subconscious concern was that we were associating a value with one thing when it might be shared between several but this is Clojure, where one thing can be a collection of several things. I'll be OK now, I think.
['The Ultimate Question', 'The Answer', 42, 'Earth time: 1978'']
is a 'fact', expressed as a datom. What meaning we choose to project onto that is entirely up to each of us. With reference to some shared culture, we hope everyone will choose the same meaning.