Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Webinar: Intro to Cypher

523 vues

Publié le

In this webinar we'll explore a data set using Neo4j and Cypher and compare the approach we might take with a relational database and SQL. We'll cover the following topics: Modeling the data set Importing the data Querying the data Evolving the model and queries as the data changes.

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Webinar: Intro to Cypher

  1. 1. |---------+--------------------+-----------------------------------------+--------------------+------------| | 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 | |---------+--------------------+-----------------------------------------+--------------------+------------|
  2. 2. |-------------------+---------------------+-------------------------------------+--------------------| | 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 | |-------------------+---------------------+-------------------------------------+--------------------|
  3. 3. |----------------+--------------------+-------------------------------------+-------------------| | 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 | |----------------+--------------------+-------------------------------------+-------------------|
  4. 4. |--------------------------------------------------------+-------------+---------------| | 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 | |--------------------------------------------------------+-------------+---------------|
  5. 5. players id name position clubs id name country transfers id fee player_age player_id from_club_id to_club_id season
  6. 6. Records in tables Nodes "Soft" relationships computed at query time "Hard" relationships built into the data store
  7. 7. CREATE TABLE players ( "id" character varying(100) NOT NULL PRIMARY KEY, "name" character varying(150) NOT NULL, "position" character varying(20) );
  8. 8. 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');
  9. 9. CREATE TABLE clubs ( "id" character varying(100) NOT NULL PRIMARY KEY, "name" character varying(50) NOT NULL, "country" character varying(50) );
  10. 10. 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');
  11. 11. 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) );
  12. 12. 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');
  13. 13. LOAD CSV WITH HEADERS FROM "(file|http)://" AS row MATCH (:Label {property: row.header}) CREATE (:Label {property: row.header}) MERGE (:Label {property: row.header})
  14. 14. LOAD CSV WITH HEADERS FROM "(file|http)://" AS row MATCH (:Label {property: row.header}) CREATE (:Label {property: row.header}) MERGE (:Label {property: row.header})
  15. 15. LOAD CSV WITH HEADERS FROM "(file|http)://" AS row MATCH (:Label {property: row.header}) CREATE (:Label {property: row.header}) MERGE (:Label {property: row.header})
  16. 16. LOAD CSV WITH HEADERS FROM "(file|http)://" AS row MATCH (:Label {property: row.header}) CREATE (:Label {property: row.header}) MERGE (:Label {property: row.header})
  17. 17. LOAD CSV WITH HEADERS FROM "(file|http)://" AS row MATCH (:Label {property: row.header}) CREATE (:Label {property: row.header}) MERGE (:Label {property: row.header})
  18. 18. LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row RETURN COUNT(*)
  19. 19. LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row RETURN row LIMIT 1
  20. 20. LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row CREATE (player:Player { id: row.playerUri, name: row.playerName, position: row.playerPosition })
  21. 21. LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row CREATE (player:Player { id: row.playerUri, name: row.playerName, position: row.playerPosition })
  22. 22. CREATE CONSTRAINT ON (player:Player) ASSERT player.id IS UNIQUE
  23. 23. 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]
  24. 24. 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
  25. 25. CREATE CONSTRAINT ON (club:Club) ASSERT club.id IS UNIQUE
  26. 26. 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;
  27. 27. CREATE CONSTRAINT ON (transfer:Transfer) ASSERT transfer.id IS UNIQUE
  28. 28. 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)
  29. 29. 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)
  30. 30. 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)
  31. 31. 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)
  32. 32. CREATE CONSTRAINT ON (club:Club) ASSERT club.id IS UNIQUE
  33. 33. CREATE CONSTRAINT ON (club:Club) ASSERT exists(club.name)
  34. 34. CREATE CONSTRAINT ON ()-[player:OF_PLAYER]-() ASSERT exists(player.age)
  35. 35. SELECT * FROM players WHERE players.name = 'Cristiano Ronaldo'
  36. 36. SELECT * FROM players WHERE players.name = 'Cristiano Ronaldo' MATCH (player:Player { name: "Cristiano Ronaldo" }) RETURN player
  37. 37. SELECT * FROM players WHERE players.name = 'Cristiano Ronaldo' MATCH (player:Player { name: "Cristiano Ronaldo" }) RETURN player
  38. 38. SELECT * FROM players WHERE players.name = 'Cristiano Ronaldo' MATCH (player:Player { name: "Cristiano Ronaldo" }) RETURN player
  39. 39. 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'
  40. 40. 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
  41. 41. 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
  42. 42. 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
  43. 43. |------------------------------------------+--------------------+--------------------| | 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 | |------------------------------------------+--------------------+--------------------|
  44. 44. players id name position nationality clubs id name country transfers id fee player_age player_id from_club_id to_club_id season
  45. 45. ALTER TABLE players ADD COLUMN nationality varying(30);
  46. 46. 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';
  47. 47. LOAD CSV WITH HEADERS FROM "file:///transfers.csv" AS row MATCH (player:Player {id: row.playerUri}) SET player.nationality = row.playerNationality
  48. 48. 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
  49. 49. 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
  50. 50. 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
  51. 51. |----------------------+----------------| | 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 | |-----------+-----------+-------------------------------------------------|
  52. 52. 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
  53. 53. 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 );
  54. 54. 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');
  55. 55. 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) );
  56. 56. 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');
  57. 57. ALTER TABLE clubs ADD COLUMN country_id character varying(3) REFERENCES countries(code);
  58. 58. 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;
  59. 59. # 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)
  60. 60. ALTER TABLE clubs DROP COLUMN country;
  61. 61. ALTER TABLE players ADD COLUMN country_id character varying(3) REFERENCES countries(code);
  62. 62. 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;
  63. 63. # 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)
  64. 64. ALTER TABLE players DROP COLUMN nationality;
  65. 65. 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
  66. 66. 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)
  67. 67. MATCH (club:Club) MATCH (country:Country {name: club.country}) MERGE (club)-[:PART_OF]->(country) REMOVE club.country
  68. 68. MATCH (player:Player) MATCH (country:Country {name: player.nationality}) MERGE (player)-[:PLAYS_FOR]->(country) REMOVE player.nationality
  69. 69. 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
  70. 70. 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
  71. 71. 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
  72. 72. 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
  73. 73. 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
  74. 74. 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
  75. 75. # 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)
  76. 76. CALL db.labels() +=============+ |label | +=============+ |Player | +-------------+ |Club | +-------------+ |Transfer | +-------------+ |Loan | +-------------+ |Confederation| +-------------+ |Country | +-------------+
  77. 77. # 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
  78. 78. 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" │ └────────────────────────┴────────┴──────────────────────┘
  79. 79. 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)"│ └──────────────────────────────────────────────────────────────────────────┘
  80. 80. MATCH (country:Country) RETURN keys(country), COUNT(*) AS times +-----------------------+ | keys(country) | times | +-----------------------+ | ["id","name"] | 198 | +-----------------------+
  81. 81. MATCH (club:Club) RETURN keys(club), COUNT(*) AS times +---------------------------------+ | keys(club) | times | +---------------------------------+ | ["id","name"] | 806 | | ["name","country","id"] | 1 | +---------------------------------+
  82. 82. CALL db.schema()
  83. 83. # 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)
  84. 84. 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}| +---------------------------------------------------------------------+
  85. 85. # 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.
  86. 86. MATCH (country:Country) DELETE country org.neo4j.kernel.api.exceptions.TransactionFailureException: Node record Node[11306,used=false,....] still has relationships
  87. 87. MATCH (country:Country) DETACH DELETE country Deleted 198 nodes, deleted 5071 relationships, statement executed in 498 ms.
  88. 88. github.com/neo4j-meetups/cypher-for-sql-developers

×