Explore the Linked Data stored in this collection
through the samples provided that produce a range of
visualizations. For a given sample visualization, the
approach used is to first load in a SPARQL query that
extracts and manipulates the linked data in the
underlying triplestore that represents all the metadata
stored in the collection.
This is then passed on to
SGVizler, a JavaScript visualization library, to
display in graphical form the generated data.
In terms of operating the user interface, this is
achieved by pressing the Load query above button
for a sample visualization that has piqued your interest
(listed below). This causes a Visualize Results
button to appear alongside the load button you have just
pressed, which when clicked runs the loaded-in query and
visualizes the result.
We use this two-step process so it is possible to
change what query is run, and how the resulting data is visualized.
The first text-box below is for the SPARQL query. The following
3 text-boxes control aspects of the visualization.
If you haven't worked with the underlying tools before,
we suggest you work your way through the sample visualizations
provided, trying out small edits to see how that affects
what is produced.
Rather than visualize results, if you would like to
directly access and/or export the data to peroforms
other forms of analysis, then you'll probably want to
use the:
The samples provided below show a range
of visualizations related to the
Eurovision Song Contest, sourced from the raw
data in the triple-store, and converted into
a visualization using SGVizler.
Click on one of the Load query above buttons
to load the relevant query syntax into the SPARQL
Query textbox above, accompanied with SGVizler
attributes that control the visualization,
then press Get Results
to initiate the visualization.
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX gsdlextracted: <http://greenstone.org/gsdlextracted#>
SELECT ?country (COUNT(?country) AS ?freqCount)
WHERE {
GRAPH <https://so-we-must-think.space/greenstone3/eurovision-library/collection/eurovision> {
{
SELECT DISTINCT ?country ?year WHERE {
?s gsdlextracted:Country ?country.
?s gsdlextracted:Year ?year.
} ORDER BY ?country ?year
}
}
}
GROUP BY ?country ORDER BY DESC(?freqCount)
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX gsdlextracted: <http://greenstone.org/gsdlextracted#>
SELECT (?country AS ?Country) (COUNT(?country) AS ?freqCount)
WHERE {
GRAPH <https://so-we-must-think.space/greenstone3/eurovision-library/collection/eurovision> {
?esc_entrant_uri gsdlextracted:Country ?country.
?esc_entrant_uri gsdlextracted:Place ?place.
BIND(xsd:integer(?place) AS ?place_int).
FILTER(?place_int = 1).
?esc_entrant_uri gsdlextracted:Year ?year.
BIND(xsd:integer(?year) AS ?year_int).
BIND(?year_int + 1 AS ?next_year_int).
BIND(str(?next_year_int) AS ?next_year).
?next_esc_entrant_uri gsdlextracted:Country ?country.
?next_esc_entrant_uri gsdlextracted:Year ?next_year.
# The following block tests for 'nul point'
?next_esc_entrant_uri gsdlextracted:VoteGrandTotal ?total.
BIND(xsd:integer(?total) AS ?total_int).
FILTER(?total_int = 0).
# If you want to see who went from first to last place
# (which could still mean you scored some points) then
# comment out the block above, and uncommment the following
# one.
#
#
# Interestingly, due to an obscure rule in ESC, in 2015
# when Austria scored nul-point, it was not offically
# placed as last, as another country (Germany) had also
# scored nul-point that year, and the rule used to break
# the tie looks at the running order. As a result Austria
# was placed 26th, and Germany 27th!
# ?next_esc_entrant_uri gsdlextracted:ReverseFinishingPos ?rev_finishing_pos.
# BIND(xsd:integer(?rev_finishing_pos) AS ?rev_finishing_pos_int).
# FILTER(?rev_finishing_pos_int = 1).
}
}
GROUP BY ?country ORDER BY DESC(?freqCount)
google.visualization.BarChart
title=Number times a Country received "nul point" having won the final the previous year|legend.position=none|height=100|chartArea.height=40|fontSize=11
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX gsdlextracted: <http://greenstone.org/gsdlextracted#>
SELECT (xsd:integer(?year) as ?Year) (COUNT(?year) AS ?freqCount)
WHERE {
GRAPH <https://so-we-must-think.space/greenstone3/eurovision-library/collection/eurovision> {
?esc_entrant_uri gsdlextracted:Country ?country.
?esc_entrant_uri gsdlextracted:Year ?year.
?esc_entrant_uri gsdlextracted:VoteGrandTotal ?total.
BIND(xsd:integer(?total) AS ?total_int).
FILTER(?total_int = 0).
}
}
GROUP BY ?year
ORDER BY ASC(?year)
google.visualization.ColumnChart
title=Occurrence by year of countries receiving "nul point" in the final|height=300|chartArea.height=240|fontSize=11|vAxis.maxValue=6|hAxis.title=Year|hAxis.maxValue=2019|vAxis.title=Occurrences|hAxis.ticks=[1956,1958,1960]|hAxis.format='|legend=none
PREFIX gsdlextracted: <http://greenstone.org/gsdlextracted#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT (?j_country AS ?jt_vote_from_country) ?to_country ?total_vote_int ?diff_vote_int
WHERE {
{
GRAPH <https://so-we-must-think.space/greenstone3/eurovision-library/collection/eurovision> {
?esc_entrant_uri gsdlextracted:Year ?year
FILTER(xsd:integer(?year) = **inyear**).
?esc_entrant_uri ?gsdlextracted_j_country_uri ?j_vote.
BIND(STRENDS(str(?gsdlextracted_j_country_uri),"-J") AS ?is_j_vote).
FILTER (?is_j_vote).
BIND(REPLACE(str(?gsdlextracted_j_country_uri), ".*#(.*?)-J$", "$1") AS ?j_country).
?esc_entrant_uri ?gsdlextracted_t_country_uri ?t_vote.
BIND(STRENDS(str(?gsdlextracted_t_country_uri),"-T") AS ?is_t_vote).
FILTER (?is_t_vote).
BIND(REPLACE(str(?gsdlextracted_t_country_uri), ".*#(.*?)-T$", "$1") AS ?t_country).
FILTER(?j_country = ?t_country).
BIND(xsd:integer(?j_vote) AS ?j_vote_int).
BIND(xsd:integer(?t_vote) AS ?t_vote_int).
BIND((?t_vote_int + ?j_vote_int) AS ?total_vote_int).
BIND((?t_vote_int - ?j_vote_int) AS ?diff_vote_int).
?esc_entrant_uri gsdlextracted:Country ?to_country.
FILTER(?to_country = "**tocountry**").
}
}
UNION {
VALUES (?j_country ?to_country ?j_vote_int ?t_vote_int ) {
( "**tocountry**" UNDEF 0 0 )
}
}
}
google.visualization.TreeMap
title=Difference in Jury and Televoting for **tocountry** in **inyear** |height=600|chartArea.height=1100|fontSize=14|minColorValue=-12|maxColorValue=12|minColor=#008896|midColor=#f7f7f7|maxColor=#ee4000|headerHeight=15|showScale=true
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX gsdlextracted: <http://greenstone.org/gsdlextracted#>
SELECT (?draw_int) (SUM(?is_winner) AS ?freqCount)
#(COUNT(?is_winner) AS ?maxPossibleFreqCount) (100.0 * ?freqCount/?maxPossibleFreqCount AS ?normFreqCount)
WHERE {
GRAPH <https://so-we-must-think.space/greenstone3/eurovision-library/collection/eurovision> {
# ?esc_entrant_uri dc:Relation.isPartOf <https://so-we-must-think.space/greenstone3/eurovision-library/collection/eurovision>.
?esc_entrant_uri gsdlextracted:Country ?country.
?esc_entrant_uri gsdlextracted:Draw ?draw.
?esc_entrant_uri gsdlextracted:Place ?place.
BIND(xsd:integer(?draw) AS ?draw_int).
BIND(xsd:integer(?place) AS ?place_int).
BIND(IF(?place_int = 1,1,0) AS ?is_winner).
}
}
GROUP BY ?draw_int ORDER BY ASC(?draw_int)
google.visualization.BarChart
title=Number times an entry has has won given their draw position in the performance lineup|legend.position=none|height=400|chartArea.height=340|fontSize=11
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX gsdlextracted: <http://greenstone.org/gsdlextracted#>
SELECT ?draw_int ?normFreqCount WHERE {
SELECT ?draw_int (SUM(?is_winner) AS ?freqCount) (COUNT(?is_winner) AS ?maxPossibleFreqCount) (100.0 * ?freqCount/?maxPossibleFreqCount AS ?normFreqCount)
WHERE {
GRAPH <https://so-we-must-think.space/greenstone3/eurovision-library/collection/eurovision> {
# ?esc_entrant_uri dc:Relation.isPartOf <https://so-we-must-think.space/greenstone3/eurovision-library/collection/eurovision>.
?esc_entrant_uri gsdlextracted:Country ?country.
?esc_entrant_uri gsdlextracted:Draw ?draw.
?esc_entrant_uri gsdlextracted:Place ?place.
BIND(xsd:integer(?draw) AS ?draw_int).
BIND(xsd:integer(?place) AS ?place_int).
BIND(IF(?place_int = 1,1,0) AS ?is_winner).
}
}
GROUP BY ?draw_int ORDER BY ASC(?draw_int)
}
ORDER BY ASC(?draw_int)
google.visualization.BarChart
title=Percentage of times an entry has has won given their draw position in the performance lineup|legend.position=none|height=400|chartArea.height=340|fontSize=11
Plot as a bar graph the number of times each country has competed in the
Eurovision Song Contest, sorted by frequency.
Made the Finals:
Plot as a bar graph the number of times each country has made it to the finals.
List of Winners:
The songs that have won through the ages.
List of Last Place Entrants:
The songs that have won through the ages.
Top 3 Acts per Year with (where available) Details of Musical Content:
List the Top 3 entries per year, including musical details such as tempo, time-signature, and key where alignment with content in MusicBrainz was possible.
The ignominy of "nul point":
Plot a bar graph showing which countries, and how
often they have, competed in the final but received
zero points as their final total score.
The even more galling circumstance of getting "nul point" having won the previous year:
Have any countries ever been in the situation of going from Hero (i.e., winning) to Zero (nul point) in back to back years in
the contest.
Rate of occurrences of "nul points":
Plot a bar graph showing the distribution by year of how often countries have
ended up with zero point.
Dataflow Voting Patterns of Juries:
Plot as a Sankey Dataflow Graph how juries allocate
their votes to countries over the years 2010-2019.
Note: to help emphasize the voting patterns, we plot
the square of the voting totals.
Experiment with editing the date range specified in
the Start Year and End Year text-input
boxes. Alternatively, the the SPARQL query itself
edit
the FILTER(xsd:integer(?year) > 2010
&& xsd:integer(?year) <= 2019) clause
in the above text box and then press Show
Visualization to see how the voting by jury has
changed over the decades.
Dataflow Voting Patterns in Televoting:
Start Year:
End Year:
Plot as a Sankey Dataflow Graph of the televoting
data by country. Years plotted are 2016-2019
as these are the only years the data has been
published separate to jury voting. As with
the Jury Sankey visual above, we plot
the square of the voting totals to
help emphasize where differences occur.
Differences between Jury and Televoting:
For the country:
In the year:
Plot as a Tree-map how the various juries have cast
their votes for a specific country. The area of the
block represents the number of points awarded by
the jury. To this we add colouring
to the block to show how much in agreement
the televote was: red indicates the televote was
higher than the the jury vote; green is when the
votes are similar (neutral); and
blue indicates the televote was lower then the
jury vote.
The Curse of Being the Second Performer in the Lineup?
Plot as a bar graph how many times an entrant
performing in a given position in the lineup has
gone on to win the competition. Performing second
in the line-up historically has been considered an
unlucky draw position to perform in, but are there
any others? Any draw positions that seem to
prove favourable to winning?
Normalized Plot of ... The Curse of Being the Second Performer in the Lineup?
Same as the above, only to better take account of
the fact that an increasing number of countries have
been taking part in the final, in this version of
the plot the values have normalized to express as a
percentage the number of times an entrant has won in
that position of the draw, as a percentage of the
total number of times there has been an entrant
performing at that position of the draw.