Building a Knowledge Graph from JIRA and Confluence
A hands-on guide to extracting structured knowledge from JIRA tickets and Confluence pages, connecting them into a queryable graph that powers intelligent search.
The Problem
Enterprise teams drown in unstructured information spread across JIRA tickets, Confluence pages, Slack threads, and Google Docs. Finding the right context for a decision made six months ago is almost impossible.
The Solution: A Knowledge Graph
A knowledge graph connects entities (people, projects, decisions, tickets) with typed relationships, making it possible to traverse connections and surface relevant context automatically.
Architecture Overview
Implementation
Step 1: Extract Data
Pull tickets and pages using the REST APIs. Normalize the data into a common schema:
from jira import JIRA
from atlassian import Confluence
def extract_jira_tickets(project_key: str) -> list[dict]:
jira = JIRA(server=JIRA_URL, token_auth=JIRA_TOKEN)
issues = jira.search_issues(f"project={project_key}", maxResults=1000)
return [normalize_issue(issue) for issue in issues]
Step 2: Build the Graph
Map entities to nodes and relationships to edges. Key relationship types:
ASSIGNED_TO— ticket to personBLOCKS/BLOCKED_BY— ticket dependenciesREFERENCES— confluence page to ticketDECIDED_IN— decision to meeting/page
Step 3: Query
With the graph in place, you can answer questions like:
- "What decisions were made about the auth migration?"
- "Who has context on the payment service refactor?"
- "What tickets are blocking the Q3 launch?"
Results
After indexing ~5,000 JIRA tickets and ~800 Confluence pages, search relevance improved dramatically compared to native JIRA/Confluence search. The graph structure allows multi-hop queries that traditional search simply can't handle.