Lynintroduksjon til grafdatabaser og Neo4j

39
En lynintroduksjon til grafdatabaser og Neo4j Aleksander M. Stensby aleksander (dot) stensby (at) gmail (dot) com

description

Lightningtalk about neo4j and graph databases, given at the javaBin Vestfold meetup on the 19th of March. (In Norwegian)

Transcript of Lynintroduksjon til grafdatabaser og Neo4j

Page 1: Lynintroduksjon til grafdatabaser og Neo4j

En lynintroduksjon til grafdatabaser og Neo4j

Aleksander M. Stensby

aleksander (dot) stensby (at) gmail (dot) com

Page 2: Lynintroduksjon til grafdatabaser og Neo4j

Agenda

• Intro til grafdatabaser og modellering

• Intro til neo4j og Cypher

• (Intro til SpringData Neo4j)

Page 3: Lynintroduksjon til grafdatabaser og Neo4j

... på 15 minutter!

Page 4: Lynintroduksjon til grafdatabaser og Neo4j

Relasjondatabaser suger...

Page 5: Lynintroduksjon til grafdatabaser og Neo4j

...på relasjoner

Page 6: Lynintroduksjon til grafdatabaser og Neo4j

Relasjondatabaser er fantastisk på aggregering av data, mapping av

skjemaer og tabell data!

Page 7: Lynintroduksjon til grafdatabaser og Neo4j

MEN

Page 8: Lynintroduksjon til grafdatabaser og Neo4j

vi har en tendens til å tvinge _alle_

problemstillinger inn i relasjondatabasene våre!

Page 9: Lynintroduksjon til grafdatabaser og Neo4j

Join-hell..

Rekursjon...

Null-sjekking...

Page 10: Lynintroduksjon til grafdatabaser og Neo4j

NoSQL Størrelse

Kompleksitet

Grafer

Dokument

BigTable

KV

Page 11: Lynintroduksjon til grafdatabaser og Neo4j

NoSQL Størrelse

Kompleksitet

Grafer

Dokument

BigTable

KV

90% Milliarder av noder og relasjoner

Page 12: Lynintroduksjon til grafdatabaser og Neo4j

Venner av venner...

Page 13: Lynintroduksjon til grafdatabaser og Neo4j

Person ID Navn

Venner PersonID VennID

«Aleks» sine venners venner?

SELECT p1.Person AS PERSON, p2.Person AS VENN_AV_VENN FROM Venner v1 JOIN Person p1 ON v1.PersonID = p1.ID JOIN Venner v2 ON v2.VennID = v1.VennID JOIN Person p2 ON v2.VennID = p2. ID WHERE p1.Navn = 'Aleks‘ AND v2.VennID <> p1.ID

Page 14: Lynintroduksjon til grafdatabaser og Neo4j

Kilde: Neo4j in Action

1,000,000 personer

Dybde RDBMS Neo4j Antall rader

2 0.016 0.01 ~ 2500

3 30.267 0.168 ~ 110,000

4 1543.505 1.359 ~ 600,000

5 DNF 2.132 ~ 800,000

Page 15: Lynintroduksjon til grafdatabaser og Neo4j
Page 16: Lynintroduksjon til grafdatabaser og Neo4j

En grafdatabase...

• benytter grafstrukturer med – Noder

– Relasjoner

– Attributter

• til å lagre informasjon!

• Ypperlig til relasjoner – men ikke best på aggregering av data

Page 17: Lynintroduksjon til grafdatabaser og Neo4j

En graf lagrer data i noder

ALEKS RAYMOND

Page 18: Lynintroduksjon til grafdatabaser og Neo4j

Relasjoner knytter noder sammen

FRIENDS_WITH

ALEKS RAYMOND

Page 19: Lynintroduksjon til grafdatabaser og Neo4j

Noder har attributter

ALEKS RAYMOND

Age: 29 First Name: Aleksander Last Name: Stensby

Age: 31 First Name: Raymond Last Name: Koteng

FRIENDS_WITH

Page 20: Lynintroduksjon til grafdatabaser og Neo4j

Relasjoner kan også ha attributter

ALEKS RAYMOND

Age: 29 First Name: Aleksander Last Name: Stensby

Age: 31 First Name: Raymond Last Name: Koteng

FRIENDS_WITH Since: 01.01.2004

Page 21: Lynintroduksjon til grafdatabaser og Neo4j

Relasjoner kan gå flere veier

ALEKS RAYMOND

Age: 29 First Name: Aleksander Last Name: Stensby

Age: 31 First Name: Raymond Last Name: Koteng

FRIENDS_WITH Since: 01.01.2004

FRIENDS_WITH Since: 01.01.2004

Page 22: Lynintroduksjon til grafdatabaser og Neo4j

ALEKS RAYMOND

Age: 29 First Name: Aleksander Last Name: Stensby

Age: 31 First Name: Raymond Last Name: Koteng

FRIENDS_WITH Since: 01.01.2004

Page 23: Lynintroduksjon til grafdatabaser og Neo4j

ALEKS RAYMOND

Age: 29 First Name: Aleksander Last Name: Stensby Type: Person

Age: 31 First Name: Raymond Last Name: Koteng Type: Person

FRIENDS_WITH Since: 01.01.2004

forskjellige typer av noder

Page 24: Lynintroduksjon til grafdatabaser og Neo4j

Person Person

Sport

Programmeringspråk

Drikke

Person

Page 25: Lynintroduksjon til grafdatabaser og Neo4j

Neo4j – [ER_EN] -> Property Graph

Page 26: Lynintroduksjon til grafdatabaser og Neo4j

Cypher

"Make the simple things simple, and the complex things possible"

Page 27: Lynintroduksjon til grafdatabaser og Neo4j

Intro til Cypher

• START

• MATCH

• WHERE

• RETURN

• CREATE

• DELETE

• SET

• FOREACH

• WITH

Page 28: Lynintroduksjon til grafdatabaser og Neo4j

Beskriv hva du ønsker å hente ut med PATTERNS

(a)-[r]->(b)

Page 29: Lynintroduksjon til grafdatabaser og Neo4j

(Aleks) – [FRIENDS_WITH] -> (Raymond)

Page 30: Lynintroduksjon til grafdatabaser og Neo4j

MATCH

MATCH (movie:Movie)

RETURN movie

Page 31: Lynintroduksjon til grafdatabaser og Neo4j

WHERE

MATCH movie

WHERE move.title = ‘Blade Runner'

RETURN movie

Page 32: Lynintroduksjon til grafdatabaser og Neo4j

Venner...

MATCH (aleks)-[:KNOWS]->(friend)

WHERE aleks.firstName= 'Aleks'

RETURN friend.firstName

Page 33: Lynintroduksjon til grafdatabaser og Neo4j

Venners venner...

MATCH (aleks)-[:KNOWS]->(friend)-[:KNOWS]->(friend_of_friend)

WHERE aleks.firstName= 'Aleks'

RETURN friend_of_friend.firstName

Page 34: Lynintroduksjon til grafdatabaser og Neo4j

Venners venner...

MATCH (aleks)-[:KNOWS*2]->(friend_of_friend)

WHERE aleks.firstName= 'Aleks'

RETURN friend_of_friend.firstName

Page 35: Lynintroduksjon til grafdatabaser og Neo4j

Venners venner...

MATCH (aleks)-[:KNOWS*2..2]->(friend_of_friend)

WHERE aleks.firstName= 'Aleks'

AND NOT (aleks)-[:KNOWS]->(friend_of_friend)

RETURN friend_of_friend.firstName

Page 36: Lynintroduksjon til grafdatabaser og Neo4j

på 1-2-3

DEMO

Page 37: Lynintroduksjon til grafdatabaser og Neo4j

Og mye mye mer...

• Traversals navigerer grafen • Traversals identifiserer paths • Paths ordner noder • Cypher parametere • Indexes • Neo4j embedded, Neo4j REST • Neo4j 2.x – Labels og automatiske indekser • Gremlin (procedural) – Cypher (declarative) • Enterprise (multi-instance cluster, online backup) • Neo4j Spatial

Page 38: Lynintroduksjon til grafdatabaser og Neo4j

Lessons Learned

• Vær forsiktig med versjoner og oppgraderinger… – Neo 1.9.x -> Neo 2.x kan by på mange problemer

– Spring Data Neo4j != Neo4j

• Noder er “first-class” citizens I grafen – Hyperedges støttes ikke -> kan bruke “event nodes”

• Dyrt å aggregere - caching av stats på noder!

• Unike og ekspressive relasjonstyper

Page 39: Lynintroduksjon til grafdatabaser og Neo4j