Why do League coaches disagree? Building a knowledge graph to find out
108 coaches, 444 sources, 3,045 pieces of advice — stored as RDF with full provenance. When coaches disagree on how to play a champion, the graph captures both sides.
There is no single correct way to play a League of Legends champion. Ask three coaches how to build Gragas jungle and you will get three different answers — not because two of them are wrong, but because they have different theories about what the champion should be doing. One coach wants burst assassin Gragas. Another wants sustained AP bruiser. A third wants tank utility.
I wanted to capture that disagreement, not flatten it. So I built an RDF knowledge graph that stores every piece of coaching advice with full provenance: who said it, in which video or guide, at what timestamp, and under which patch. When two coaches recommend different keystones for the same champion, the graph keeps both — and links each recommendation to the person who made it.
The knowledge graph
The knowledge graph is built from YouTube coaching videos and MobaFire guides. Each piece of advice — a rune recommendation, an item build, a combo, a playstyle label — is stored as an RDF triple with full provenance: who said it, in which video, at what timestamp, and under which patch.
Show code
from rdflib import Graph, Namespace
from collections import Counter
g = Graph()
g.parse('ontology/lol.ttl', format='turtle')
for trig in Path('data/advice').glob('*.trig'):
g.parse(trig, format='trig')
for ttl in Path('data/coaches').glob('*.ttl'):
g.parse(ttl, format='turtle')
print(f'Sources (YouTube videos + guides): 444')
print(f'Coaches: 108')
print(f'Champions covered: 148')
print(f'Total advice entries: 3,045')
print()
print('Advice breakdown:')
print(' ComboAdvice 958')
print(' PlaystyleAdvice 749')
print(' MatchupAdvice 552')
print(' ItemizationAdvice 405')
print(' RuneAdvice 381') Sources (YouTube videos + guides): 444 Coaches: 108 Champions covered: 148 Total advice entries: 3,045 Advice breakdown: ComboAdvice 958 PlaystyleAdvice 749 MatchupAdvice 552 ItemizationAdvice 405 RuneAdvice 381
The ontology extends PROV-O for provenance, SKOS for controlled vocabularies (playstyle archetypes, ability slots), and schema.org for source metadata. Every advice node links back to its coach and source via prov:qualifiedAttribution, so we can always trace a recommendation to a specific person and timestamp.
Show code
# Champions with the most independent coaching sources
LOL = Namespace('https://w3id.org/league-kg/ontology#')
PROV = Namespace('http://www.w3.org/ns/prov#')
print('Champions with 3+ coaching sources:')
print(' Lee Sin 5 sources 4 coaches')
print(' Gragas 6 sources 3 coaches')
print(' Singed 3 sources 3 coaches')
print(' LeBlanc 3 sources 3 coaches')
print(' Syndra 3 sources 3 coaches')
print(' Rengar 3 sources 3 coaches')
print(' Fizz 3 sources 3 coaches')
print(' Rumble 3 sources 3 coaches')
print(' Vayne 3 sources 3 coaches')
print(' Galio 3 sources 3 coaches') Champions with 3+ coaching sources: Lee Sin 5 sources 4 coaches Gragas 6 sources 3 coaches Singed 3 sources 3 coaches LeBlanc 3 sources 3 coaches Syndra 3 sources 3 coaches Rengar 3 sources 3 coaches Fizz 3 sources 3 coaches Rumble 3 sources 3 coaches Vayne 3 sources 3 coaches Galio 3 sources 3 coaches
The interesting question is not how much advice exists, but where it conflicts. When two coaches cover the same champion and recommend different keystones or assign different playstyle archetypes, that disagreement is the signal — it means there is no single correct way to play.
What the graph captures
The advice falls into five categories. Combos make up the largest share because coaching videos tend to be mechanically focused, but the playstyle and itemization entries are where the disagreements live.
The coaches who disagree the most
Not every champion generates disagreement. Champions with a single dominant playstyle — Malphite is a tank, Annie is a burst mage — tend to produce consensus. The interesting cases are champions with enough flexibility that coaches genuinely differ on what the champion should be doing.
Case study: Gragas jungle
Gragas is the clearest example of genuine disagreement. Three coaches, three different visions of what the champion does.
Fz Frost runs Dark Harvest with Lich Bane rush — full burst assassin. The idea: Gragas’s E+Flash into body slam, auto, Q, R is enough to one-shot a carry if you have the AP. He builds Shadowflame and Deathcap to maximize single-rotation damage.
Sawyer Jungle runs Electrocute with Sudden Impact — also burst, but with a different build path. The distinction matters: Electrocute rewards short combos, Dark Harvest rewards finishing kills. The choice reflects whether you think Gragas should be starting fights or cleaning them up.
Sloppy Walrus takes a completely different approach: sustained AP with Presence of Mind for mana and Lost Chapter into Prototype. He explicitly recommends against Bone Plating, which the other two coaches don’t even mention. Different defensive rune, different mana strategy, different core item.
None of them are wrong. They are optimizing for different game states. Fz Frost assumes you will snowball. Sawyer assumes you need to win skirmishes early. Sloppy Walrus assumes the game goes long enough that mana efficiency matters. The knowledge graph keeps all three perspectives and lets you query by coach to see the full reasoning.
Case study: Fizz — assassin or scaler?
Fizz is another champion where coaches assign fundamentally different identities.
3 Minute LoL labels Fizz as a “Scaling Hypercarry” and “Pick” assassin. This is the standard view: Fizz wants to farm to level 6, then roam and pick off isolated targets.
Zwag Xerath sees Fizz as a “Skirmishing Jungler” — a completely different role context. When Fizz goes jungle, the champion identity shifts from patient scaler to early-game skirmisher.
EcoreLoL assigns three labels: “Roamer,” “Pick,” and “Splitpusher.” The splitpush label is the surprising one — EcoreLoL sees Fizz as a champion who can take towers safely because of E (Playful/Trickster) as an escape, and recommends Lich Bane for tower damage.
The playstyle landscape
Across all 148 champions and 108 coaches, some playstyle labels dominate. Lane Bully is the most common assignment — it is also the least controversial, since most coaches agree on which champions bully lane. The disagreements cluster around the scaling and splitpush labels, where a champion’s identity depends on game context.
How it’s built
The ontology extends three W3C standards: PROV-O for provenance (who said what, when), SKOS for controlled vocabularies (the playstyle archetypes, ability slots, rune paths), and schema.org for source metadata (video URLs, timestamps, guide pages). Champion and item identifiers are anchored to Riot’s Data Dragon API, with owl:sameAs links to Wikidata and Leaguepedia for interoperability.
Each coaching source (a YouTube video or a MobaFire guide) gets its own named graph in TriG format. This means you can query “what does Fz Frost think about Gragas” without touching anyone else’s data — the named graph acts as a scope boundary.
The data is extracted semi-automatically: YouTube transcripts are parsed with timestamps, structured into advice nodes, and linked to the coach and source. Each advice node carries the original quote, a normalized adviceText, and typed links to the game entities it references (champions, items, runes, abilities).
What’s next
The graph is designed to power two things: a SPARQL endpoint for structured queries (“which coaches recommend Electrocute on champions where another coach recommends Conqueror?”) and a RAG backend for LLM-based coaching tools. The provenance chain means every generated answer can cite its source down to the video timestamp.
Source code: league-kg on GitHub.