Lynintroduksjon til grafdatabaser og Neo4j

Post on 29-Nov-2014

417 views 2 download

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

En lynintroduksjon til grafdatabaser og Neo4j

Aleksander M. Stensby

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

Agenda

• Intro til grafdatabaser og modellering

• Intro til neo4j og Cypher

• (Intro til SpringData Neo4j)

... på 15 minutter!

Relasjondatabaser suger...

...på relasjoner

Relasjondatabaser er fantastisk på aggregering av data, mapping av

skjemaer og tabell data!

MEN

vi har en tendens til å tvinge _alle_

problemstillinger inn i relasjondatabasene våre!

Join-hell..

Rekursjon...

Null-sjekking...

NoSQL Størrelse

Kompleksitet

Grafer

Dokument

BigTable

KV

NoSQL Størrelse

Kompleksitet

Grafer

Dokument

BigTable

KV

90% Milliarder av noder og relasjoner

Venner av venner...

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

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

En grafdatabase...

• benytter grafstrukturer med – Noder

– Relasjoner

– Attributter

• til å lagre informasjon!

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

En graf lagrer data i noder

ALEKS RAYMOND

Relasjoner knytter noder sammen

FRIENDS_WITH

ALEKS RAYMOND

Noder har attributter

ALEKS RAYMOND

Age: 29 First Name: Aleksander Last Name: Stensby

Age: 31 First Name: Raymond Last Name: Koteng

FRIENDS_WITH

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

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

ALEKS RAYMOND

Age: 29 First Name: Aleksander Last Name: Stensby

Age: 31 First Name: Raymond Last Name: Koteng

FRIENDS_WITH Since: 01.01.2004

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

Person Person

Sport

Programmeringspråk

Drikke

Person

Neo4j – [ER_EN] -> Property Graph

Cypher

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

Intro til Cypher

• START

• MATCH

• WHERE

• RETURN

• CREATE

• DELETE

• SET

• FOREACH

• WITH

Beskriv hva du ønsker å hente ut med PATTERNS

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

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

MATCH

MATCH (movie:Movie)

RETURN movie

WHERE

MATCH movie

WHERE move.title = ‘Blade Runner'

RETURN movie

Venner...

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

WHERE aleks.firstName= 'Aleks'

RETURN friend.firstName

Venners venner...

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

WHERE aleks.firstName= 'Aleks'

RETURN friend_of_friend.firstName

Venners venner...

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

WHERE aleks.firstName= 'Aleks'

RETURN friend_of_friend.firstName

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

på 1-2-3

DEMO

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

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