CoolFace
Datasetpublic

brandburner/doctorwho-s20-narrative-kg

Doctor Who - Narrative Knowledge Graph A rich narrative knowledge graph extracted from Doctor Who screenplays using the Fabula pipeline. Contains characters, locations, objects, organizations, events, themes, and conflict arcs with full participation semantics and Graph Gravity importance tiers. Dataset Overview Metric Value Source database doctorwho.s20 Type Season database Episodes 23 Total nodes 4,601 Total edges 15,075 Schema version 1.2.0… See the full description on the dataset page: https://huggingface.co/datasets/brandburner/doctorwho-s20-narrative-kg.

sourceHugging Facecc-by-sa-4.0updated 2mo agoView on Hugging Face
0likes36downloads
Dataset Card

Doctor Who - Narrative Knowledge Graph

A rich narrative knowledge graph extracted from Doctor Who screenplays using the Fabula pipeline. Contains characters, locations, objects, organizations, events, themes, and conflict arcs with full participation semantics and Graph Gravity importance tiers.

Dataset Overview

MetricValue
Source databasedoctorwho.s20
TypeSeason database
Episodes23
Total nodes4,601
Total edges15,075
Schema version1.2.0
Exported2026-08-05

Entity Breakdown

TypeCount
Act62
Agent147
ConflictArc105
Episode23
Event944
Location199
Object467
Organization23
PlotBeat1,808
SceneBoundary739
Theme77
Writer7

Graph Gravity Tiers

TierCountDescription
anchor15Main characters / key locations
planet196Recurring entities
asteroid625Minor / one-off entities

Relationship Types

AFFILIATED_WITH, BELONGS_TO_EPISODE, CALLBACK, CAUSAL, CHARACTER_CONTINUITY, CONTAINS_ACT, CONTAINS_BEAT, CONTAINS_SCENE, CREDITED_ON, EMOTIONAL_ECHO, ESCALATION, EXEMPLIFIES_THEME, FORESHADOWING, INVOLVED_IN_ARC, INVOLVED_WITH, IN_EVENT, NARRATIVELY_FOLLOWS, OCCURS_IN, PARTICIPATED_AS, PART_OF ... and 7 more

Related Datasets

This is a single-season dataset containing entities and events as extracted from Season 20 screenplays.

Note: The megagraph is not a simple union of season datasets. Cross-season entities are reconciled through a Global Entity Registry (GER), receiving new canonical UUIDs and distilled descriptions. Graph Gravity tiers are recalculated across all episodes. Use individual season datasets for single-season analysis; use the megagraph for cross-season analysis.

Files

FileDescription
nodes.parquetAll graph nodes with properties
edges.parquetAll relationships with properties
positions.parquet3D layout coordinates for visualization
meta.jsonDataset metadata and entity counts

Schema

Nodes (nodes.parquet)

ColumnTypeDescription
node_idstringUnique node identifier (UUID)
primary_labelstringNode type (Agent, Location, Event, etc.)
namestringDisplay name
descriptionstringFoundational description
tierstring (nullable)Graph Gravity tier: anchor / planet / asteroid
episode_countint (nullable)Number of distinct episodes entity appears in
first_episode_seqint (nullable)First appearance episode
last_episode_seqint (nullable)Last appearance episode
properties_jsonstringFull node properties as JSON

Edges (edges.parquet)

ColumnTypeDescription
source_node_idstringSource node UUID
target_node_idstringTarget node UUID
relationship_typestringRelationship type (e.g., PARTICIPATED_AS)
properties_jsonstringEdge properties as JSON

Positions (positions.parquet)

ColumnTypeDescription
node_idstringNode UUID
x, y, zfloat3D coordinates
sizefloatNode size (Graph Gravity weighted)
r, g, bintRGB color by entity type
communityintLouvain community index (seeded, deterministic)
tierstring (nullable)Graph Gravity tier
Layout method (schema ≥ 1.2.0): Coordinates are derived from the entities' semantic text embeddings (UMAP with a fixed seed and PCA initialization), so narratively similar entities sit near each other. Non-embedded nodes (events, scenes, episodes, etc.) are placed at the weighted barycenter of their narrative neighbours. The layout is deterministic: re-exporting an unchanged graph reproduces identical coordinates, and lightly-changed graphs keep comparable layouts. Not comparable with positions published under schema ≤ 1.1.0, which used a non-deterministic node2vec structural embedding. See meta.json → positions for the exact method and coverage stats.

Usage

python
from datasets import load_dataset
import pandas as pd

# Load from HuggingFace
ds = load_dataset("brandburner/doctorwho-s20-narrative-kg")

# Or load parquet directly
nodes = pd.read_parquet("nodes.parquet")
edges = pd.read_parquet("edges.parquet")

# Filter to anchor characters
anchors = nodes[(nodes['primary_label'] == 'Agent') & (nodes['tier'] == 'anchor')]

# Build a NetworkX graph
import networkx as nx
G = nx.DiGraph()
for _, n in nodes.iterrows():
    G.add_node(n['node_id'], label=n['primary_label'], name=n['name'])
for _, e in edges.iterrows():
    G.add_edge(e['source_node_id'], e['target_node_id'], type=e['relationship_type'])

Citation

bibtex
@misc{fabula_doctorwho_s20,
  title = {Doctor Who Narrative Knowledge Graph},
  author = {Fabula Pipeline},
  year = {2026},
  publisher = {HuggingFace},
  howpublished = {\url{https://huggingface.co/datasets/brandburner/doctorwho-s20-narrative-kg}}
}

License

CC BY-SA 4.0