w gąszczu grafów - toruń jug
TRANSCRIPT
W gąszczu grafówczyli jak zostać bohaterem swoich danych w Neo4j
a code
a codep u b l i c v o i d m ( ) { n ( t h i s ) ;}
p u b l i c s t a t i c n ( O b j e c t o b j ) { i f ( o b j = = n u l l ) { d o S o m e t h i n g ( ) ; }}
inliningp u b l i c v o i d m ( ) { i f ( t h i s = = n u l l ) { d o S o m e t h i n g ( ) ; }}
null check foldingp u b l i c v o i d m ( ) { i f ( f a l s e ) { d o S o m e t h i n g ( ) ; }}
dead code eliminationp u b l i c v o i d m ( ) {
}
and last but not least-XX:+UseFastEmptyMethods
WAT?
W gąszczu grafówczyli jak zostać bohaterem swoich danych w Neo4j
O mnie czyli kim jestemJarek Pałka
Allegro.tech, obecnie tajny projekt o którym nie mogę mówić
JDD/4Developers, naczelny sprawca zamieszania czyli człowiekod kłopotów,
a tak poza tym jeśli cokolwiek ma związek z JVM i HotSpot,bytecode’em, parserami, językami programowania na JVM oraztechnikami JIT, wcześniej czy później się tym zainteresuje :)
były architekt, manager, sysadmin i człowiek od wydajności,
O mnie czyli kim chciałbymbyć
Neo4j, obecnie modelowanie rzeczywistości w grafach, wprzyszłości rozbudowa parsera Cypher, lepsze narzędzia doimportu danych
OpenJDK kontrybutor, może w przyszłym życiu
Python3 na JVM, ale to już na emeryturze :)
Wstęp do grafów
Odświeżający łyk teoriigraf G składa się z dwóch zbiorów – V oraz E, przy czymV jest niepustym zbiorem, którego elementy nazywane sąwierzchołkami, a E jest rodziną dwuelementowych podzbiorów zbioruwierzchołków V, zwanych krawędziami
Gatunki i podgatunkigraf prosty
graf skierowany
graf mieszany
graf z wagami
hipergraf
Ważne pojęciagęstość grafu - stosunek ilości wierzchołków do krawędzi
droga/ścieżka - kolekcja wierzchołków lub krawędzi
cykl - kolekcja połączonych wierzchołków, gdzie pierwszyelement jest taki sam jak ostatni
klika - podzbiór wierzchołków, gdzie istnieje połączeniepomiędzy każdym z każdym
stopień wierzchołka - ilość krawędzi wychodzących zwierzchołka
Algorytmy i inne znane ilubiane pojęcia
algorytmy A*, Dijkstra, Bellman-Ford, Floyd-Warshall,
przeszukiwania grafu wgłąb i wszerz,
"clusters"
"connected components"
"small worlds"
Wstęp do Neo4j
Wstęp do Neo4j“A Graph — records data in › Nodes — which have › Properties”
“Nodes — are organized by › Relationships — which also have › Properties”
“Nodes — are grouped by › Labels — into › Sets”
Słowem wyjaśnieniaNeo4j to baza danych a nie nakładka na inną bazę danych
Własny mechanizm przechowywania danych, zooptymalizowanypod strukturę grafów
Dostępne wsparcie dla następujących modeli:
embedded
serwer (REST)
serwer (binary protocol, prace ciągle trwają)
HA (edycja "enterprise")
Podstawowe elementywęzły ("node")
identyfikator
etykiety ("labels")
własności
Węzeł
Podstawowe elementyrelacje ("relationship")
typ relacji ("relationship type")
kierunek ("direction")
własności
Relacje
Podstawowe elementyschemat ("schema")
indeksy ("index")
ograniczenia ("constraints")
Własności węzłów i relacjiwłasności ("properties")
prymitywy Java (long, int, float, etc.)
łańcuchy znakowe
tablice powyższych
Podstawy Cypher
Podstawy Cypher*Looks like SQL, feels like pattern-matching*
M A T C H ( n : L a b e l ) R E T U R N n ;M A T C H ( n ) - [ : L I K E S ] - > m r e t u r n m ;M A T C H ( n ) - [ r : L I K E S ] - > m r e t u r n r ;
Dopasowywanie w grafach( a ) - - > ( b )( a ) - - > ( b ) < - - ( c )( a : U s e r ) - - > ( b )( a : U s e r : A d m i n ) - - > ( b )( a ) - [ r : R E L _ T Y P E ] - > ( b )( a ) - [ * 2 ] - > ( b )( a ) - [ * 3 . . 5 ] - > ( b )
"Patterns are expressions too"Wzorce dopasowania, są wyrażeniami, które zwracają kolekcję
węzłów i relacji (ścieżek). Wszędzie tam gdzie możesz użyćwyrażenia (klauzula 'WHERE', 'RETURN', 'WITH', etc.), możesz
też użyć wzorców dopasowań.M A T C H a - [ : R E L ] - b W H E R E N O T b - [ : R E L ] - c R E T U R N b ;M A T C H a - [ : R E L ] - b R E T U R N a , b - [ : R E L ] - c ;M A T C H a - [ : R E L ] - b W I T H a , b - [ : R E L ] - c R E T U R N a , c o u n t ( d i s t i n c t c ) ;
Praca z kolekcjamiR E T U R N [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] A S c o l l e c t i o nR E T U R N r a n g e ( 0 , 1 0 ) [ 3 ]R E T U R N l e n g t h ( r a n g e ( 0 , 1 0 ) [ 0 . . 3 ] )R E T U R N [ x I N r a n g e ( 0 , 1 0 ) W H E R E x % 2 = 0 | x ^ 3 ] A S r e s u l t
Predykaty i zawężanie listR E T U R N [ x I N r a n g e ( 0 , 1 0 ) W H E R E x % 2 = 0 | x ^ 3 ] A S r e s u l t ;
W H E R E a . n a m e = ' A l i c e ' A N D b . n a m e = ' D a n i e l ' A N DA L L ( x I N n o d e s ( p ) W H E R E x . a g e > 3 0 ) ;
W H E R E a . n a m e = ' E s k i l ' A N D A N Y ( x I N a . a r r a y W H E R E x = " o n e " ) ;
W H E R E n . n a m e = ' A l i c e ' A N D N O N E ( x I N n o d e s ( p ) W H E R E x . a g e = 2 5 ) ;
W H E R E n . n a m e = ' A l i c e ' A N DS I N G L E ( v a r I N n o d e s ( p ) W H E R E v a r . e y e s = " b l u e " ) ;
M A T C H ( n )W H E R E E X I S T S ( n . n a m e )R E T U R N n . n a m e A S n a m e , E X I S T S ( ( n ) - [ : M A R R I E D ] - > ( ) ) A S i s _ m a r r i e d
ŚcieżkiM A T C H p = ( ( a ) - - ( b ) ) R E T U R N n o d e s ( p )M A T C H p = ( ( a ) - - ( b ) ) R E T U R N r e l a t i o n s h i p s ( p )M A T C H p = ( ( a ) - [ : R A I L S ] - ( b ) ) U N W I N D n o d e s ( p ) A S n r e t u r n D I S T I N C T n ;
PotokiKlauzula 'WITH' umożliwia przetwarzanie zapytań z w potokach,
gdzie wynik poprzedniego zapytania jest przekazywany donastępnego, myślmy o tym jak o '|' w *NIX.
M A T C H ( d a v i d { n a m e : " D a v i d " } ) - ( o t h e r P e r s o n ) - > ( )W I T H o t h e r P e r s o n , c o u n t ( * ) A S f o a fW H E R E f o a f > 1R E T U R N o t h e r P e r s o n
Pułapki CypherPonieważ Cypher jest składniowo, młodszym bratem SQL,wpadniesz w pułapkę pisania zapytań relacyjnych,które będą wykorzystywać iloczyn kartezjański.
To nie jest błogosławiona droga grafu.
Przygotowanie warsztatuNa nośniku USB lub też dla tych połączeniem:
prezentacja
dane do 3 modeli z którymi będziemy pracować
dokumentacja neo4j
neo4j-community-2.2.3
Narzędzia pracykonsola neo4j-shell
konsola interaktywna
Model zerowy, czyli coś narozgrzewkę
Zacznijmy od prostego modelu szkoleń, trenerów i umiejętności.
Model
Przygotowanie danychC R E A T E ( t 0 : T r a i n i n g { t i t l e : " A r c h e o l o g i a k o d u a a r c h i t e k t u r a " } ) , ( n 0 : T r a i n e r { n a m e : " J a r o s ł a w P a ł k a " } ) , ( s 0 : S k i l l { n a m e : " G i t " } ) , ( s 1 : S k i l l { n a m e : " S o n a r Q u b e " } ) , t 0 - [ : A U T H O R E D _ B Y ] - > n 0 , t 0 - [ : R E Q U I R E S ] - > s 0 , t 0 - [ : I N T R O D U C E S ] - > s 1 ;
Ćwiczenie 1Znajdź wszystkie szkolenia przygotowane przez danego trenera.
Ćwiczenie 2Znajdź najszybszą ścieżkę szkoleń o danej umiejętności do innej
docelowej umiejętności.Podpowiedź:Cypher oferuje funkcję 'shortestPath', która zwraca najkrótszą ścieżkę.
reduce na ratunekM A T C H ( a : S k i l l { n a m e : " J a v a " } ) < - [ : R E Q U I R E S ] - ( b : T r a i n i n g )M A T C H ( c : T r a i n i n g ) - [ : I N T R O D U C E S ] - > ( d : S k i l l { n a m e : " R E S T " } )M A T C H p = a l l S h o r t e s t P a t h s ( b - [ r e l s : R E Q U I R E S | I N T R O D U C E S * ] - c )W H E R E l e n g t h ( p ) % 2 = 0 A N D A L L ( i d x i n r a n g e ( 0 , l e n g t h ( p ) - 2 , 2 ) W H E R E t y p e ( r e l sR E T U R N p
Model pierwszy, czyli co kryjeTwoja skrzynka pocztowa
W tym modelu, naszym grafem będzie skrzynka pocztowa.Poszukamy węzłów i krawędzi pośród:
wiadomości email
osób wysyłających i odbierających
Przygotowanie danychAby pracować z tym modelem, należy skopiować zawartość
katalogu datasets/mails.workshop. Zawiera on zanimizowane mailez mojej skrzynki mailowej, celem nadanie ćwiczeniu więcej
realizmu.
Zacznijmy od modeluA poniżej model grafu po zaimportowaniu zawartości skrzynki
pocztowej.
Ćwiczenia 1Wyszukajmy wszystkie maile które są odpowiedzią na innego
maila.Podpowiedź: węzły z etykietą Message posiadają pola Message-Id oraz In-Reply-To.
Ćwiczenie 2Znajdźmy najdłuższy wątek mailowy.
Podpowiedź: na początek spróbuj zidentyfikować te wiadomości, które są początkiem i końcem wątku
Słów kilka o wydajnościzapytań
Cypher umożliwia analizę planu zapytań, w celu ich optymalizacji.E X P L A I NM A T C H ( p : P e r s o n { n a m e : " T o m H a n k s " } )R E T U R N p
P R O F I L EM A T C H ( p : P e r s o n { n a m e : " T o m H a n k s " } )R E T U R N p
Sugestia: Bądź jak najbardziej specyficzny w swych zapytaniach, wykorzystuj etykiety i typy relacji.
Ćwiczenie 2bPrawdopodobnie napisaliście to zapytanie myśląc SQLem i to jaknajbardziej w porządku. Zobaczymy teraz co tak naprawdę potrafi
Neo4j i Cypher, czyli czas na utworzenie nowych relacji.
Indeksy ku chwale wydajnościC R E A T E I N D E X O N : M e s s a g e ( ` I n - R e p l y - T o ` ) ;C R E A T E I N D E X O N : M e s s a g e ( ` M e s s a g e - I d ` ) ;
Sprawdźmy teraz status indeksun e o 4 j - s h ( ? ) $ s c h e m aI n d e x e s O N : M e s s a g e ( I n - R e p l y - T o ) O N L I N E O N : M e s s a g e ( M e s s a g e - I d ) O N L I N EN o c o n s t r a i n t s
Ćwiczenie 2cTym razem wyszukajmy najdłuższego wątku, korzystając z
nowych krawędzi.Podpowiedź:Wzorce w Cypher mogą być traktowane jak wyrażenia,nie pasujący wzorzec zwraca pusty rezultat
Ćwiczenie 3Spróbujmy odnaleźć znajomych w naszej skrzynce, czyli "let’s go
social".
Ćwiczenie 3 / model
Ćwiczenie 4Poszukajmy grup znajomych w naszym grafie.
Podpowiedź:Uwaga na węzeł, który jest znajomym wszystkich,czyli właściciel skrzynki pocztowej, węzeł o id=2.Możemy go usunąc, lub dla zachowania struktury grafu,nadać mu inną etykietę.
Definicja: clusters - tightly knit groups characterised by a relatively high density of ties; this likelihood tends to be greater than the average probability of a tie randomly established between two nodes
Ćwiczenie 4aDwie podstawowe techniki wyznaczania klastrów to "Global
clustering coefficient" oraz "Local clustering coefficient"( ).https://en.wikipedia.org/wiki/Clustering_coefficient
Spróbujmy policzyć współczynnik techniką "local clusteringcoefficient".
Kęs teoriiWspółczynnik ten jest liczony jako prawdopodobieństwo że dwasąsiadujące losowe wybrane węzły także są ze sobą połączone.
=Ci
{ : , ∈ , ∈ E}∣∣ ejk vj vk Ni ejk ∣∣( − 1)ki ki
gdzie sąsiedztwo określamy jako:Ni
= { : ∈ E ∨ ∈ E}Ni vj eij eji
i to liczba sąsiadów danego węzła.ki
Wszystkie ręce na konsoleWystarczy policzyć ilość bezpośrednich sąsiadów, i ilość relacji
pomiędzy nimi.
"Go deeper" Definicja:strongly connected components - a graph is said to be strongly connectedif every vertex is reachable from every other vertex
Dwa podstawowe algorytmy to algorytm Kosaraju oraz algorytmTarjan. Ciągle kombinuję jak zapisać to w Cypher :), dla
wytrwałych nagroda :)
Algorytm Tarjana l g o r i t h m t a r j a n i s i n p u t : g r a p h G = ( V , E ) o u t p u t : s e t o f s t r o n g l y c o n n e c t e d c o m p o n e n t s ( s e t s o f v e r t i c e s )
i n d e x : = 0 S : = e m p t y f o r e a c h v i n V d o i f ( v . i n d e x i s u n d e f i n e d ) t h e n s t r o n g c o n n e c t ( v ) e n d i f e n d f o r
f u n c t i o n s t r o n g c o n n e c t ( v ) / / S e t t h e d e p t h i n d e x f o r v t o t h e s m a l l e s t u n u s e d i n d e x v . i n d e x : = i n d e x v . l o w l i n k : = i n d e x i n d e x : = i n d e x + 1 S . p u s h ( v )
Model drugi, czyli chodźmy dokina na film
W tym celu wykorzystamy bazę , tworzoną w ramachprojektu GroupLens Research, przy Uniwersytecie Stanu
Minnesota. Baza zawiera dane o filmach i rekomendacjach,wykorzystując system ocen punktowych w skali od 1-5.
MovieLens
Zacznijmy od modelu
Szybki kurs hodowania grafówL O A D C S V F R O M ' f i l e : d a t a . c s v ' A S l i n e F I E L D T E R M I N A T O R ' | 'W I T H l i n e [ 0 ] A S f i r s t n a m e , l i n e [ 0 ] A S l a s t n a m eC R E A T E ( : P e r s o n { f i r s t n a m e : f i r s t n a m e , l a s t n a m e : l a s t n a m e } ) ;
L O A D C S V W I T H H E A D E R S F R O M ' f i l e : d a t a . c s v ' A S l i n eC R E A T E ( : P e r s o n { f i r s t n a m e : l i n e . f i r s t n a m e , l a s t n a m e : l i n e . l a s t n a m e } ) ;
Ćwiczenie 1Rekomendacje z wykorzystaniem algorytmu "skip jump", jest to
technika oparta o prostą obserwację. Jeśli dwie osoby mająprzynajmniej jedną relację do tego samego węzła, w tym
przypadku filmu, to oznacza że istnieje wysokieprawdopodobieństwo, że osoba ta polubi także pozostałe filmy
polubione przez te drugą osobę.
Model
Ćwiczenie 2Rekomendacje z wykorzystaniem techniki "hammock", to
rozszerzenie techniki "skip jump", która bazuje na więcej niżjednym elemencie wspólnym dla dwóch wybranych węzłów.
Kolejnym rozwinięciem tej techniki, jest szukanie rekomendacji,gdy dwa lub więcej elementów są tego samego typy/kategorii, np.
gatunek filmowy.Podpowiedź:W pliku u.item zawarte są informacje o gatunku filmowym,spróbujmy je zaimportować do naszej bazy danych.
Ćwiczenie 3A teraz coś bardziej zakręconego, czyli collaborative filtering, k-
nearest neighbors i cosine similarity.
cos(θ) = =A ⋅ B
| |A| | ⋅ | |B| |×∑n
i=1 Ai Bi
⋅∑ni=1 ( )Ai
2− −−−−−−−−√ ∑n
i=1 ( )Bi2
− −−−−−−−−√
Materiały dodatkoweróżnej maści rozszerzenia, geo, rekomendacje czy modelowanieczasu, znajdziecie je na
teoria grafów, czyli od zera do bohatera, jedno z lepszych ibardziej dostępnych opracowań to
algorytmy rekomendacji z wykorzystaniem grafów, zostałyopisane w
czytać, testować, sprawdzać co inni wyczyniają z grafami, czyli
GraphAware extensions
Graph Theory by KeijoRuohonen
Studying Recommendation Algorithms by GraphAnalysis
GraphGist Project
dla prawdziwych "no life"raptem 857 strony "Social Network Analysis: Methods andApplications" autorstwa Stanley Wasserman (nie przebrnąłem)