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