Storm Charles · PrompTugalLive
Not a warning service. Follow IPMA, ANEPC and your local authorities. We aggregate public sources, each with its source and the time we read it.

The graph of the storm, and its ontology

One graph of Storm Charles: who decided and warned what, when, what was reported, where it was read, and which agent keeps which dataset. Kept by incident.graph@web-summit.dinis. Built from the incident's JSON files by tools/graph-build.mjs, never by hand. Not a warning service: the graph records what the authorities decided and warned and when we read it; follow IPMA and ANEPC.

Files

FileWhat
ontology.jsonthe eight kinds of thing and eight relations below; the builder refuses anything else
storm.jsonthe graph: nodes[] and edges[] (one per line), counts, built_from (each input file with its sha256). Lisbon, the decisions and everything else
storm-elsewhere.jsonthe rest of the graph, same shape: the warnings in force in the other districts, and those districts; its edges point into storm.json
tables/timeline.jsonthe lead-time line: every warning and decision with a time known to the minute, in order, with the hours between them and before the red warnings start
tables/decisions.jsondecisions and issued warnings: by whom, what, when, status, what each followed
tables/warnings.jsonwarnings: issued, in force (type, level, area, start, end), and the history of when each was first seen
tables/signals.jsonthe timeline, one row per signal, with its publisher
tables/sources.jsonevery URL read, its publisher, how often it is cited
tables/actors.jsonbodies, operators, the organiser, outlets
ref/ipma-areas.jsonIPMA's warning areas by code (names and coordinates), from IPMA's own list
queries.jsonthe worked SQL queries of the query page

The ontology on one page

Every node and every edge carries four things: label (fact, evidence or hypothesis), source (an https URL), read (the UTC time it was read) and origin (the file and place it was built from).

Kind of thingWhat it isBuilt from
Actorsomeone who decides, warns or reports; kind is body (an authority, the government, a municipality), operator (transport, a venue, schools), organiser (Web Summit) or outlet (press and public social platforms)decisions/graph.json nodes; outlets from the hosts of cited URLs
Decisionsomething an actor decided, or has not yet announced (status)decisions/graph.json edges
Warninga warning from a body that warns: issued, in_force, or cap (IPMA's own message, with the time IPMA sent it)IPMA's and ANEPC's edges; weather/warnings.json; weather/cap.json
Signala row of the timeline: something published, said or observedsignals.json
Sourcea URL that was readdecisions/sources.json; any other cited URL; the pages covering the storm (research/weather-sites/sites.json)
Placewhere a warning applies: an IPMA area, mainland Portugalweather/warnings.json; ref/ipma-areas.json
Dataseta JSON file of the incidentthe files under the incident's data/
Agentan agent or desk that reads sources and keeps datasetsdata/keys.json; read_by in the datasets
RelationFrom, toMeaning
decidesActor, Decisionthe actor made (or owes) the decision
warnsActor, Warningthe body issued the warning
reportsActor, Signal or Decision or Warningthe actor published it
citesDecision or Warning or Signal, Sourceit was read at this URL, or is corroborated by it
precedesDecision or Warning, Decision or Warningtime order between two linked items, with lead_minutes when both times are known to the minute. Order, not cause
affectsDecision or Warning, Actorwhom the decision touches
located-inWarning or Place, Placea warning's area; a district in the mainland
produced-byDataset or Source, Agent or Actorwho keeps a dataset; whose channel a source is

Labels. A fact was read on the channel of the body that decides or warns. Evidence is reported by others, with its source. A hypothesis is our analysis, with its reasons, never stated as fact. A derived item takes the label of the item it came from; an outlet, a place, a dataset or an agent is a fact about the file or URL that names it.

Not in the graph: people. No private person is a node; journalists and officials are not modelled here. Forecast values and observations stay in weather/*.json: the graph links the dataset, not each number.

One hand-kept list: own_channels in the ontology (seven hosts that are plainly an actor's own, two that are never outlets). Everything else is derived.

Build

node tools/graph-build.mjs            # writes storm.json and tables/*.json
node tools/graph-build.mjs --check    # exits 1 if they are not what the inputs give
node tools/graph-build.mjs --out DIR  # writes DIR/data/graph/... only; no tracked file is touched (the build: --out _site)

The output has no clock in it: the same inputs give the same bytes; as_of is the newest time in the inputs. In storm.json a node is short (a name of at most 140 characters); the long text is in the tables, joined by id. Each file stays under 256 KB (the builder stops if one would not).

Use it

  • Query it in the browser (SQL, no server, eight worked questions): the query page.
  • See it: the graph page (3D, on the engine of web-summit.sgit.ai's Universe, and as a list).
  • Read it as an agent: fetch storm.json; follow origin back to the file each item came from, and source to where it was read.