Python, Gráf, Programozás (2 órás)

középiskola bármelyik osztály

Gráf alapú adattárolás és programozási alapismeretek
Az szoftverfejlesztés során fontos készség az elvont adatstruktúrák megértése, tervezése és kezelése. Az egyik ilyen alapvető adatstruktúra a gráf, melyet számtalan rendszer használ információ rövid vagy hosszútávú tárolására és az entitások közötti kapcsolatok jelölésére. A szakkör során a tanulók megismerkedhetnek a gráf alapú adatreprezentáció alapjaival. Az elméleti ismeretket gyakorlati példák során szilárdítjuk meg, melyhez az ismert és ipari környezetben is gyakran használt Neo4J gráf alapú adatbázis rendszert használjuk. A rendszer látványos és könnyen érthető grafikus felületén keresztül térképezhetjük fel az adatbázisok tartalmát és szerkezetét. A szakkör célja, hogy a fiatalok a saját világukból és életükből vett problémák megoldásán keresztül ismerjék meg a fenn említett technológiákat és eszközöket.

Mit csinál egy informatikus (szoftverfejlesztő)?

(15 perc)
A tanulók saját tapasztalatai alpján felsoroljuk és megismerjük az informatika szakterületeit.

  • folyamat tervezés
  • adatszerkezet tervezés
  • fejlesztés (kódolás)
  • tesztelés
  • hibajavítás

Mi az a gráf?

(30 perc)
Gráfelméleti alapfogalmak bevezetése.

  • gráf definíció: pontok és élek
  • kapcsolatok leírása gráfként
  • irányítás
  • él-súlyok
  • csomópont-tulajdonságok
  • él-tulajdonságok

Szünet

(10 perc)

Bevezetés a gráf adatbázisok világába

(20 perc)
Neo4J gráf adatbázis szerkezete és a Cypher lekérdező nyelv. Üres adatbázis létrehozása és feltöltése egy példa adatbázison keresztül.

  • Neo4J gráf modell
  • Cypher szintaxis
    • Példa
      MATCH (m:Movie)<-[:RATED]-(u:User) //Search for an existing graph pattern
      WHERE m.title CONTAINS "Matrix" //Filter matching paths to only those matching a predicate
      WITH m.title AS movie, COUNT(*) AS reviews //Count number of paths matched for each movie
      RETURN movie, reviews //Specify columns to be returned by the statement
      ORDER BY reviews DESC //Order by number of reviews, in descending order
      LIMIT 5; //Only return first five records
              
  • minta illesztés
  • változók
  • feltételek
  • rendezés
  • limitek
  • utasítások: paraméterek és visszatérési érték
  • összegző függvények

Gráfadatbázisok a gyakrolatban

(40 perc)
Egy filmajánló rendszer megvalósítása IMDB alapján, egy példa adatbázison keresztül.
Online angol nyelvű oktató anyag elérhető a Neo4J Sandboxban

Keressünk egy példa filmet

match (m:Movie) return m.title

Érdekes filmek lekérdezése felhasználónkként

Ki szeretti még a Crimson Tide-ot?

match (liked:Movie {title: "Crimson Tide"})<-[:RATED]-(user:User)
return *

Milyen más filmeket szeret aki szereti a Crimson Tide-ot?

match (liked:Movie {title: "Crimson Tide"})<-[:RATED]-(user:User)
with liked, user limit 5
match (user)-[:RATED]->(other:Movie)
return * limit 35

Melyik filmet nézzem ha szeretem a Crimson Tide-ot?

match (liked:Movie {title: "Crimson Tide"})<-[:RATED]-(user:User)-[:RATED]->(other:Movie)
return other.title as recommendation, collect(user.name) as usersWhoAlsoWatched, liked.title
limit 10
match (liked:Movie {title: "Crimson Tide"})<-[:RATED]-(user:User)-[:RATED]->(other:Movie)
return other.title as recommendation, count(user) as similarity, liked.title as liked
order by similarity desc limit 10

Hasonló műfajú filmek keresése

halmazelméleti alapok

Jaccard-féle hasonlóság fogalma és kiszámítása

Milyen műfajokba sorolták be az Inception-t?

match (liked:Movie {title: "Inception"})-[:IN_GENRE]->(genre:Genre)
return liked, genre limit 20

Közös műfajok megkeresése

match (liked:Movie {title: "Inception"})-[:IN_GENRE]->(genre:Genre)<-[:IN_GENRE]-(other:Movie)
return liked.title, other.title, collect(genre.name) as intersection limit 20

Melyek az Inception műfajai

match (liked:Movie {title: "Inception"})-[:IN_GENRE]->(genre:Genre)<-[:IN_GENRE]-(other:Movie)
with liked, other, collect(genre.name) as intersection
match (liked)-[:IN_GENRE]->(likedGenre:Genre)
return liked.title, other.title, collect(likedGenre.name) as likedGenres, intersection

A műfajok uniója

match (liked:Movie {title: "Inception"})-[:IN_GENRE]->(genre:Genre)<-[:IN_GENRE]-(other:Movie)
with liked, other, collect(genre.name) as intersection
match (liked)-[:IN_GENRE]->(likedGenre:Genre)
with liked, other, collect(likedGenre.name) as likedGenres, intersection
match (other)-[:IN_GENRE]->(otherGenre:Genre)
with liked.title as liked, other.title as other, likedGenres, intersection, collect(otherGenre.name) as otherGenres
return liked, other, likedGenres, otherGenres, intersection, likedGenres+filter(genre in otherGenres where not genre in likedGenres) as both

Jaccard kiszámítása

match (liked:Movie {title: "Inception"})-[:IN_GENRE]->(genre:Genre)<-[:IN_GENRE]-(other:Movie)
with liked, other, collect(genre.name) as intersection
match (liked)-[:IN_GENRE]->(likedGenre:Genre)
with liked, other, collect(likedGenre.name) as likedGenres, intersection
match (other)-[:IN_GENRE]->(otherGenre:Genre)
with liked.title as liked, other.title as other, likedGenres, intersection, collect(otherGenre.name) as otherGenres
with liked, other, likedGenres, otherGenres, intersection, likedGenres+filter(genre in otherGenres where not genre in likedGenres) as both
return liked, other, intersection, both, (size(intersection)*1.0)/(size(both)*1.0) as jaccard limit 10

Melyik hasonló műfajú filmet nézzem meg?

match (liked:Movie {title: "Inception"})-[:IN_GENRE]->(genre:Genre)<-[:IN_GENRE]-(other:Movie)
with liked, other, collect(genre.name) as intersection
match (liked)-[:IN_GENRE]->(likedGenre:Genre)
with liked, other, collect(likedGenre.name) as likedGenres, intersection
match (other)-[:IN_GENRE]->(otherGenre:Genre)
with liked.title as liked, other.title as other, likedGenres, intersection, collect(otherGenre.name) as otherGenres
with liked, other, likedGenres, otherGenres, intersection, likedGenres+filter(genre in otherGenres where not genre in likedGenres) as both
return liked, other, intersection, both, (size(intersection)*1.0)/(size(both)*1.0) as jaccard
order by jaccard desc limit 10