125

Webinar: Intro to Cypher

Embed Size (px)

Citation preview

Page 1: Webinar: Intro to Cypher
Page 2: Webinar: Intro to Cypher
Page 3: Webinar: Intro to Cypher
Page 4: Webinar: Intro to Cypher
Page 5: Webinar: Intro to Cypher

|---------+--------------------+-----------------------------------------+--------------------+------------|| season | playerName | playerUri | playerPosition | playerAge ||---------+--------------------+-----------------------------------------+--------------------+------------|| 90/91 | Aldair | /aldair/profil/spieler/4151 | Centre Back | 24 || 90/91 | Thomas Häßler | /thomas-hassler/profil/spieler/553 | Attacking Midfield | 24 || 90/91 | Roberto Baggio | /roberto-baggio/profil/spieler/4153 | Secondary Striker | 23 || 90/91 | Karl-Heinz Riedle | /karl-heinz-riedle/profil/spieler/13806 | Centre Forward | 24 || 90/91 | Henrik Larsen | /henrik-larsen/profil/spieler/101330 | Attacking Midfield | 24 || 90/91 | Gheorghe Hagi | /gheorghe-hagi/profil/spieler/7939 | Attacking Midfield | 25 || 90/91 | Hristo Stoichkov | /hristo-stoichkov/profil/spieler/7938 | Left Wing | 24 || 90/91 | Brian Laudrup | /brian-laudrup/profil/spieler/39667 | Centre Forward | 21 || 90/91 | Miguel Ángel Nadal | /miguel-angel-nadal/profil/spieler/7676 | Centre Back | 23 ||---------+--------------------+-----------------------------------------+--------------------+------------|

Page 6: Webinar: Intro to Cypher

|-------------------+---------------------+-------------------------------------+--------------------|| sellerClubName | sellerClubNameShort | sellerClubUri | sellerClubCountry ||-------------------+---------------------+-------------------------------------+--------------------|| SL Benfica | Benfica | /benfica/startseite/verein/294 | Portugal || 1. FC Köln | 1. FC Köln | /1-fc-koln/startseite/verein/3 | Germany || ACF Fiorentina | Fiorentina | /fiorentina/startseite/verein/430 | Italy || SV Werder Bremen | Werder Bremen | /werder-bremen/startseite/verein/86 | Germany || Lyngby BK | Lyngby BK | /lyngby-bk/startseite/verein/369 | Denmark || Steaua Bucharest | Steaua | /steaua/startseite/verein/301 | Romania || CSKA Sofia | CSKA Sofia | /cska-sofia/startseite/verein/208 | Bulgaria || KFC Uerdingen 05 | KFC Uerdingen | /kfc-uerdingen/startseite/verein/95 | Germany || RCD Mallorca | RCD Mallorca | /rcd-mallorca/startseite/verein/237 | Spain ||-------------------+---------------------+-------------------------------------+--------------------|

Page 7: Webinar: Intro to Cypher

|----------------+--------------------+-------------------------------------+-------------------|| buyerClubName | buyerClubNameShort | buyerClubUri | buyerClubCountry ||----------------+--------------------+-------------------------------------+-------------------|| AS Roma | AS Roma | /as-roma/startseite/verein/12 | Italy || Juventus FC | Juventus | /juventus/startseite/verein/506 | Italy || Juventus FC | Juventus | /juventus/startseite/verein/506 | Italy || SS Lazio | Lazio | /lazio/startseite/verein/398 | Italy || AC Pisa 1909 | AC Pisa | /ac-pisa/startseite/verein/4172 | Italy || Real Madrid | Real Madrid | /real-madrid/startseite/verein/418 | Spain || FC Barcelona | FC Barcelona | /fc-barcelona/startseite/verein/131 | Spain || Bayern Munich | Bayern Munich | /bayern-munich/startseite/verein/27 | Germany || FC Barcelona | FC Barcelona | /fc-barcelona/startseite/verein/131 | Spain ||----------------+--------------------+-------------------------------------+-------------------|

Page 8: Webinar: Intro to Cypher

|--------------------------------------------------------+-------------+---------------|| transferUri | transferFee | transferRank ||--------------------------------------------------------+-------------+---------------|| /jumplist/transfers/spieler/4151/transfer_id/6993 | £6.75m | 1 || /jumplist/transfers/spieler/553/transfer_id/2405 | £5.85m | 2 || /jumplist/transfers/spieler/4153/transfer_id/84533 | £5.81m | 3 || /jumplist/transfers/spieler/13806/transfer_id/19054 | £5.63m | 4 || /jumplist/transfers/spieler/101330/transfer_id/275067 | £5.03m | 5 || /jumplist/transfers/spieler/7939/transfer_id/19343 | £3.23m | 6 || /jumplist/transfers/spieler/7938/transfer_id/11563 | £2.25m | 7 || /jumplist/transfers/spieler/39667/transfer_id/90285 | £2.25m | 8 || /jumplist/transfers/spieler/7676/transfer_id/11828 | £2.10m | 9 ||--------------------------------------------------------+-------------+---------------|

Page 9: Webinar: Intro to Cypher
Page 10: Webinar: Intro to Cypher

players

id

name

position

clubs

id

name

country

transfers

id

fee

player_age

player_id

from_club_id

to_club_id

season

Page 11: Webinar: Intro to Cypher
Page 12: Webinar: Intro to Cypher
Page 13: Webinar: Intro to Cypher
Page 14: Webinar: Intro to Cypher
Page 15: Webinar: Intro to Cypher
Page 16: Webinar: Intro to Cypher

Records in tables

Nodes"Soft"

relationships computed at query time

"Hard" relationships built into the

data store

Page 17: Webinar: Intro to Cypher
Page 18: Webinar: Intro to Cypher

CREATE TABLE players (

"id" character varying(100)

NOT NULL PRIMARY KEY,

"name" character varying(150) NOT NULL,

"position" character varying(20)

);

Page 19: Webinar: Intro to Cypher

INSERT INTO players

VALUES('/aldair/profil/spieler/4151', 'Aldair', 'Centre Back');

INSERT INTO players

VALUES('/thomas-hassler/profil/spieler/553', 'Thomas Häßler',

'Attacking Midfield');

INSERT INTO players VALUES('/roberto-baggio/profil/spieler/4153',

'Roberto Baggio', 'Secondary Striker');

Page 20: Webinar: Intro to Cypher

CREATE TABLE clubs (

"id" character varying(100)

NOT NULL PRIMARY KEY,

"name" character varying(50) NOT NULL,

"country" character varying(50)

);

Page 21: Webinar: Intro to Cypher

INSERT INTO clubs VALUES('/hertha-bsc/startseite/verein/44',

'Hertha BSC', 'Germany');

INSERT INTO clubs VALUES('/cfr-cluj/startseite/verein/7769', 'CFR

Cluj', 'Romania');

INSERT INTO clubs VALUES('/real-sociedad/startseite/verein/681',

'Real Sociedad', 'Spain');

Page 22: Webinar: Intro to Cypher

CREATE TABLE transfers (

"id" character varying(100) NOT NULL PRIMARY KEY,

"fee" character varying(50) NOT NULL,

"numericFee" integer NOT NULL,

"player_age" smallint NOT NULL,

"season" character varying(5) NOT NULL,

"player_id" character varying(100) NOT NULL REFERENCES players (id),

"from_club_id" character varying(100) NOT NULL REFERENCES clubs (id),

"to_club_id" character varying(100) NOT NULL REFERENCES clubs (id)

);

Page 23: Webinar: Intro to Cypher

INSERT INTO transfers VALUES('/jumplist/transfers/spieler/4151/transfer_id/6993', '

£6.75m', 6750000, '90/91', 24, '/aldair/profil/spieler/4151',

'/benfica/startseite/verein/294', '/as-roma/startseite/verein/12');

INSERT INTO transfers VALUES('/jumplist/transfers/spieler/553/transfer_id/2405', '

£5.85m', 5850000, '90/91', 24, '/thomas-hassler/profil/spieler/553',

'/1-fc-koln/startseite/verein/3', '/juventus/startseite/verein/506');

INSERT INTO transfers VALUES('/jumplist/transfers/spieler/4153/transfer_id/84533', '

£5.81m', 5810000, '90/91', 23, '/roberto-baggio/profil/spieler/4153',

'/fiorentina/startseite/verein/430', '/juventus/startseite/verein/506');

Page 24: Webinar: Intro to Cypher
Page 25: Webinar: Intro to Cypher
Page 26: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "(file|http)://" AS row

MATCH (:Label {property: row.header})

CREATE (:Label {property: row.header})

MERGE (:Label {property: row.header})

Page 27: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "(file|http)://" AS row

MATCH (:Label {property: row.header})

CREATE (:Label {property: row.header})

MERGE (:Label {property: row.header})

Page 28: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "(file|http)://" AS row

MATCH (:Label {property: row.header})

CREATE (:Label {property: row.header})

MERGE (:Label {property: row.header})

Page 29: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "(file|http)://" AS row

MATCH (:Label {property: row.header})

CREATE (:Label {property: row.header})

MERGE (:Label {property: row.header})

Page 30: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "(file|http)://" AS row

MATCH (:Label {property: row.header})

CREATE (:Label {property: row.header})

MERGE (:Label {property: row.header})

Page 31: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS

FROM "file:///transfers.csv"

AS row

RETURN COUNT(*)

Page 32: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS

FROM "file:///transfers.csv"

AS row

RETURN row

LIMIT 1

Page 33: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

CREATE (player:Player {

id: row.playerUri,

name: row.playerName,

position: row.playerPosition

})

Page 34: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

CREATE (player:Player {

id: row.playerUri,

name: row.playerName,

position: row.playerPosition

})

Page 35: Webinar: Intro to Cypher

CREATE CONSTRAINT ON (player:Player)

ASSERT player.id IS UNIQUE

Page 36: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

CREATE (player:Player {

id: row.playerUri,

name: row.playerName,

position: row.playerPosition

})

Node 25 already exists with label Player and property "id"=[/peter-lux/profil/spieler/84682]

Page 37: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

MERGE (player:Player {id: row.playerUri})

ON CREATE SET player.name = row.playerName,

player.position = row.playerPosition

Page 38: Webinar: Intro to Cypher

CREATE CONSTRAINT ON (club:Club)

ASSERT club.id IS UNIQUE

Page 39: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

MERGE (club:Club {id: row.sellerClubUri})

ON CREATE SET club.name = row.sellerClubName,

club.country = row.sellerClubCountry;

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

MERGE (club:Club {id: row.buyerClubUri})

ON CREATE SET club.name = row.buyerClubName,

club.country = row.buyerClubCountry;

Page 40: Webinar: Intro to Cypher

CREATE CONSTRAINT ON (transfer:Transfer)

ASSERT transfer.id IS UNIQUE

Page 41: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

MATCH (player:Player {id: row.playerUri})

MATCH (source:Club {id: row.sellerClubUri})

MATCH (destination:Club {id: row.buyerClubUri})

MERGE (t:Transfer {id: row.transferUri})

ON CREATE SET t.season = row.season, t.rank = row.transferRank,

t.fee = row.transferFee

MERGE (t)-[:OF_PLAYER { age: row.playerAge }]->(player)

MERGE (t)-[:FROM_CLUB]->(source)

MERGE (t)-[:TO_CLUB]->(destination)

Page 42: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

MATCH (player:Player {id: row.playerUri})

MATCH (source:Club {id: row.sellerClubUri})

MATCH (destination:Club {id: row.buyerClubUri})

MERGE (t:Transfer {id: row.transferUri})

ON CREATE SET t.season = row.season, t.rank = row.transferRank,

t.fee = row.transferFee

MERGE (t)-[:OF_PLAYER { age: row.playerAge }]->(player)

MERGE (t)-[:FROM_CLUB]->(source)

MERGE (t)-[:TO_CLUB]->(destination)

Page 43: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

MATCH (player:Player {id: row.playerUri})

MATCH (source:Club {id: row.sellerClubUri})

MATCH (destination:Club {id: row.buyerClubUri})

MERGE (t:Transfer {id: row.transferUri})

ON CREATE SET t.season = row.season, t.rank = row.transferRank,

t.fee = row.transferFee

MERGE (t)-[:OF_PLAYER { age: row.playerAge }]->(player)

MERGE (t)-[:FROM_CLUB]->(source)

MERGE (t)-[:TO_CLUB]->(destination)

Page 44: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

MATCH (player:Player {id: row.playerUri})

MATCH (source:Club {id: row.sellerClubUri})

MATCH (destination:Club {id: row.buyerClubUri})

MERGE (t:Transfer {id: row.transferUri})

ON CREATE SET t.season = row.season, t.rank = row.transferRank,

t.fee = row.transferFee

MERGE (t)-[:OF_PLAYER { age: row.playerAge }]->(player)

MERGE (t)-[:FROM_CLUB]->(source)

MERGE (t)-[:TO_CLUB]->(destination)

Page 45: Webinar: Intro to Cypher
Page 46: Webinar: Intro to Cypher
Page 47: Webinar: Intro to Cypher

CREATE CONSTRAINT ON (club:Club)

ASSERT club.id IS UNIQUE

Page 48: Webinar: Intro to Cypher

CREATE CONSTRAINT ON (club:Club)

ASSERT exists(club.name)

Page 49: Webinar: Intro to Cypher

CREATE CONSTRAINT ON ()-[player:OF_PLAYER]-()

ASSERT exists(player.age)

Page 50: Webinar: Intro to Cypher
Page 51: Webinar: Intro to Cypher
Page 52: Webinar: Intro to Cypher

SELECT *

FROM players

WHERE players.name = 'Cristiano Ronaldo'

Page 53: Webinar: Intro to Cypher

SELECT *

FROM players

WHERE players.name = 'Cristiano Ronaldo'

MATCH (player:Player { name: "Cristiano Ronaldo" })

RETURN player

Page 54: Webinar: Intro to Cypher

SELECT *

FROM players

WHERE players.name = 'Cristiano Ronaldo'

MATCH (player:Player { name: "Cristiano Ronaldo" })

RETURN player

Page 55: Webinar: Intro to Cypher

SELECT *

FROM players

WHERE players.name = 'Cristiano Ronaldo'

MATCH (player:Player { name: "Cristiano Ronaldo" })

RETURN player

Page 56: Webinar: Intro to Cypher
Page 57: Webinar: Intro to Cypher
Page 58: Webinar: Intro to Cypher

SELECT players.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

WHERE clubFrom.name = 'Tottenham Hotspur' AND clubTo.name = 'Manchester United'

Page 59: Webinar: Intro to Cypher

SELECT players.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

WHERE clubFrom.name = 'Tottenham Hotspur' AND clubTo.name = 'Manchester United'

MATCH (from:Club)<-[:FROM_CLUB]-(transfer:Transfer)-[:TO_CLUB]->(to:Club),

(transfer)-[:OF_PLAYER]->(player)

WHERE from.name = "Tottenham Hotspur" AND to.name = "Manchester United"

RETURN player.name, transfer.numericFee, transfer.season

Page 60: Webinar: Intro to Cypher

SELECT players.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

WHERE clubFrom.name = 'Tottenham Hotspur' AND clubTo.name = 'Manchester United'

MATCH (from:Club)<-[:FROM_CLUB]-(transfer:Transfer)-[:TO_CLUB]->(to:Club),

(transfer)-[:OF_PLAYER]->(player)

WHERE from.name = "Tottenham Hotspur" AND to.name = "Manchester United"

RETURN player.name, transfer.numericFee, transfer.season

Page 61: Webinar: Intro to Cypher
Page 62: Webinar: Intro to Cypher
Page 63: Webinar: Intro to Cypher

MATCH (from:Club)<-[:FROM_CLUB]-(transfer:Transfer)-[:TO_CLUB]->(to:Club),

(transfer)-[:OF_PLAYER]->(player)

WHERE from.name = "Tottenham Hotspur" AND to.name = "Manchester United"

RETURN player.name, transfer.numericFee, transfer.season

Page 64: Webinar: Intro to Cypher
Page 65: Webinar: Intro to Cypher

|------------------------------------------+--------------------+--------------------|

| playerUri | playerName | playerNationality |

|------------------------------------------+--------------------+--------------------|

| /aldair/profil/spieler/4151 | Aldair | Brazil |

| /thomas-hassler/profil/spieler/553 | Thomas Häßler | Germany |

| /roberto-baggio/profil/spieler/4153 | Roberto Baggio | Italy |

| /karl-heinz-riedle/profil/spieler/13806 | Karl-Heinz Riedle | Germany |

| /henrik-larsen/profil/spieler/101330 | Henrik Larsen | Denmark |

| /gheorghe-hagi/profil/spieler/7939 | Gheorghe Hagi | Romania |

| /hristo-stoichkov/profil/spieler/7938 | Hristo Stoichkov | Bulgaria |

| /brian-laudrup/profil/spieler/39667 | Brian Laudrup | Denmark |

| /miguel-angel-nadal/profil/spieler/7676 | Miguel Ángel Nadal | Spain |

|------------------------------------------+--------------------+--------------------|

Page 66: Webinar: Intro to Cypher
Page 67: Webinar: Intro to Cypher

players

id

name

position

nationality

clubs

id

name

country

transfers

id

fee

player_age

player_id

from_club_id

to_club_id

season

Page 68: Webinar: Intro to Cypher

ALTER TABLE players

ADD COLUMN nationality varying(30);

Page 69: Webinar: Intro to Cypher

UPDATE players

SET nationality = 'Brazil'

WHERE players.id = '/aldair/profil/spieler/4151';

UPDATE players

SET nationality = 'Germany'

WHERE players.id ='/ulf-kirsten/profil/spieler/74';

UPDATE players

SET nationality = 'England'

WHERE players.id ='/john-lukic/profil/spieler/28241';

Page 70: Webinar: Intro to Cypher
Page 71: Webinar: Intro to Cypher
Page 72: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row

MATCH (player:Player {id: row.playerUri})

SET player.nationality = row.playerNationality

Page 73: Webinar: Intro to Cypher
Page 74: Webinar: Intro to Cypher

SELECT players.name, clubFrom.name, clubTo.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

WHERE clubFrom.country = 'England' AND clubTo.country = 'England'

AND players.nationality = 'England'

ORDER BY t."numericFee" DESC

LIMIT 10

Page 75: Webinar: Intro to Cypher

SELECT players.name, clubFrom.name, clubTo.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

WHERE clubFrom.country = 'England' AND clubTo.country = 'England'

AND players.nationality = 'England'

ORDER BY t."numericFee" DESC

LIMIT 10

MATCH (to:Club)<-[:TO_CLUB]-(t:Transfer)-[:FROM_CLUB]-(from:Club), (t)-[:OF_PLAYER]->(player:Player)

WHERE to.country = "England" AND from.country = "England" AND player.nationality = "England"

RETURN player.name, from.name, to.name, t.numericFee, t.season

ORDER BY t.numericFee DESC

LIMIT 10

Page 76: Webinar: Intro to Cypher

SELECT players.name, clubFrom.name, clubTo.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

WHERE clubFrom.country = 'England' AND clubTo.country = 'England'

AND players.nationality = 'England'

ORDER BY t."numericFee" DESC

LIMIT 10

MATCH (to:Club)<-[:TO_CLUB]-(t:Transfer)-[:FROM_CLUB]-(from:Club), (t)-[:OF_PLAYER]->(player:Player)

WHERE to.country = "England" AND from.country = "England" AND player.nationality = "England"

RETURN player.name, from.name, to.name, t.numericFee, t.season

ORDER BY t.numericFee DESC

LIMIT 10

Page 77: Webinar: Intro to Cypher
Page 78: Webinar: Intro to Cypher

|----------------------+----------------|| country | confederation ||----------------------+----------------|| Afghanistan | afc || Albania | uefa || Algeria | caf || American Samoa | ofc || Andorra | uefa || Angola | caf || Anguilla | concacaf || Antigua and Barbuda | concacaf || Argentina | conmebol ||----------------------+----------------|

|-----------+-----------+-------------------------------------------------|| urlName | shortName | region ||-----------+-----------+-------------------------------------------------|| afc | AFC | Asia || uefa | UEFA | Europe || ofc | OFC | Oceania || conmebol | CONMEBOL | South America || concacaf | CONCACAF | North American, Central American and Caribbean || caf | CAF | Africa ||-----------+-----------+-------------------------------------------------|

Page 79: Webinar: Intro to Cypher
Page 80: Webinar: Intro to Cypher

players

id

name

position

country_id

clubs

id

name

country_id

transfers

id

fee

player_age

player_id

from_club_id

to_club_id

season

countries

id

name

confederation_id

confederations

id

shortName

name

region

Page 81: Webinar: Intro to Cypher

CREATE TABLE confederations (

"id" character varying(10)

NOT NULL PRIMARY KEY,

"shortName" character varying(50) NOT NULL,

"name" character varying(100) NOT NULL,

"region" character varying(100) NOT NULL

);

Page 82: Webinar: Intro to Cypher

INSERT INTO confederations VALUES('afc', 'AFC', 'Asian Football

Confederation', 'Asia');

INSERT INTO confederations VALUES('uefa', 'UEFA', 'Union of

European Football Associations', 'Europe');

INSERT INTO confederations VALUES('ofc', 'OFC', 'Oceania Football

Confederation', 'Oceania');

Page 83: Webinar: Intro to Cypher

CREATE TABLE countries (

"code" character varying(3)

NOT NULL PRIMARY KEY,

"name" character varying(50)

NOT NULL,

"federation" character varying(10) NOT NULL

REFERENCES confederations (id)

);

Page 84: Webinar: Intro to Cypher

INSERT INTO countries VALUES('MNE', 'Montenegro', 'uefa');

INSERT INTO countries VALUES('LTU', 'Lithuania', 'uefa');

INSERT INTO countries VALUES('CAM', 'Cambodia', 'afc');

INSERT INTO countries VALUES('SUI', 'Switzerland', 'uefa');

INSERT INTO countries VALUES('ETH', 'Ethiopia', 'caf');

INSERT INTO countries VALUES('ARU', 'Aruba', 'concacaf');

INSERT INTO countries VALUES('SWZ', 'Swaziland', 'caf');

INSERT INTO countries VALUES('PLE', 'Palestine', 'afc');

Page 85: Webinar: Intro to Cypher

ALTER TABLE clubs

ADD COLUMN country_id character varying(3)

REFERENCES countries(code);

Page 86: Webinar: Intro to Cypher

UPDATE clubs AS cl

SET country_id = c.code

FROM clubs

INNER JOIN countries AS c

ON c.name = clubs.country

WHERE cl.id = clubs.id;

Page 87: Webinar: Intro to Cypher

# select * from clubs limit 5;

id | name | country | country_id

----------------------------------------+-----------------------------+---------------+------------

/san-jose-clash/startseite/verein/4942 | San Jose Clash | United States | USA

/chicago/startseite/verein/432 | Chicago Fire | United States | USA

/gz-evergrande/startseite/verein/10948 | Guangzhou Evergrande Taobao | China | CHN

/as-vita-club/startseite/verein/2225 | AS Vita Club Kinshasa | Congo DR | CGO

/vicenza/startseite/verein/2655 | Vicenza Calcio | Italy | ITA

(6 rows)

Page 88: Webinar: Intro to Cypher

ALTER TABLE clubs

DROP COLUMN country;

Page 89: Webinar: Intro to Cypher

ALTER TABLE players

ADD COLUMN country_id character varying(3)

REFERENCES countries(code);

Page 90: Webinar: Intro to Cypher

UPDATE players AS p

SET country_id = c.code

FROM players

INNER JOIN countries AS c

ON c.name = players.nationality

WHERE p.id = players.id;

Page 91: Webinar: Intro to Cypher

# select * from players limit 5;

id | name | position | nationality | country_id

-----------------------------------------+-------------------+--------------------+-------------+------------

/dalian-atkinson/profil/spieler/200738 | Dalian Atkinson | Attacking Midfield | England | ENG

/steve-redmond/profil/spieler/177056 | Steve Redmond | Centre Back | England | ENG

/bert-konterman/profil/spieler/6252 | Bert Konterman | Centre Back | Netherlands | NED

/lee-philpott/profil/spieler/228030 | Lee Philpott | Midfield | England | ENG

/tomasz-frankowski/profil/spieler/14911 | Tomasz Frankowski | Centre Forward | Poland | POL

(5 rows)

Page 92: Webinar: Intro to Cypher

ALTER TABLE players

DROP COLUMN nationality;

Page 93: Webinar: Intro to Cypher
Page 94: Webinar: Intro to Cypher
Page 95: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///confederations.csv" AS row

MERGE (c:Confederation {id: row.urlName})

ON CREATE SET c.shortName = row.shortName,

c.region = row.region,

c.name = row.name

Page 96: Webinar: Intro to Cypher

LOAD CSV WITH HEADERS FROM "file:///countries.csv" AS row

MATCH (conf:Confederation {id: row.confederation })

MERGE (country:Country {id: row.countryCode})

ON CREATE SET country.name = row.country

MERGE (country)-[:PART_OF]->(conf)

Page 97: Webinar: Intro to Cypher

MATCH (club:Club)

MATCH (country:Country {name: club.country})

MERGE (club)-[:PART_OF]->(country)

REMOVE club.country

Page 98: Webinar: Intro to Cypher

MATCH (player:Player)

MATCH (country:Country {name: player.nationality})

MERGE (player)-[:PLAYS_FOR]->(country)

REMOVE player.nationality

Page 99: Webinar: Intro to Cypher
Page 100: Webinar: Intro to Cypher

SELECT players.name, clubFrom.name, clubTo.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

WHERE clubFrom.country = 'England' AND clubTo.country = 'England'

AND players.nationality = 'England'

ORDER BY t."numericFee" DESC

LIMIT 10

MATCH (to:Club)<-[:TO_CLUB]-(t:Transfer)-[:FROM_CLUB]-(from:Club), (t)-[:OF_PLAYER]->(player:Player)

WHERE to.country = "England" AND from.country = "England" AND player.nationality = "England"

RETURN player.name, from.name, to.name, t.numericFee, t.season

ORDER BY t.numericFee DESC

LIMIT 10

Page 101: Webinar: Intro to Cypher

SELECT players.name, clubFrom.name, clubTo.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

JOIN countries AS fromCount ON clubFrom.country_id = fromCount.code

JOIN countries AS toCount ON clubTo.country_id = toCount.code

JOIN countries AS playerCount ON players.country_id = playerCount.code

WHERE fromCount.name = 'England' AND toCount.name = 'England' AND playerCount.name = 'England'

ORDER BY t."numericFee" DESC

LIMIT 10

MATCH (to:Club)<-[:TO_CLUB]-(t:Transfer)-[:FROM_CLUB]-(from:Club), (t)-[:OF_PLAYER]->(player:Player),

(player)-[:PLAYS_FOR]->(country:Country), (to)-[:PART_OF]->(country)<-[:PART_OF]-(from)

WHERE country.name = "England"

RETURN player.name, from.name, to.name, t.numericFee, t.season

ORDER BY t.numericFee DESC

LIMIT 10

Page 102: Webinar: Intro to Cypher

SELECT players.name, clubFrom.name, clubTo.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

JOIN countries AS fromCount ON clubFrom.country_id = fromCount.code

JOIN countries AS toCount ON clubTo.country_id = toCount.code

JOIN countries AS playerCount ON players.country_id = playerCount.code

WHERE fromCount.name = 'England' AND toCount.name = 'England' AND playerCount.name = 'England'

ORDER BY t."numericFee" DESC

LIMIT 10

MATCH (to:Club)<-[:TO_CLUB]-(t:Transfer)-[:FROM_CLUB]-(from:Club), (t)-[:OF_PLAYER]->(player:Player),

(player)-[:PLAYS_FOR]->(country:Country), (to)-[:PART_OF]->(country)<-[:PART_OF]-(from)

WHERE country.name = "England"

RETURN player.name, from.name, to.name, t.numericFee, t.season

ORDER BY t.numericFee DESC

LIMIT 10

Page 103: Webinar: Intro to Cypher

SELECT players.name, clubFrom.name, clubTo.name, t."numericFee", t.season

FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

JOIN countries AS fromCount ON clubFrom.country_id = fromCount.code

JOIN countries AS toCount ON clubTo.country_id = toCount.code

JOIN countries AS playerCount ON players.country_id = playerCount.code

WHERE fromCount.name = 'England' AND toCount.name = 'England' AND playerCount.name = 'England'

ORDER BY t."numericFee" DESC

LIMIT 10

MATCH (to:Club)<-[:TO_CLUB]-(t:Transfer)-[:FROM_CLUB]-(from:Club), (t)-[:OF_PLAYER]->(player:Player),

(player)-[:PLAYS_FOR]->(country:Country), (to)-[:PART_OF]->(country)<-[:PART_OF]-(from)

WHERE country.name = "England"

RETURN player.name, from.name, to.name, t.numericFee, t.season

ORDER BY t.numericFee DESC

LIMIT 10

Page 104: Webinar: Intro to Cypher
Page 105: Webinar: Intro to Cypher

SELECT * FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

JOIN countries AS fromCountry ON clubFrom.country_id = fromCountry.code

JOIN countries AS toCountry ON clubTo.country_id = toCountry.code

JOIN confederations AS fromConfederation ON fromCountry.federation = fromConfederation.id

JOIN confederations AS toConfederation ON toCountry.federation = toConfederation.id

WHERE fromConfederation.id = 'afc' AND toConfederation.id = 'uefa'

ORDER BY t."numericFee" DESC

LIMIT 10

MATCH (to:Club)<-[:TO_CLUB]-(t:Transfer)-[:FROM_CLUB]-(from:Club), (t)-[:OF_PLAYER]->(player:Player),

(from)-[:PART_OF*2]->(:Confederation {id: "afc"}),

(to)-[:PART_OF*2]->(:Confederation {id: "uefa"})

RETURN player.name, from.name, to.name, t.numericFee, t.season

ORDER BY t.numericFee DESC

LIMIT 10

Page 106: Webinar: Intro to Cypher

SELECT * FROM transfers AS t

JOIN clubs AS clubFrom ON t.from_club_id = clubFrom.id

JOIN clubs AS clubTo ON t.to_club_id = clubTo.id

JOIN players ON t.player_id = players.id

JOIN countries AS fromCountry ON clubFrom.country_id = fromCountry.code

JOIN countries AS toCountry ON clubTo.country_id = toCountry.code

JOIN confederations AS fromConfederation ON fromCountry.federation = fromConfederation.id

JOIN confederations AS toConfederation ON toCountry.federation = toConfederation.id

WHERE fromConfederation.id = 'afc' AND toConfederation.id = 'uefa'

ORDER BY t."numericFee" DESC

LIMIT 10

MATCH (to:Club)<-[:TO_CLUB]-(t:Transfer)-[:FROM_CLUB]-(from:Club), (t)-[:OF_PLAYER]->(player:Player),

(from)-[:PART_OF*2]->(:Confederation {id: "afc"}),

(to)-[:PART_OF*2]->(:Confederation {id: "uefa"})

RETURN player.name, from.name, to.name, t.numericFee, t.season

ORDER BY t.numericFee DESC

LIMIT 10

Page 107: Webinar: Intro to Cypher
Page 108: Webinar: Intro to Cypher
Page 109: Webinar: Intro to Cypher

# \dt

List of relations

Schema | Name | Type | Owner

--------+----------------+-------+-------------

public | clubs | table | markneedham

public | confederations | table | markneedham

public | countries | table | markneedham

public | players | table | markneedham

public | transfers | table | markneedham

(5 rows)

Page 110: Webinar: Intro to Cypher
Page 111: Webinar: Intro to Cypher

CALL db.labels()

+=============+|label |+=============+|Player |+-------------+|Club |+-------------+|Transfer |+-------------+|Loan |+-------------+|Confederation|+-------------+|Country |+-------------+

Page 112: Webinar: Intro to Cypher

# \d+ countries

Table "public.countries"

Column | Type | Modifiers | Storage | Stats target | Description

------------+-----------------------+-----------+----------+--------------+-------------

code | character varying(3) | not null | extended | |

name | character varying(50) | not null | extended | |

federation | character varying(10) | not null | extended | |

Indexes:

"pk_countries" PRIMARY KEY, btree (code)

Foreign-key constraints:

"countries_federation_fkey" FOREIGN KEY (federation) REFERENCES confederations(id)

Referenced by:

TABLE "players" CONSTRAINT "playersfk" FOREIGN KEY (country_id) REFERENCES countries(code)

MATCH FULL

Page 113: Webinar: Intro to Cypher

CALL db.indexes()

╒════════════════════════╤════════╤══════════════════════╕│"description" │"state" │"type" │╞════════════════════════╪════════╪══════════════════════╡│"INDEX ON :Club(id)" │"ONLINE"│"node_unique_property"│├────────────────────────┼────────┼──────────────────────┤│"INDEX ON :Club(name)" │"ONLINE"│"node_label_property" │├────────────────────────┼────────┼──────────────────────┤│"INDEX ON :Player(id)" │"ONLINE"│"node_unique_property"│├────────────────────────┼────────┼──────────────────────┤│"INDEX ON :Player(name)"│"ONLINE"│"node_label_property" │└────────────────────────┴────────┴──────────────────────┘

Page 114: Webinar: Intro to Cypher

CALL db.constraints()

╒══════════════════════════════════════════════════════════════════════════╕│"description" │╞══════════════════════════════════════════════════════════════════════════╡│"CONSTRAINT ON ( club:Club ) ASSERT club.id IS UNIQUE" │├──────────────────────────────────────────────────────────────────────────┤│"CONSTRAINT ON ( club:Club ) ASSERT exists(club.name)" │├──────────────────────────────────────────────────────────────────────────┤│"CONSTRAINT ON ( player:Player ) ASSERT player.id IS UNIQUE" │├──────────────────────────────────────────────────────────────────────────┤│"CONSTRAINT ON ()-[ of_player:OF_PLAYER ]-() ASSERT exists(of_player.age)"│└──────────────────────────────────────────────────────────────────────────┘

Page 115: Webinar: Intro to Cypher

MATCH (country:Country)

RETURN keys(country), COUNT(*) AS times

+-----------------------+

| keys(country) | times |

+-----------------------+

| ["id","name"] | 198 |

+-----------------------+

Page 116: Webinar: Intro to Cypher

MATCH (club:Club)

RETURN keys(club), COUNT(*) AS times

+---------------------------------+

| keys(club) | times |

+---------------------------------+

| ["id","name"] | 806 |

| ["name","country","id"] | 1 |

+---------------------------------+

Page 117: Webinar: Intro to Cypher
Page 118: Webinar: Intro to Cypher

CALL db.schema()

Page 119: Webinar: Intro to Cypher
Page 120: Webinar: Intro to Cypher

# SELECT * FROM clubs where country_id is null;

id | name | country | country_id

---------------------------------------+-------------------------+---------------+------------

/unknown/startseite/verein/75 | Unknown | |

/pohang/startseite/verein/311 | Pohang Steelers | Korea, South |

/bluewings/startseite/verein/3301 | Suwon Samsung Bluewings | Korea, South |

/ulsan/startseite/verein/3535 | Ulsan Hyundai | Korea, South |

/africa-sports/startseite/verein/2936 | Africa Sports | Cote d'Ivoire |

/monaco/startseite/verein/162 | AS Monaco | Monaco |

/jeonbuk/startseite/verein/6502 | Jeonbuk Hyundai Motors | Korea, South |

/busan/startseite/verein/2582 | Busan IPark | Korea, South |

(8 rows)

Page 121: Webinar: Intro to Cypher

MATCH (club:Club)

WHERE NOT (club)-[:PART_OF]->()

RETURN club

+=====================================================================+

|club |

+=====================================================================+

|{name: Unknown, id: /unknown/startseite/verein/75} |

+---------------------------------------------------------------------+

|{country: Monaco, name: AS Monaco, id: /monaco/startseite/verein/162}|

+---------------------------------------------------------------------+

Page 122: Webinar: Intro to Cypher

# drop table countries;

ERROR: cannot drop table countries because other objects depend

on it

DETAIL: constraint playersfk on table players depends on table

countries

HINT: Use DROP ... CASCADE to drop the dependent objects too.

Page 123: Webinar: Intro to Cypher

MATCH (country:Country)

DELETE country

org.neo4j.kernel.api.exceptions.TransactionFailureException:

Node record Node[11306,used=false,....] still has relationships

Page 124: Webinar: Intro to Cypher

MATCH (country:Country)

DETACH DELETE country

Deleted 198 nodes, deleted 5071 relationships,

statement executed in 498 ms.