Visibility Suppression and Deindex¶
When a node or edge's decay score drops below the visibility threshold, NornicDB suppresses it — hiding it from normal queries while preserving its data. This guide covers suppression behavior, deindex cleanup, and the reveal() bypass.
Visibility Threshold¶
visibilityThreshold (or DECAY VISIBILITY THRESHOLD in DDL) is the suppression cutoff — a boolean check applied after the score is computed:
It is independent from scoreFloor, which is a score-value clamp (the score never drops below it). A non-zero floor does not, on its own, keep an entity visible — it only does so if the floor itself is at or above visibilityThreshold. See scoreFloor vs visibilityThreshold for lifecycle examples.
Each decay profile specifies a DECAY VISIBILITY THRESHOLD (default: 0.05). When an entity's score falls below this value:
- The entity is marked with
suppressed: true - It becomes invisible to normal
MATCHqueries - It is excluded from search results (BM25 and vector)
- Its data remains intact in primary storage
Default Threshold¶
The global default is configured via:
Or per-profile via the DECAY VISIBILITY THRESHOLD directive inside an APPLY block:
CREATE DECAY PROFILE document_retention
FOR (n:Document)
APPLY {
DECAY PROFILE 'working_memory'
DECAY VISIBILITY THRESHOLD 0.05
}
Suppression vs Deletion¶
Suppression is not deletion:
| Aspect | Suppression | Deletion |
|---|---|---|
| Data preserved | Yes | No |
| Recoverable | Yes (boost score or use reveal()) | No |
| Storage used | Yes | Freed |
| Index entries | Removed by deindex cleanup | Removed immediately |
| Relationships | Preserved | Cascaded/orphaned |
Querying Suppressed Entities¶
Using reveal()¶
The reveal() Cypher function bypasses visibility suppression for a specific entity:
-- See a specific suppressed node
MATCH (n:Document {id: $id})
CALL reveal(n)
RETURN n, decayScore(n)
-- List all suppressed documents
MATCH (n:Document)
CALL reveal(n)
WHERE n.suppressed = true
RETURN n.id, decayScore(n), n.suppressed_at
ORDER BY decayScore(n)
reveal() is a query-time bypass — it does not change the entity's suppression status. The entity remains suppressed for all other queries.
Inspecting Suppression with Cypher¶
This returns the full scoring resolution, including the effective threshold, final score, suppression eligibility, and explanation of why the entity was suppressed.
Deindex Cleanup¶
Suppressed entities retain their primary data but their secondary index entries (BM25 full-text, vector embeddings) consume space unnecessarily. The deindex cleanup job runs periodically to remove these index entries.
How It Works¶
- When an entity is suppressed, a
DeindexWorkItemis enqueued - The background cleanup job scans for pending work items
- For each item, it removes the entity's entries from BM25 and vector indexes
- The primary node/edge data is untouched
Configuration¶
The deindex job runs every 24 hours by default. No configuration is required — it runs automatically when decay is enabled.
Monitoring¶
Check deindex status with the supported Cypher procedure:
Example result columns:
The browser UI also shows deindex status on the Security > Knowledge Policies > Deindex Status tab.
Restoring Suppressed Entities¶
To restore a suppressed entity, boost its score above the visibility threshold:
-- Reset decay by updating the entity (if scoreFrom is 'VERSION')
MATCH (n:Document {id: $id})
SET n.updated_at = datetime()
-- Or explicitly unsuppress
MATCH (n:Document {id: $id})
REMOVE n.suppressed, n.suppressed_at
After restoration, the entity's index entries will be rebuilt on the next search index rebuild:
CLI Commands¶
# Suppress nodes below threshold
nornicdb suppress --data-dir ./data --threshold 0.10
# View decay statistics
nornicdb decay stats --data-dir ./data
See Also¶
- Knowledge-Layer Policies — System overview
- Decay Profiles — Defining decay behavior
- Promotion Policies — Boosting scores to prevent suppression
- Ebbinghaus-Roynard Bootstrap — Complete working example with visibility thresholds and suppression
- CLI Commands — CLI reference