AtomicAttributeGraph Explorer

Walk through the Bronze → Silver → Gold pipeline for three scenarios. See exactly why field-level edge timestamps produce a different — and correct — resolved profile.

1 — Bronze: Raw events2 — Silver: graph.nodes + graph.relationships3 — Gold: Resolved profile

Select a demo scenario

C001 — Santosh P.Salesforce performs a full record sync at 09:05 — the record timestamp is newer than Shopify's, so a traditional CDP would overwrite the correct phone number. AAG resolves phone to Shopify because the field-level edge timestamp is what matters.
Nodes:customercompanyassetemailphonecitySources:salesforcesapsegment
1Bronze — Raw EventsRecord-level timestamps are the source of truth here. This is the problem.
SourceFieldValueTimestampTypeNote
salesforceemailalex@example.demo09:05record
salesforcephone+49 111 000 000009:05recordRecord timestamp. Field unchanged since 2024.
salesforcecityBerlin09:05recordRecord timestamp. Field unchanged since 2023.
shopifyphone+49 987 654 321009:00fieldGenuine field update today.
segmentemailalex@example.demo08:45field
2aSilver — graph.nodesOne row per distinct value. Entity nodes carry no value.
node_idnode_typevaluechecksumproperties
cust-c001customer
val-em-001emailalex@example.demoa3f9…
val-ph-001phone+49 111 000 0000b12c…
val-ph-002phone+49 987 654 3210c45d…
val-ct-001cityBerlind78e…
2bSilver — graph.relationshipsEdges carry field-level timestamps, not record-level ones.
source_node_idrel_typetarget_node_idupdated_atsourceis_currentresolutionnote
cust-c001HAS_EMAILval-em-00109:05salesforceTRUE✓ wins
cust-c001HAS_PHONEval-ph-00109:05salesforceTRUE✗ losesLoses — field-level ts older than Shopify.
cust-c001HAS_PHONEval-ph-00209:00shopifyTRUE✓ winsWins — field was genuinely updated today.
cust-c001HAS_CITYval-ct-00109:05salesforceTRUE✓ wins
3Gold — Resolved ProfileOne row per customer. Each field attributed to its winning source.
fieldresolved valuewinning sourcefield_updated_atconflict?losing value (overridden)
emailalex@example.demosalesforce09:05
phone+49 987 654 3210shopify09:00conflict+49 111 000 0000 (salesforce, 09:05)
cityBerlinsalesforce09:05

Schema reference — the two Silver tables

graph.nodes

node_id     STRING    -- UUID (entity) or SHA-256 (value)
node_type   STRING    -- customer | company | asset | email | ...
value       STRING    -- NULL for entity nodes
checksum    STRING    -- dedup key for value nodes
created_at  TIMESTAMP
properties  MAP<STRING,STRING>

graph.relationships

source_node_id  STRING    -- any node type
target_node_id  STRING    -- any node type
rel_type        STRING    -- HAS_EMAIL | WORKS_AT | OWNS | ...
updated_at      TIMESTAMP -- field-level, not record-level
confidence      FLOAT
is_current      BOOLEAN
source_system   STRING
properties      MAP<STRING,STRING>

All data is synthetic demo data. Built by Santosh Pradhan · AAG framework post · Open source on GitHub