> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cognee.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Entity Consolidation

> Rewrite fragmented entity descriptions using LLM analysis of graph neighborhoods

## When to use this

After ingestion, entity descriptions may be fragmented or repetitive because each description is derived from a single chunk. This pipeline rewrites each entity's description using the LLM and the entity's full neighborhood context, producing more coherent and complete descriptions.

**Before you start:**

* Complete [Quickstart](/getting-started/quickstart) to understand basic operations
* Ensure you have [LLM Providers](/setup-configuration/llm-providers) configured
* Have an existing knowledge graph with `Entity` nodes

## Code in Action

### Step 1: Clear Existing Data

Start from a clean state so the before-and-after visualizations only reflect this example run.

```python theme={null}
await cognee.forget(everything=True)
```

### Step 2: Build and Visualize the Graph

Create a focused graph with only people, cities, and `lives_in` relationships, then save a visualization of the graph before consolidation.

```python theme={null}
custom_prompt = """
Extract only people and cities as entities.
Connect people to cities with the relationship "lives_in".
Ignore all other entities.
"""

await cognee.remember(
    [
        "Alice moved to Paris in 2010, while Bob has always lived in New York.",
        "Andreas was born in Venice, but later settled in Lisbon.",
        "Diana and Tom were born and raised in Helsinki. Diana currently resides in Berlin, while Tom never moved.",
    ],
    custom_prompt=custom_prompt,
    self_improvement=False,
)
await visualize_graph(graph_visualization_path_before_enrichment)
```

### Step 3: Consolidate and Visualize Again

Run the consolidation pipeline to rewrite entity descriptions in place, then save a second visualization so you can compare the graph before and after enrichment.

```python theme={null}
await consolidate_entity_descriptions_pipeline()
await visualize_graph(graph_visualization_path_after_enrichment)
```

## What Changed in Your Graph

* Existing `Entity` node `description` fields are rewritten using LLM analysis of each entity's neighbors and edges.
* No new nodes are created. The pipeline updates descriptions in place.
* Descriptions become more coherent because the LLM sees each entity in the context of its graph neighborhood, not just the original chunk text.
* The before and after HTML files make it easy to inspect how the graph changed.

<Accordion title="Under the hood">
  Three tasks run in sequence:

  1. **`get_entities_with_neighborhood`** — loads all `Entity` nodes and fetches their edges and neighbor nodes.
  2. **`generate_consolidated_entities`** — sends each entity plus neighborhood to the LLM, which returns a refined description.
  3. **`add_data_points`** — writes the updated `Entity` objects back to the graph and vector DB.
</Accordion>

<Accordion title="Troubleshooting">
  * **No entities found** — the graph must already contain `Entity` nodes. Run `cognee.remember()` first.
  * **LLM errors** — verify that your LLM provider is configured. See [LLM Providers](/setup-configuration/llm-providers).
  * **Permission errors** — the user must have write access to the target dataset. See [Permissions](/core-concepts/multi-user-mode/permissions-system/datasets).
</Accordion>

## Full Example

<Accordion title="Latest guide">
  ```python theme={null}
  import asyncio
  import cognee

  from os import path
  from cognee.api.v1.visualize.visualize import visualize_graph
  from cognee.memify_pipelines.consolidate_entity_descriptions import (
      consolidate_entity_descriptions_pipeline,
  )

  custom_prompt = """
  Extract only people and cities as entities.
  Connect people to cities with the relationship "lives_in".
  Ignore all other entities.
  """

  graph_visualization_path_before_enrichment = path.join(
      path.dirname(__file__), ".artifacts", "before_consolidate_enrichment_entity_descriptions.html"
  )
  graph_visualization_path_after_enrichment = path.join(
      path.dirname(__file__), ".artifacts", "after_consolidate_enrichment_entity_descriptions.html"
  )


  async def main():
      # Prune data and system metadata before running, only if we want "fresh" state.
      await cognee.forget(everything=True)
      await cognee.remember(
          [
              "Alice moved to Paris in 2010, while Bob has always lived in New York.",
              "Andreas was born in Venice, but later settled in Lisbon.",
              "Diana and Tom were born and raised in Helsinki. Diana currently resides in Berlin, while Tom never moved.",
          ],
          custom_prompt=custom_prompt,
          self_improvement=False,
      )

      await visualize_graph(graph_visualization_path_before_enrichment)

      await consolidate_entity_descriptions_pipeline()

      await visualize_graph(graph_visualization_path_after_enrichment)


  if __name__ == "__main__":
      asyncio.run(main())
  ```
</Accordion>

<Accordion title="Legacy guide">
  ```python theme={null}
  import asyncio
  import cognee
  from cognee.memify_pipelines.consolidate_entity_descriptions import (
      consolidate_entity_descriptions_pipeline,
  )

  async def main():
      await cognee.prune.prune_data()
      await cognee.prune.prune_system(metadata=True)
      await cognee.add(
          [
              "Alice moved to Paris in 2010, while Bob has always lived in New York.",
              "Andreas was born in Venice, but later settled in Lisbon.",
              "Diana and Tom were born and raised in Helsinki. Diana currently resides in Berlin, while Tom never moved.",
          ]
      )
      await cognee.cognify()

      await consolidate_entity_descriptions_pipeline()

  if __name__ == "__main__":
      asyncio.run(main())
  ```
</Accordion>

<Columns cols={3}>
  <Card title="Memify Concept" icon="sparkles" href="/core-concepts/main-operations/legacy-operations/memify">
    Understand how memify pipelines work
  </Card>

  <Card title="Memify Quickstart" icon="brain" href="/guides/memify-quickstart">
    Run the default coding-rules pipeline
  </Card>

  <Card title="Search" icon="search" href="/core-concepts/main-operations/legacy-operations/search">
    Query the enriched graph with specialized search types
  </Card>
</Columns>
