agentleFS
OpenLinkSoftwareOpenLinkSoftware/ai-agent-skills/world-cup-2026-navigator/SKILL.md

world-cup-2026-navigator

Skill42 starsChanged 50 days agoMITView on GitHub

Expert navigator for the OpenLink FIFA World Cup Knowledge Graph and RDF ontology (https://www.openlinksw.com/ontology/fifa#). Use this skill whenever an agent needs to write SPARQL queries against FIFA World Cup knowledge graph data, look up correct property URIs, understand class hierarchies, interpret numeric coded values (card types, match periods, event types, positions, tactics), design query patterns for matches, players, teams, goals, bookings, substitutions, lineups, weather, rankings, analytics metrics, match officials, referees, country/nationality data, FIFA power rankings, win probability, expected goals (xG), pitch control, goalkeeper saves, or the power rankings named graph (urn:fifa:powerrankings). Trigger this skill for ANY FIFA ontology or KG query-writing task, even if the user just says "write a SPARQL for FIFA data", "how do I query goals/players/match events", "show me analytics for a team", "compare player distances run", "possession stats", "pressing intensity", "query match analytics reports", "who refereed a match", "list officials by role", "find players by country", "FIFA world rankings", "power rankings", "win probability", "xG", "expected goals", "pitch control", "goalkeeper stats", or "query urn:fifa:powerrankings".

The file

We split this skill into the rules it gives an agent

7 rules. About 0 are common, 2 are distinctive, and 5 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Always declare these prefixes at the top of every SPARQL query:

    line 28
  2. Very specific:

    When writing SPARQL, always specify the graph with FROM <graph-iri> or GRAPH <graph-iri> { } unless you want to query all graphs (which can …

    line 69
  3. Distinctive:

    Use this endpoint for all queries against the FIFA World Cup Knowledge Graph unless the user specifies otherwise.

    line 77
  4. Very specific:

    All have domain fifa:MatchAnalyticsReport, range xsd:decimal.

    line 310
  5. Very specific:

    Match-centric traversal: Start from ?match a fifa:Match and follow fifa:has* outward.

    line 1186
  6. Very specific:

    Aggregate queries: Always include the URI in GROUP BY alongside the label.

    line 1187
  7. Very specific:

    Read these only when you need exhaustive detail beyond what the SKILL.md tables cover.

    line 1211

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

World Cup Knowledge Graph Navigator

Namespace Prefixes

Always declare these prefixes at the top of every SPARQL query:

PREFIX fifa:      <https://www.openlinksw.com/ontology/fifa#>
PREFIX position:  <https://fifa.com/position#>
PREFIX positionSide: <https://fifa.com/positionSide#>
PREFIX rdfs:      <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd:       <http://www.w3.org/2001/XMLSchema#>

For ontology metadata queries also declare:

PREFIX dc:     <http://purl.org/dc/elements/1.1/>
PREFIX cc:     <http://creativecommons.org/ns#>
PREFIX owl:    <http://www.w3.org/2002/07/owl#>
PREFIX prov:   <http://www.w3.org/ns/prov#>

Full namespace URIs (for reference):

PrefixFull URIUsed for
fifa:https://www.openlinksw.com/ontology/fifa#All classes, most properties
position:https://fifa.com/position#Position instances (0=GK, 1=DEF, 2=MID, 3=FWD)
positionSide:https://fifa.com/positionSide#Position side instances (1=right, 2=center, 3=left)
dc:http://purl.org/dc/elements/1.1/Ontology metadata (creator)
cc:http://creativecommons.org/ns#Ontology license (CC-BY-SA 3.0)
prov:http://www.w3.org/ns/prov#PROV-O (prov:wasDerivedFrom)

Named Graphs

GraphContents
urn:worldcup:kg:2026Main graph: competition, season, stage, group, team, player, squad, match, stadium, coach, staff, officials, lineup, goals, bookings, substitutions, timeline events, head-to-head analysis
urn:worldcup:kg:2026:analyticsTemporal snapshots: fifa:TeamMatchAnalyticsReport, fifa:PlayerMatchAnalyticsReport, fifa:PlayerPowerRanking. Each call appends a timestamped report.
urn:worldcup:kg:past-matchesHistorical matches from the H2H API not in the 2026 season graph. Same fifa:Match structure as the main graph.
urn:fifa:powerrankingsTemporal snapshots of the FIFA/Coca-Cola world ranking (fifa:PowerRanking), one per team. Also holds fifa:Confederation, fifa:Gender, and team stub nodes. Self-contained graph.

When writing SPARQL, always specify the graph with FROM <graph-iri> or GRAPH <graph-iri> { } unless you want to query all graphs (which can cause duplicates if the same match IRI appears in both the main and analytics graphs).


SPARQL Endpoint

Default endpoint: https://demo.openlinksw.com/sparql

Use this endpoint for all queries against the FIFA World Cup Knowledge Graph unless the user specifies otherwise.

Example curl:

curl -s -G "https://demo.openlinksw.com/sparql" \
  -H "Accept: application/sparql-results+json" \
  --data-urlencode "query=<SPARQL_QUERY>"

Example SPASQL via execute_spasql_query:

sql: SPARQL <SPARQL_QUERY>

Set the default-graph-uri parameter to a named graph IRI when needed.


Ontology Metadata

<https://www.openlinksw.com/ontology/fifa#> rdf:type owl:Ontology ;
    rdfs:label "FIFA World Cup Ontology" ;
    dc:creator <https://github.com/danielhmills/#this> ;
    cc:license <https://creativecommons.org/licenses/by-sa/3.0/> .

License: CC-BY-SA 3.0.


Class Reference

ClassURINotes
Competitionfifa:Competitione.g. FIFA World Cup
Seasonfifa:SeasonA season/edition of a competition (e.g. 2022 World Cup)
Stagefifa:StageGroup stage, Round of 16, Final, etc.
Groupfifa:GroupGroups A–H within a stage
Matchfifa:MatchCentral hub — connects everything
Teamfifa:TeamNational teams
Playerfifa:PlayerIndividual players
Stadiumfifa:StadiumVenue
Cityfifa:CityHost city
Goalfifa:GoalA goal event; subclass of fifa:MatchEvent
Bookingfifa:BookingYellow/red card event
Substitutionfifa:SubstitutionPlayer swap event
GoalTypefifa:GoalTypeControlled vocabulary for goal types (penalty, regular, own)
CardTypefifa:CardTypeControlled vocabulary for card types
MatchPeriodfifa:MatchPeriodControlled vocabulary for match periods
PlayerMatchAppearancefifa:PlayerMatchAppearanceLineup slot for a player in a match
MatchEventfifa:MatchEventAbstract base class for all timeline events
Foulfifa:FoulSubclass of MatchEvent — fouls and disciplinary events
SetPiecefifa:SetPieceSubclass of MatchEvent — free kicks, corners, throw-ins
EventQualifierfifa:EventQualifierSupplementary annotation attached to a match event — spatial coordinates, jersey numbers, injured-player refs, cross-event links
Coachfifa:CoachTeam coach
CoachRolefifa:CoachRoleCoded role held by a coach (Head Coach, Assistant Coach)
Stafffifa:StaffNon-playing technical/support staff member — can appear on fifa:Booking
StaffRolefifa:StaffRoleCoded role held by a staff member
CoachAssignmentfifa:CoachAssignmentCoach ↔ Match link
StaffAssignmentfifa:StaffAssignmentStaff ↔ Match link
Officialfifa:OfficialA match official (referee, assistant, etc.)
OfficialAssignmentfifa:OfficialAssignmentOfficial ↔ Match assignment record
OfficialTypefifa:OfficialTypeNamed class for role taxonomy (Referee, VAR, etc.)
Countryfifa:CountryCountry/football association — nationality of teams, players, officials
Tacticfifa:TacticFormation (e.g. 4-3-3)
Weatherfifa:WeatherMatch weather data
BallPossessionfifa:BallPossessionPossession % per match
WorldRankingfifa:WorldRankingTeam ranking snapshot at a point in time
PowerRankingfifa:PowerRankingTimestamped FIFA/Coca-Cola world ranking snapshot per team. Lives in urn:fifa:powerrankings.
SquadMembershipfifa:SquadMembershipTeam ↔ Player during a specific season
TeamMembershipfifa:TeamMembershipPlayer ↔ Team with temporal bounds
MatchAnalyticsReportfifa:MatchAnalyticsReportAbstract base for analytics reports
TeamMatchAnalyticsReportfifa:TeamMatchAnalyticsReportPer-team analytics report for a match (urn:worldcup:kg:2026:analytics)
PlayerMatchAnalyticsReportfifa:PlayerMatchAnalyticsReportPer-player analytics report for a match (urn:worldcup:kg:2026:analytics)
PlayerPowerRankingfifa:PlayerPowerRankingTimestamped player in-match performance ranking snapshot (urn:worldcup:kg:2026:analytics)
HeadToHeadAnalysisfifa:HeadToHeadAnalysisH2H stats between two teams for a match
Organizationfifa:OrganizationGoverning/organizational body
Confederationfifa:ConfederationContinental confederation (UEFA, CONMEBOL, etc.); subClassOf fifa:Organization
Genderfifa:GenderGender category (instances: fifa:Male, fifa:Female)
AnalyticsMetricPropertyfifa:AnalyticsMetricPropertyMeta-class tagging all analytics datatype properties

The Match Node — Query Hub

fifa:Match is the central node. Nearly all interesting data hangs off it:

fifa:Match
  ├── fifa:homeTeam / fifa:awayTeam              → fifa:Team
  ├── fifa:homeTeamScore / fifa:awayTeamScore    → xsd:integer
  ├── fifa:winner                                → fifa:Team
  ├── fifa:date / fifa:localDate                 → xsd:dateTime
  ├── fifa:attendance                            → xsd:integer
  ├── fifa:stadium                               → fifa:Stadium
  ├── fifa:stage                                 → fifa:Stage
  ├── fifa:season                                → fifa:Season
  ├── fifa:competition                           → fifa:Competition
  ├── fifa:group                                 → fifa:Group
  ├── fifa:homeTeamTactics / fifa:awayTeamTactics → fifa:Tactic
  ├── fifa:weather                               → fifa:Weather
  ├── fifa:ballPossession                        → fifa:BallPossession
  ├── fifa:hasGoal                               → fifa:Goal
  ├── fifa:hasBooking                            → fifa:Booking
  ├── fifa:hasSubstitution                       → fifa:Substitution
  ├── fifa:hasPlayerAppearance                   → fifa:PlayerMatchAppearance
  ├── fifa:hasCoach                              → fifa:CoachAssignment
  ├── fifa:hasStaffAssignment                    → fifa:StaffAssignment
  ├── fifa:hasOfficial                           → fifa:Official  (direct person node)
  ├── fifa:hasOfficialAssignment                 → fifa:OfficialAssignment
  ├── fifa:hasHeadToHeadAnalysis                 → fifa:HeadToHeadAnalysis
  ├── fifa:hasNewsArticle                        → schema:NewsArticle (FIFA Plus articles)
  ├── fifa:hasEvent                              → fifa:MatchEvent
  │                                                  ├── fifa:hasQualifier → fifa:EventQualifier
  │                                                  ├── fifa:Goal      (subclass)
  │                                                  ├── fifa:Foul      (subclass)
  │                                                  └── fifa:SetPiece  (subclass)
  ├── fifa:hasTeamAnalyticsReport                → fifa:TeamMatchAnalyticsReport
  └── fifa:hasPlayerAnalyticsReport              → fifa:PlayerMatchAnalyticsReport

Inferred match probability properties (derived via SPIN rules in wc2026_power_ranking_inference.sql):

PropertyDescription
fifa:homeTeamWinProbabilityByFifaRankHome-team win probability (0–100 %) via Elo logistic: 1/(1+10^((awayPts-homePts)/600))
fifa:awayTeamWinProbabilityByFifaRankAway-team win probability: 1/(1+10^((homePts-awayPts)/600))
fifa:homeTeamLossProbabilityByFifaRankHome-team loss probability = away win probability
fifa:awayTeamLossProbabilityByFifaRankAway-team loss probability = home win probability

PowerRanking — FIFA/Coca-Cola World Rankings

Named Graph

All fifa:PowerRanking data lives in urn:fifa:powerrankings. The graph is self-contained and also holds fifa:Confederation, fifa:Gender, and team stub nodes.

IRI Pattern

http://demo.openlinksw.com/fifa-kg#powerranking-{teamId}-{genTs}

{genTs} = ingestion timestamp (yyyymmddTHHMMSS).

PowerRanking Properties

PropertyTypeRangeNotes
fifa:hasTeamObjectfifa:TeamThe team described
fifa:hasConfederationObjectfifa:ConfederationThe team's confederation
fifa:genderObjectfifa:Genderfifa:Male or fifa:Female
fifa:rankDatatypexsd:integerRanking position in this snapshot
fifa:prevRankDatatypexsd:integerPrevious ranking position
fifa:rankingMovementDatatypexsd:integerNet change (positive = moved up)
fifa:ratedMatchesDatatypexsd:integerMatches counted towards ranking
fifa:totalPointsDatatypexsd:decimalRanking points total
fifa:prevPointsDatatypexsd:decimalPrevious ranking points
fifa:generatedAtDatatypexsd:dateTimeIngestion timestamp

A new snapshot is recorded only when a team's rated-match count or rank changes — to avoid redundant data. Use MAX(fifa:generatedAt) to retrieve the latest snapshot for each team.

PowerRanking Query Pattern

PREFIX fifa: <https://www.openlinksw.com/ontology/fifa#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?team ?teamName ?confederation ?rank ?rankingMovement ?totalPoints ?generatedAt
WHERE {
  GRAPH <urn:fifa:powerrankings> {
    ?snapshot a fifa:PowerRanking ;
              fifa:hasTeam ?team ;
              fifa:hasConfederation ?confederation ;
              fifa:rank ?rank ;
              fifa:rankingMovement ?rankingMovement ;
              fifa:totalPoints ?totalPoints ;
              fifa:generatedAt ?generatedAt .
    ?team rdfs:label ?teamName .
    # Restrict to latest snapshot per team
    {
      SELECT ?team (MAX(?gen) AS ?generatedAt)
      WHERE {
        GRAPH <urn:fifa:powerrankings> {
          ?r a fifa:PowerRanking ; fifa:hasTeam ?team ; fifa:generatedAt ?gen .
        }
      }
      GROUP BY ?team
    }
  }
}
ORDER BY ?rank
LIMIT 50

Analytics Reports

Class Hierarchy

fifa:MatchAnalyticsReport  (abstract base)
  ├── fifa:TeamMatchAnalyticsReport    — one report per team per match
  └── fifa:PlayerMatchAnalyticsReport  — one report per player per match

Both live in urn:worldcup:kg:2026:analytics. Both share the same pool of fifa:AnalyticsMetricProperty datatype properties (all xsd:decimal). Each report carries fifa:generatedAt (xsd:dateTime) for temporal versioning.

Accessing Analytics Reports

# Team-level analytics (from analytics graph)
?match fifa:hasTeamAnalyticsReport ?report .
?report fifa:match ?match ; fifa:team ?team ; fifa:generatedAt ?generatedAt .

# Player-level analytics
?match fifa:hasPlayerAnalyticsReport ?report .
?report fifa:match ?match ; fifa:player ?player ; fifa:generatedAt ?generatedAt .

Discovering Available Metrics

SELECT ?prop ?label WHERE {
  ?prop rdf:type fifa:AnalyticsMetricProperty ;
        rdfs:label ?label .
}
ORDER BY ?label

Analytics Metric Properties

All have domain fifa:MatchAnalyticsReport, range xsd:decimal. Use OPTIONAL for every metric — not all reports populate every field.

Shooting & Goals

PropertyDescription
fifa:goalsGoals scored
fifa:goalsConcededGoals conceded
fifa:goalsConcededFromAttemptAtGoalAgainstGoals conceded from opponent shots
fifa:goalsFromDirectFreeKicksGoals from direct free kicks
fifa:goalsInsideThePenaltyAreaGoals scored inside the box
fifa:goalsOutsideThePenaltyAreaGoals scored outside the box
fifa:ownGoalsOwn goals
fifa:xGExpected goals — probability-weighted sum of chances
fifa:attemptAtGoalTotal attempts at goal
fifa:attemptAtGoalAgainstOpponent attempts at goal
fifa:attemptAtGoalAgainstOnTargetOpponent attempts on target
fifa:attemptAtGoalBlockedAttempts blocked
fifa:attemptAtGoalOnTargetAttempts on target
fifa:attemptAtGoalOffTargetAttempts off target
fifa:attemptAtGoalFromFreeKicksAttempts from free kicks
fifa:attemptAtGoalInsideThePenaltyAreaAttempts from inside the box
fifa:attemptAtGoalInsideThePenaltyAreaOnTargetAttempts from inside box on target
fifa:attemptAtGoalOutsideThePenaltyAreaAttempts from outside the box
fifa:attemptAtGoalOutsideThePenaltyAreaOnTargetAttempts from outside box on target
fifa:headedAttemptAtGoalHeaded attempts
fifa:penaltiesPenalties awarded
fifa:penaltiesScoredPenalties scored
fifa:attemptAtGoalFromBallProgressionAttempts from ball progressions
fifa:attemptAtGoalFromCornerAttempts from corners
fifa:attemptAtGoalFromCrossAttempts from crosses
fifa:attemptAtGoalFromPassAttempts from passes
fifa:attemptAtGoalFromPenaltyAttempts taken as penalty kicks
fifa:attemptAtGoalFromReboundAttempts from rebounds
fifa:attemptAtGoalFromOtherAttempts from other / uncategorised

Passing & Ball Control

PropertyDescription
fifa:passesTotal passes attempted
fifa:passesCompletedPasses completed
fifa:possessionBall possession %
fifa:crossesCrosses attempted
fifa:crossesCompletedCrosses completed
fifa:assistsAssists
fifa:attemptedBallProgressionsBall progressions attempted
fifa:completedBallProgressionsBall progressions completed
fifa:attemptedSwitchesOfPlaySwitches of play attempted
fifa:completedSwitchesOfPlaySwitches of play completed
fifa:distributionsUnderPressureDistributions under pressure
fifa:distributionsCompletedUnderPressureDistributions completed under pressure
fifa:takeOnsCompletedTake-ons (dribbles) completed
fifa:numberOfInvolvementsTouches/actions in possession sequences
fifa:numberOfPossessionSequencesTotal distinct possession sequences
fifa:numberOfShotEndingSequencesPossession sequences ending with a shot
fifa:ballRecoveryTimeAvg time to recover ball after losing possession

Threat & Pitch Control

PropertyDescription
fifa:threatFIFA Expected Threat (xT) — value of on-ball actions moving toward goal
fifa:pitchControlOverall share of pitch controlled (by player positions/reachability)
fifa:finalThirdPitchControlPitch control share in the attacking final third

Defensive

PropertyDescription
fifa:defensivePressuresAppliedDefensive pressures applied
fifa:directDefensivePressuresAppliedDirect defensive pressures
fifa:forcedTurnoversTurnovers forced
fifa:foulsForFouls won
fifa:foulsAgainstFouls committed
fifa:yellowCardsYellow cards (analytics count)
fifa:redCardsRed cards (analytics count)
fifa:directRedCardsStraight red cards (not from second caution)
fifa:indirectRedCardsRed cards from second yellow card
fifa:offsidesOffsides
fifa:goalkeeperDefensiveActionsInsidePenaltyAreaGK actions inside box
fifa:goalkeeperDefensiveActionsOutsidePenaltyAreaGK actions outside box
fifa:goalkeeperGoalPreventionsGK goal preventions
fifa:goalkeeperSavesTotal saves made by the goalkeeper
fifa:goalkeeperSavesOnTargetSaves against on-target attempts
fifa:goalkeeperSavePercentage% of on-target attempts saved
fifa:cleanSheetsMatches completed without conceding

Set Pieces

PropertyDescription
fifa:cornersCorners
fifa:freeKicksFree kicks
fifa:directFreeKicksDirect free kicks
fifa:indirectFreeKicksIndirect free kicks
fifa:goalKicksGoal kicks
fifa:throwInsThrow-ins

Linebreaks & Progressions

PropertyDescription
fifa:linebreaksAttemptedLinebreaks attempted
fifa:linebreaksAttemptedCompletedLinebreaks completed
fifa:linebreaksAttemptedAllLinesLinebreaks attempted across all lines
fifa:linebreaksCompletedAllLinesLinebreaks completed across all lines
fifa:linebreaksAttemptedAttackingLinevs. attacking line (combined)
fifa:linebreaksAttemptedAttackingLineCompletedvs. attacking line completed (combined)
fifa:linebreaksAttemptedAttackingLineOnlyvs. attacking line only
fifa:linebreaksAttemptedAttackingLineCompletedOnlyvs. attacking line only, completed
fifa:linebreaksAttemptedMidfieldLinevs. midfield line (combined)
fifa:linebreaksAttemptedMidfieldLineCompletedvs. midfield line completed (combined)
fifa:linebreaksAttemptedMidfieldLineOnlyvs. midfield line only
fifa:linebreaksAttemptedMidfieldLineCompletedOnlyvs. midfield line only, completed
fifa:linebreaksAttemptedDefensiveLinevs. defensive line (combined)
fifa:linebreaksAttemptedDefensiveLineCompletedvs. defensive line completed (combined)
fifa:linebreaksAttemptedDefensiveLineOnlyvs. defensive line only
fifa:linebreaksAttemptedDefensiveLineCompletedOnlyvs. defensive line only, completed
fifa:linebreaksAttemptedAttackingAndMidfieldLinevs. attacking + midfield lines
fifa:linebreaksCompletedAttackingAndMidfieldLinevs. attacking + midfield completed
fifa:linebreaksAttemptedMidfieldAndDefensiveLinevs. midfield + defensive lines
fifa:linebreaksCompletedMidfieldAndDefensiveLinevs. midfield + defensive completed
fifa:linebreaksAttemptedUnderPressureLinebreaks under pressure
fifa:linebreaksCompletedUnderPressureLinebreaks under pressure completed

Receptions & Offers to Receive

PropertyDescription
fifa:receivedOffersToReceiveOffers to receive acted upon
fifa:offersToReceiveTotalTotal offers to receive
fifa:offersToReceiveInBehindOffers to receive in behind
fifa:offersToReceiveInBetweenOffers to receive in between lines
fifa:offersToReceiveInFrontOffers to receive in front
fifa:offersToReceiveInsideOffers to receive inside
fifa:offersToReceiveOutsideOffers to receive outside
fifa:receptionsInBehindReceptions in behind
fifa:receptionsBetweenMidfieldAndDefensiveLineReceptions between midfield and defensive line
fifa:receptionsUnderPressureReceptions under pressure
fifa:receptionsUnderDirectPressureReceptions under direct pressure
fifa:receptionsUnderIndirectPressureReceptions under indirect pressure
fifa:receptionsUnderNoPressureReceptions under no pressure

Final Third Entries

PropertyDescription
fifa:finalThirdEntriesReceptionCentralChannelFinal third entries via central channel
fifa:finalThirdEntriesReceptionInsideLeftChannelFinal third entries inside left channel
fifa:finalThirdEntriesReceptionInsideRightChannelFinal third entries inside right channel
fifa:finalThirdEntriesReceptionLeftChannelFinal third entries left channel
fifa:finalThirdEntriesReceptionRightChannelFinal third entries right channel

Tactical Phase Aggregates

PropertyDescription
fifa:phaseAggregateAttackingTransitionAttacking transition phase
fifa:phaseAggregateDefensiveTransitionDefensive transition phase
fifa:phaseAggregateBuildUpOpposedBuild-up play (opposed)
fifa:phaseAggregateBuildUpUnopposedBuild-up play (unopposed)
fifa:phaseAggregateCounterPressCounter-press phase
fifa:phaseAggregateCounterattackCounterattack phase
fifa:phaseAggregateFinalThirdFinal third phase
fifa:phaseAggregateHighBlockHigh defensive block phase
fifa:phaseAggregateHighPressHigh press phase
fifa:phaseAggregateMidBlockMid block phase
fifa:phaseAggregateMidPressMid press phase
fifa:phaseAggregateLowBlockLow block phase
fifa:phaseAggregateLowPressLow press phase
fifa:phaseAggregateLongBallLong ball phase
fifa:phaseAggregateProgressionProgression phase
fifa:phaseAggregateRecoveryRecovery phase
fifa:phaseAggregateSetPiecesSet pieces phase

Physical / Movement (Player-level)

PropertyDescription
fifa:totalDistanceTotal distance covered
fifa:distanceWalkingDistance walking
fifa:distanceJoggingDistance jogging
fifa:distanceLowSpeedSprintingDistance at low-speed sprint
fifa:distanceHighSpeedRunningDistance at high-speed running
fifa:distanceHighSpeedSprintingDistance at high-speed sprint
fifa:avgSpeedAverage speed
fifa:topSpeedTop speed
fifa:sprintsNumber of sprints
fifa:speedRunsNumber of speed runs
fifa:timePlayedMinutes played
fifa:substitutionsInTimes substituted on
fifa:substitutionsOutTimes substituted off

Aggregate / Multi-match

PropertyDescription
fifa:matchesPlayedNumber of matches the report aggregates

Coded Value Reference

Critical: Many properties use instance URIs, not raw integers.

Card Types (fifa:bookingCard)

Instance URILabel
fifa:CardType-1Yellow Card
fifa:CardType-2Second Yellow Card
fifa:CardType-3Straight Red Card

Goal Types (fifa:goalType)

Instance URILabel
fifa:GoalType-1Penalty Goal
fifa:GoalType-2Regular Goal
fifa:GoalType-3Own Goal

Match Periods

Instance URILabel
fifa:MatchPeriod-0Pre-Match
fifa:MatchPeriod-3First Half
fifa:MatchPeriod-4Half-Time
fifa:MatchPeriod-5Second Half
fifa:MatchPeriod-7Extra Time First Half
fifa:MatchPeriod-8Extra Time Half-Time
fifa:MatchPeriod-9Extra Time Second Half
fifa:MatchPeriod-10Full Time
fifa:MatchPeriod-11Penalty Kicks

Gender Instances

Instance URILabel
fifa:MaleMale
fifa:FemaleFemale

Positions (fifa:position, fifa:realPosition)

Two sets of position instances exist in the ontology, both typed as a fifa:Position:

Instance URINamespaceLabelUsed by
position:0 / fifa:Position-0position: / fifa:Goalkeepersquad loader / JSON match loader
position:1 / fifa:Position-1position: / fifa:Defendersquad loader / JSON match loader
position:2 / fifa:Position-2position: / fifa:Midfieldersquad loader / JSON match loader
position:3 / fifa:Position-3position: / fifa:Forwardsquad loader / JSON match loader

Position IRI in practice: The JSON match loader emits fifa:Position-N IRIs for fifa:PlayerMatchAppearance nodes. The squad loader emits position:N IRIs on fifa:Player bio nodes. When querying lineups use fifa:Position-N; when querying player bio use position:N. To cover both, use UNION or VALUES ?pos { position:3 fifa:Position-3 }.

Position Sides (fifa:realPositionSide, fifa:positionSide)

positionSide: namespace (squad loader bio data, https://fifa.com/positionSide#):

Instance URILabel
positionSide:1right side
positionSide:2center
positionSide:3left side

fifa: namespace (JSON match loader lineup data):

Instance URILabel
fifa:PositionSide-1right side
fifa:PositionSide-2center
fifa:PositionSide-3Unknown (side not determined)

fifa:PositionSide-3 is "Unknown" (side not determined), whereas positionSide:3 is the canonical "left side" individual.

Tactics

Instance URILabel
fifa:Tactic-4-3-34-3-3
fifa:Tactic-4-4-24-4-2
fifa:Tactic-4-5-14-5-1
fifa:Tactic-3-5-23-5-2
fifa:Tactic-3-4-33-4-3
fifa:Tactic-3-6-13-6-1
fifa:Tactic-5-3-25-3-2
fifa:Tactic-5-4-15-4-1

Official Type Instances

Instance URILabel
fifa:OfficialType-1Referee
fifa:OfficialType-2Assistant Referee 1
fifa:OfficialType-3Assistant Referee 2
fifa:OfficialType-4Fourth official
fifa:OfficialType-5Video Assistant Referee (VAR)
fifa:OfficialType-6Reserve referee
fifa:OfficialType-8Assistant VAR
fifa:OfficialType-9Support VAR

Coach Role Instances

Instance URILabel
fifa:CoachRole-0Head Coach
fifa:CoachRole-1Assistant Coach

Event Types (subclasses of fifa:MatchEvent via rdf:type)

OWL equivalentClass notes: fifa:EventType-0 ≡ fifa:Goal, fifa:EventType-2 ≡ fifa:Booking, fifa:EventType-5 ≡ fifa:Substitution. The preferred classes are fifa:Goal, fifa:Booking, fifa:Substitution — use those rather than the coded EventType equivalents.

Subclass hierarchy:

fifa:MatchEvent
  ├── fifa:Goal      (preferred — equiv: EventType-0)
  │     ├── fifa:EventType-34  (Own goal)
  │     ├── fifa:EventType-39  (Free Kick goal)
  │     └── fifa:EventType-41  (Penalty Goal)
  ├── fifa:Booking   (preferred — equiv: EventType-2)
  │     ├── fifa:EventType-3   (Red card)
  │     └── fifa:EventType-4   (Second Caution - Red Card)
  ├── fifa:Foul
  │     └── fifa:EventType-18  (Foul)
  ├── fifa:SetPiece
  │     ├── fifa:EventType-14  (Free Kick)
  │     ├── fifa:EventType-16  (Corner)
  │     └── fifa:EventType-24  (Throw In)
  ├── fifa:Substitution (preferred — equiv: EventType-5)
  ├── fifa:EventType-1   (Assist)
  ├── fifa:EventType-6   (Penalty Awarded)
  ├── fifa:EventType-7   (Start Time)
  ├── fifa:EventType-8   (End Time)
  ├── fifa:EventType-9   (Pause Time)
  ├── fifa:EventType-10  (Resume Time)
  ├── fifa:EventType-12  (Attempt at Goal)
  ├── fifa:EventType-15  (Offside)
  ├── fifa:EventType-17  (Goal Prevention)
  ├── fifa:EventType-19  (Coin Toss)
  ├── fifa:EventType-23  (Dropped Ball)
  ├── fifa:EventType-25  (Clearance)
  ├── fifa:EventType-26  (Match end)
  ├── fifa:EventType-27  (Aerial Duel)
  ├── fifa:EventType-33  (Attempt Missed)
  ├── fifa:EventType-49  (Attempt Missed)
  ├── fifa:EventType-51  (Penalty missed)
  ├── fifa:EventType-57  (Goal Prevention)
  ├── fifa:EventType-60  (Penalty missed)
  ├── fifa:EventType-65  (Penalty missed)
  ├── fifa:EventType-71  (VAR)
  └── fifa:EventType-72  (Penalty Conceded!)

Use intermediate classes for category-level queries:

?event a fifa:Foul .     # all foul-related events
?event a fifa:Goal .     # all goal events
?event a fifa:SetPiece . # all set pieces
?event a fifa:EventType-18 . # foul only, not cards

WRONG — there is no fifa:eventType datatype property:

# ?event fifa:eventType 18 .   ← DO NOT USE

Spatial Properties on fifa:MatchEvent

PropertyRangeDescription
fifa:positionXxsd:decimalX coordinate of event on the field
fifa:positionYxsd:decimalY coordinate of event on the field
fifa:goalGatePositionXxsd:decimalX coordinate of ball position at goal gate
fifa:goalGatePositionYxsd:decimalY coordinate of ball at the goal line
fifa:goalGatePositionZxsd:decimalZ coordinate (height) of ball at the goal line

Other fifa:MatchEvent Properties

PropertyRangeDescription
fifa:typeLabelxsd:stringLocalised human-readable label for the event type
fifa:hasStoppageTimexsd:integerStoppage time minutes added at end of period
fifa:eventMatchMinutexsd:stringMatch minute string (e.g. "90'+7'")
fifa:eventTimestampxsd:dateTimeTimestamp at which the event occurred
fifa:eventHomeGoalsxsd:integerHome-team goal tally at time of event
fifa:eventAwayGoalsxsd:integerAway-team goal tally at time of event

VAR Properties on fifa:MatchEvent

These appear on fifa:EventType-71 (VAR) events:

PropertyRangeDescription
fifa:varIncidentxsd:integerVAR incident type code
fifa:varReasonxsd:integerReason for VAR review
fifa:varStatusxsd:integerStatus of VAR review
fifa:varResultxsd:integerOutcome of VAR review
fifa:varDecisionxsd:integerVAR decision outcome (VarNotificationData/Decision)

EventQualifier — Supplementary Annotations

A fifa:MatchEvent can have zero or more fifa:EventQualifier nodes attached via fifa:hasQualifier. These carry spatial and cross-event data: goalkeeper positions, goalmouth coordinates, blocked shot locations, jersey numbers, injured-player references, and links to related events.

?match fifa:hasEvent ?event .
?event fifa:hasQualifier ?q .
?q fifa:qualifierId         ?qid ;
   fifa:qualifierRecordId   ?recId .
OPTIONAL { ?q fifa:pitchZone              ?zone }
OPTIONAL { ?q fifa:gkXCoordinate         ?gkX }
OPTIONAL { ?q fifa:gkYCoordinate         ?gkY }
OPTIONAL { ?q fifa:goalmouthYCoordinate  ?gmY }
OPTIONAL { ?q fifa:goalmouthZCoordinate  ?gmZ }
OPTIONAL { ?q fifa:blockedXCoordinate    ?blkX }
OPTIONAL { ?q fifa:blockedYCoordinate    ?blkY }
OPTIONAL { ?q fifa:jerseyNumbers         ?jerseys }
OPTIONAL { ?q fifa:playerPosition        ?playerPos }
OPTIONAL { ?q fifa:injuredPlayer         ?injPlayer }
OPTIONAL { ?q fifa:relatedEvent          ?relEvt }
OPTIONAL { ?q fifa:oppositeRelatedEvent  ?oppEvt }
OPTIONAL { ?q fifa:secondRelatedEvent    ?secEvt }

fifa:timelineEvent — Cross-Reference to Timeline

Links a derived live-match entity (fifa:Goal, fifa:Booking, fifa:Substitution) back to the corresponding raw fifa:MatchEvent in the timeline. Use it to join structured live data (typed properties like fifa:goalMinute, fifa:goalType, fifa:player) with the full event-qualifier annotations.

?match fifa:hasGoal ?goal .
?goal  fifa:timelineEvent ?event .
?event fifa:hasQualifier ?q .
?q     fifa:goalmouthYCoordinate ?gmY ;
       fifa:goalmouthZCoordinate ?gmZ .

Key Property Quick Reference

Match Scores & Result

?match fifa:homeTeamScore ?homeScore ;
       fifa:awayTeamScore ?awayScore ;
       fifa:winner        ?winnerTeam ;
       fifa:resultType    ?resultType .   # 1=normal, 2=AET, 3=penalties

Goal Details

?match fifa:hasGoal ?goal .
?goal  rdfs:label        ?goalLabel ;
       fifa:goalMinute   ?minute ;
       fifa:goalPeriod   fifa:MatchPeriod-3 ;
       fifa:goalType     fifa:GoalType-1 ;
       fifa:assistPlayer ?assistingPlayer ;
       fifa:team         ?scoringTeam ;
       fifa:player       ?scorer .

Booking Details

?match fifa:hasBooking ?booking .
?booking fifa:bookingCard   fifa:CardType-1 ;
         fifa:bookingMinute ?minute ;
         fifa:bookingPeriod ?period ;
         fifa:bookingReason ?reasonCode ;
         fifa:team          ?bookedTeam ;
         fifa:player        ?bookedPlayer .
OPTIONAL { ?booking fifa:coach  ?coach }   # coach booking (fifa:Coach)
OPTIONAL { ?booking fifa:staff  ?staff }   # staff booking (fifa:Staff)
OPTIONAL { ?booking fifa:timelineEvent ?event }

Substitution Details

?match fifa:hasSubstitution ?sub .
?sub  fifa:playerOff          ?outPlayer ;
      fifa:playerOffName      ?outName ;
      fifa:playerOn           ?inPlayer ;
      fifa:playerOnName       ?inName ;
      fifa:substitutionMinute ?minute ;
      fifa:substitutionPeriod ?period ;
      fifa:substitutionReason ?reason .

Player Lineup

?match fifa:hasPlayerAppearance ?appearance .
?appearance fifa:player       ?player ;
            fifa:team         ?team ;
            fifa:shirtNumber  ?shirt ;
            fifa:captain      ?isCaptain ;
            fifa:fieldStatus  ?fieldStatus ; # 1=starting, 2=substitute
            fifa:position     ?pos ;
            fifa:lineupX      ?x ;
            fifa:lineupY      ?y .

Player Bio

?player rdfs:label          ?name ;
        fifa:playerId       ?id ;
        fifa:birthDate      ?dob ;
        fifa:height         ?height ;
        fifa:weight         ?weight ;
        fifa:jerseyNum      ?jersey ;
        fifa:realPosition   ?realPos ;
        fifa:realPositionSide ?side .

Team & Squad

?team rdfs:label           ?teamName ;
      fifa:teamId          ?id ;
      fifa:abbreviation    ?abbr ;
      fifa:hasWorldRanking ?ranking ;
      fifa:hasPlayer       ?player .       # direct → fifa:Player

# Squad membership via inSquad (player → SquadMembership)
?player fifa:inSquad ?squadMembership .
?squadMembership fifa:forTeam     ?team ;
                 fifa:duringSeason ?season .

# Team membership (temporal) via hasTeamMembership (player → TeamMembership)
?player fifa:hasTeamMembership ?membership .
?membership fifa:team          ?team ;
            fifa:duringSeason  ?season ;
            fifa:fromJoinDate  ?joined ;
            fifa:fromLeaveDate ?left .

Weather

?match fifa:weather ?weather .
?weather fifa:temperature          ?temp ;
         fifa:humidity             ?humidity ;
         fifa:windSpeed            ?wind ;
         fifa:weatherTypeLocalized ?description .

Ball Possession

?match fifa:ballPossession ?poss .
?poss fifa:overallHome ?homePct ;
      fifa:overallAway ?awayPct .

Stadium & Location

?match fifa:stadium ?stadium .
?stadium rdfs:label ?stadiumName ;
         fifa:hasRoof ?hasRoof ;
         fifa:city ?city .
?city rdfs:label ?cityName .
OPTIONAL { ?stadium fifa:capacity   ?capacity }
OPTIONAL { ?stadium fifa:latitude   ?lat }
OPTIONAL { ?stadium fifa:longitude  ?lon }
OPTIONAL { ?stadium fifa:length     ?pitchLength }
OPTIONAL { ?stadium fifa:width      ?pitchWidth }

Common Query Patterns

Pattern 1: All Goals in a Match

SELECT ?match ?matchLabel ?goalMinute ?periodLabel ?goalTypeLabel ?scorerName ?assistName
WHERE {
  ?match a fifa:Match ;
         rdfs:label ?matchLabel ;
         fifa:hasGoal ?goal .
  ?goal  fifa:goalMinute ?goalMinute ;
         fifa:goalPeriod ?period ;
         fifa:goalType   ?goalType .
  ?period   rdfs:label ?periodLabel .
  ?goalType rdfs:label ?goalTypeLabel .
  OPTIONAL { ?goal rdfs:label ?scorerName }
  OPTIONAL { ?goal fifa:assistPlayer ?assist . ?assist rdfs:label ?assistName }
}
ORDER BY ?goalMinute

Pattern 2: Match Results with Score

SELECT ?match ?homeTeamName ?awayTeamName ?homeScore ?awayScore ?winnerName ?date
WHERE {
  ?match a fifa:Match ;
         fifa:homeTeam      ?homeTeam ;
         fifa:awayTeam      ?awayTeam ;
         fifa:homeTeamScore ?homeScore ;
         fifa:awayTeamScore ?awayScore ;
         fifa:date          ?date .
  ?homeTeam rdfs:label ?homeTeamName .
  ?awayTeam rdfs:label ?awayTeamName .
  OPTIONAL { ?match fifa:winner ?winner . ?winner rdfs:label ?winnerName }
}
ORDER BY ?date

Pattern 3: Player Appearances (Starting XI)

SELECT ?match ?playerName ?shirtNumber ?posLabel ?isCaptain
WHERE {
  ?match a fifa:Match ;
         fifa:hasPlayerAppearance ?app .
  ?app   fifa:player      ?player ;
         fifa:shirtNumber ?shirtNumber ;
         fifa:fieldStatus 1 ;
         fifa:captain     ?isCaptain .
  ?player rdfs:label ?playerName .
  OPTIONAL { ?player fifa:realPosition ?pos . ?pos rdfs:label ?posLabel }
}

Pattern 4: Yellow/Red Cards by Team

SELECT ?team ?teamName (COUNT(?booking) AS ?cards)
WHERE {
  ?match a fifa:Match ;
         fifa:hasBooking ?booking .
  ?booking fifa:bookingCard fifa:CardType-1 ;  # Yellow; CardType-3 for straight red
           fifa:team ?team .
  ?team rdfs:label ?teamName .
}
GROUP BY ?team ?teamName
ORDER BY DESC(?cards)

Pattern 5: Tactics Used Per Match

SELECT ?matchLabel ?homeTeamName ?homeTacticLabel ?awayTeamName ?awayTacticLabel
WHERE {
  ?match a fifa:Match ;
         rdfs:label ?matchLabel ;
         fifa:homeTeam ?homeTeam ; fifa:awayTeam ?awayTeam ;
         fifa:homeTeamTactics ?homeTactic ;
         fifa:awayTeamTactics ?awayTactic .
  ?homeTeam rdfs:label ?homeTeamName .
  ?awayTeam rdfs:label ?awayTeamName .
  ?homeTactic rdfs:label ?homeTacticLabel .
  ?awayTactic rdfs:label ?awayTacticLabel .
}

Pattern 6: Team Analytics for a Match

SELECT ?match ?matchLabel ?reportLabel
       ?passes ?passesCompleted ?possession
       ?attemptAtGoal ?goals ?xG ?yellowCards
WHERE {
  ?match a fifa:Match ;
         rdfs:label ?matchLabel ;
         fifa:hasTeamAnalyticsReport ?report .
  ?report rdfs:label ?reportLabel .
  OPTIONAL { ?report fifa:passes           ?passes }
  OPTIONAL { ?report fifa:passesCompleted  ?passesCompleted }
  OPTIONAL { ?report fifa:possession       ?possession }
  OPTIONAL { ?report fifa:attemptAtGoal    ?attemptAtGoal }
  OPTIONAL { ?report fifa:goals            ?goals }
  OPTIONAL { ?report fifa:xG              ?xG }
  OPTIONAL { ?report fifa:yellowCards      ?yellowCards }
}
ORDER BY ?matchLabel

Pattern 7: Player Physical Performance

SELECT ?matchLabel ?reportLabel
       ?totalDistance ?distanceHighSpeedSprinting ?topSpeed ?sprints ?timePlayed
WHERE {
  ?match a fifa:Match ;
         rdfs:label ?matchLabel ;
         fifa:hasPlayerAnalyticsReport ?report .
  ?report rdfs:label ?reportLabel .
  OPTIONAL { ?report fifa:totalDistance              ?totalDistance }
  OPTIONAL { ?report fifa:distanceHighSpeedSprinting ?distanceHighSpeedSprinting }
  OPTIONAL { ?report fifa:topSpeed                   ?topSpeed }
  OPTIONAL { ?report fifa:sprints                    ?sprints }
  OPTIONAL { ?report fifa:timePlayed                 ?timePlayed }
}
ORDER BY DESC(?totalDistance)

Pattern 8: Top Teams by Pressing Intensity

SELECT ?team ?teamName
       (SUM(?highPress) AS ?totalHighPress)
       (SUM(?counterPress) AS ?totalCounterPress)
WHERE {
  ?match a fifa:Match ;
         fifa:hasTeamAnalyticsReport ?report .
  { ?match fifa:homeTeam ?team } UNION { ?match fifa:awayTeam ?team }
  ?team rdfs:label ?teamName .
  OPTIONAL { ?report fifa:phaseAggregateHighPress    ?highPress }
  OPTIONAL { ?report fifa:phaseAggregateCounterPress ?counterPress }
}
GROUP BY ?team ?teamName
ORDER BY DESC(?totalHighPress)

Pattern 9: Linebreak Efficiency by Team

SELECT ?team ?teamName
       (SUM(?attempted) AS ?attempted)
       (SUM(?completed) AS ?completed)
WHERE {
  ?match a fifa:Match ;
         fifa:hasTeamAnalyticsReport ?report .
  { ?match fifa:homeTeam ?team } UNION { ?match fifa:awayTeam ?team }
  ?team rdfs:label ?teamName .
  OPTIONAL { ?report fifa:linebreaksAttemptedAllLines ?attempted }
  OPTIONAL { ?report fifa:linebreaksCompletedAllLines ?completed }
}
GROUP BY ?team ?teamName
HAVING (SUM(?attempted) > 0)
ORDER BY DESC(SUM(?completed))

Pattern 10: Match Officials

# Direct access via fifa:hasOfficial → fifa:Official
SELECT ?match ?matchLabel ?official ?officialName ?roleCode
WHERE {
  ?match a fifa:Match ;
         rdfs:label ?matchLabel ;
         fifa:hasOfficial ?official .
  ?official rdfs:label ?officialName .
  OPTIONAL { ?official fifa:officialType ?roleCode }
}
ORDER BY ?matchLabel

# With localised role label via OfficialAssignment
SELECT ?match ?matchLabel ?official ?officialName ?roleLabel
WHERE {
  ?match a fifa:Match ;
         rdfs:label ?matchLabel ;
         fifa:hasOfficial ?official .
  ?official rdfs:label ?officialName .
  OPTIONAL {
    ?assignment a fifa:OfficialAssignment ;
                fifa:official ?official ;
                fifa:officialTypeLocalized ?roleLabel .
  }
}
ORDER BY ?matchLabel

Pattern 11: Top Scorers

SELECT ?player ?playerName (COUNT(?goal) AS ?goals)
WHERE {
  ?match a fifa:Match ;
         fifa:hasGoal ?goal .
  ?goal fifa:player ?player .
  ?player rdfs:label ?playerName .
  FILTER NOT EXISTS { ?goal a fifa:EventType-34 }  # exclude own goals
}
GROUP BY ?player ?playerName
ORDER BY DESC(?goals)

Pattern 12: Players by Position and Side

# All forwards in the tournament
SELECT ?player ?playerName ?teamName ?sideLabel
WHERE {
  ?match a fifa:Match ;
         fifa:hasPlayerAppearance ?app .
  ?app fifa:player ?player ;
       fifa:position fifa:Position-3 .   # or position:3
  OPTIONAL { ?app fifa:realPositionSide ?side . ?side rdfs:label ?sideLabel }
  ?player rdfs:label ?playerName .
  OPTIONAL { ?app fifa:team ?team . ?team rdfs:label ?teamName . }
}

Pattern 13: FIFA World Rankings (PowerRanking graph)

PREFIX fifa: <https://www.openlinksw.com/ontology/fifa#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?team ?teamName ?confederation ?rank ?prevRank ?rankingMovement ?totalPoints ?generatedAt
WHERE {
  GRAPH <urn:fifa:powerrankings> {
    ?snapshot a fifa:PowerRanking ;
              fifa:hasTeam ?team ;
              fifa:hasConfederation ?confederation ;
              fifa:rank ?rank ;
              fifa:prevRank ?prevRank ;
              fifa:rankingMovement ?rankingMovement ;
              fifa:totalPoints ?totalPoints ;
              fifa:generatedAt ?generatedAt .
    ?team rdfs:label ?teamName .
    {
      SELECT ?team (MAX(?gen) AS ?generatedAt)
      WHERE {
        GRAPH <urn:fifa:powerrankings> {
          ?r a fifa:PowerRanking ; fifa:hasTeam ?team ; fifa:generatedAt ?gen .
        }
      }
      GROUP BY ?team
    }
  }
}
ORDER BY ?rank
LIMIT 50

Pattern 14: Match Win Probabilities (Inferred)

SELECT ?match ?homeTeam ?awayTeam ?homeWinProb ?awayWinProb
WHERE {
  GRAPH <urn:worldcup:kg:2026> {
    ?match a fifa:Match ;
           fifa:homeTeam ?homeTeamRes ;
           fifa:awayTeam ?awayTeamRes .
    OPTIONAL { ?match fifa:homeTeamWinProbabilityByFifaRank ?homeWinProb }
    OPTIONAL { ?match fifa:awayTeamWinProbabilityByFifaRank ?awayWinProb }
    ?homeTeamRes rdfs:label ?homeTeam .
    ?awayTeamRes rdfs:label ?awayTeam .
  }
}
ORDER BY ?match

Pattern 15: xG and Threat Comparison

SELECT ?match ?matchLabel ?team ?teamName ?xG ?threat ?pitchControl ?finalThirdPitchControl
WHERE {
  GRAPH <urn:worldcup:kg:2026:analytics> {
    ?report a fifa:TeamMatchAnalyticsReport ;
            fifa:match ?match ;
            fifa:team ?team ;
            fifa:generatedAt ?generatedAt .
    OPTIONAL { ?report fifa:xG ?xG }
    OPTIONAL { ?report fifa:threat ?threat }
    OPTIONAL { ?report fifa:pitchControl ?pitchControl }
    OPTIONAL { ?report fifa:finalThirdPitchControl ?finalThirdPitchControl }
    {
      SELECT ?match ?team (MAX(?gen) AS ?generatedAt)
      WHERE {
        GRAPH <urn:worldcup:kg:2026:analytics> {
          ?r a fifa:TeamMatchAnalyticsReport ;
             fifa:match ?match ; fifa:team ?team ; fifa:generatedAt ?gen .
        }
      }
      GROUP BY ?match ?team
    }
  }
  GRAPH <urn:worldcup:kg:2026> {
    ?match rdfs:label ?matchLabel .
    ?team rdfs:label ?teamName .
  }
}
ORDER BY ?match

Query Best Practices

  1. Prefer analytics reports over raw events for aggregate stats — when a metric exists in fifa:PlayerMatchAnalyticsReport or fifa:TeamMatchAnalyticsReport (goals, passes, distance, possession, xG, etc.), always use it via fifa:hasPlayerAnalyticsReport / fifa:hasTeamAnalyticsReport rather than counting raw event nodes. Counting raw fifa:Goal events can produce incorrect aggregates; the analytics reports are the authoritative pre-aggregated source of truth.

    Use analytics (correct):

    ?match fifa:hasPlayerAnalyticsReport ?report .
    ?report fifa:player ?player ;
            fifa:goals  ?goalsInMatch .

    Avoid for aggregates (can produce wrong totals):

    ?match fifa:hasGoal ?goal .
    ?goal fifa:player ?player .   # ← raw event count, unreliable for aggregates
  2. Always use rdfs:label for human-readable names — teams, players, stadiums, cities, periods, goal types, card types all have labels.
  3. Always SELECT both the URI and the label — include the subject URI variable alongside its rdfs:label. The URI is a stable identifier for follow-up queries.
  4. Use OPTIONAL for nullable fields — weather, possession, tactics, winner, and every analytics metric.
  5. Always use instance URIs, never raw integers for typed values — fifa:goalType, fifa:bookingCard, fifa:goalPeriod, and event types all use instance URIs. There is no fifa:eventType datatype property; filter by ?event a fifa:EventType-N .
  6. The player in a Goal/Booking is declared via fifa:player. A rdfs:label on the event node may carry the name as a fallback.
  7. Squad and team membership navigation: fifa:hasPlayer on fifa:Team points directly to fifa:Player. To navigate squad membership use fifa:inSquad on the player (→ fifa:SquadMembership) with fifa:forTeam and fifa:duringSeason. For temporal club membership use fifa:hasTeamMembership (→ fifa:TeamMembership).
  8. Match-centric traversal: Start from ?match a fifa:Match and follow fifa:has* outward.
  9. Aggregate queries: Always include the URI in GROUP BY alongside the label.
  10. Analytics reports use OPTIONAL for every metric — not every report will have every metric populated.
  11. fifa:AnalyticsMetricProperty as discovery tool — query ?p rdf:type fifa:AnalyticsMetricProperty to enumerate available analytics predicates dynamically.
  12. fifa:team and fifa:player are multi-domain — usable directly on fifa:Goal, fifa:Booking, fifa:PlayerMatchAppearance, fifa:CoachAssignment, fifa:TeamMatchAnalyticsReport, and fifa:PlayerMatchAnalyticsReport.
  13. fifa:Official vs fifa:OfficialAssignment vs fifa:OfficialType:
    • fifa:Official = the person. Has rdfs:label, fifa:officialType (integer), fifa:idCountry.
    • fifa:OfficialAssignment = the assignment record. Has fifa:official, fifa:officialType (integer), fifa:officialTypeLocalized (human-readable, e.g. "Referee").
    • fifa:OfficialType = the role taxonomy class. Instances have rdfs:label values like "Referee", "Assistant VAR".
    • fifa:hasOfficial links to the person node. fifa:hasOfficialAssignment links to the assignment record.
  14. fifa:position on fifa:PlayerMatchAppearance — the position assigned for a specific match appearance; no need to go through the player node.
  15. EventQualifier for spatial detail — navigate from ?event fifa:hasQualifier ?q for goalkeeper position, goalmouth coordinates, pitch zone, or blocked-shot location. Use OPTIONAL for every qualifier property.
  16. fifa:timelineEvent bridges live entities and the timeline — follow ?liveEntity fifa:timelineEvent ?event to reach the fifa:MatchEvent with full qualifier annotations and VAR data.
  17. Provider identifiers — matches carry fifa:matchId, fifa:idIfes (IFES), and fifa:idStatsPerform (Stats Perform/Opta). Use fifa:idIfes when querying the analytics endpoint.
  18. PowerRanking graph isolation — urn:fifa:powerrankings is self-contained. Always use GRAPH <urn:fifa:powerrankings> when querying it; otherwise team stubs in that graph may collide with full team nodes in the main graph.
  19. Use preferred event classes — fifa:Goal, fifa:Booking, fifa:Substitution are the preferred classes for events; the owl:equivalentClass EventType coded variants (EventType-0, EventType-2, EventType-5) will eventually be superseded.

Reference Files

For deep property listings, see:

  • references/properties.md — complete property table with domains, ranges, and data types
  • references/coded-values.md — expanded coded value tables with usage examples

Read these only when you need exhaustive detail beyond what the SKILL.md tables cover.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.