graflo.architecture.evolution.state_core.spec¶
What a caller must declare for a lift, and what the lift works out itself.
The split is not arbitrary. A lift can see structure -- which edges leave
directed unstated, which types have no grounding, where a property is a
float with no unit -- but it cannot see meaning. Nothing in a schema says that
ConfigurationItem denotes a sosa:FeatureOfInterest, or that temp_c
is degrees Celsius rather than a count, or that status is a fact that
changes over time while serial_number is not. Those are the four things this
spec carries, and the reason it is required rather than optional.
Everything else is mechanical and never appears here: undeclared directionality, the scaffolding types and their groundings, the provenance edges.
Attributes¶
__all__ = ['EdgeGrounding', 'Grounding', 'LiftSpec']
module-attribute
¶
Classes¶
EdgeGrounding
¶
Bases: Grounding
A grounding addressed at one edge triple.
Source code in graflo/architecture/evolution/state_core/spec.py
Attributes¶
relation = PydanticField(default=None, description='Relation name.')
class-attribute
instance-attribute
¶
source = PydanticField(..., description='Source vertex type name.')
class-attribute
instance-attribute
¶
target = PydanticField(..., description='Target vertex type name.')
class-attribute
instance-attribute
¶
Grounding
¶
Bases: ConfigBaseModel
An external-vocabulary anchor a caller asserts for one element.
Source code in graflo/architecture/evolution/state_core/spec.py
Attributes¶
exact_match = PydanticField(default_factory=list, description='IRIs asserted equivalent to it.')
class-attribute
instance-attribute
¶
iri = PydanticField(default=None, description='IRI of the concept this element denotes.')
class-attribute
instance-attribute
¶
synonyms = PydanticField(default_factory=list, description='Alternative labels an agent may meet.')
class-attribute
instance-attribute
¶
LiftSpec
¶
Bases: ConfigBaseModel
The semantic input to :func:~graflo.architecture.evolution.state_core.plan_lift.
Source code in graflo/architecture/evolution/state_core/spec.py
Attributes¶
edge_grounding = PydanticField(default_factory=list, description='Per-edge grounding, addressed by triple.')
class-attribute
instance-attribute
¶
grounding = PydanticField(default_factory=dict, description='Per-vertex grounding: ``{type_name: Grounding}``.')
class-attribute
instance-attribute
¶
identity = PydanticField(default_factory=dict, description='Explicit identity for types that would otherwise fall back to ``identity_from_all_properties``. Required only for those.')
class-attribute
instance-attribute
¶
measured = PydanticField(default_factory=dict, description="Units for existing properties, as ``{'Type.property': ucum_token}``. UCUM has no currency, so currency uses ISO-4217 (``USD``).")
class-attribute
instance-attribute
¶
observed = PydanticField(default_factory=list, description='Types that gain a ``<Type>Observation`` scaffold for measurements taken of them at a time.')
class-attribute
instance-attribute
¶
provenance = PydanticField(default=True, description="Add ``Evidence`` and ``Agent`` with the provenance edges that make 'where did this fact come from' answerable.")
class-attribute
instance-attribute
¶
retire = PydanticField(default='move', description='What happens to a property named in ``stateful``. ``move`` removes it from the entity -- the honest lift, since a fact that changes over time does not belong on the thing it is about. ``keep`` leaves it as a denormalized current value beside the history.')
class-attribute
instance-attribute
¶
stateful = PydanticField(default_factory=dict, description='Per-type mutable properties: ``{type_name: [property, ...]}``. Each named type gains a ``<Type>State`` carrying those properties over a validity interval.')
class-attribute
instance-attribute
¶
Methods:¶
measured_for(vertex)
¶
{property: unit} for one type.