Neo4j
grafová databáze

 Michal Bachman
   @bachmanm
 #webexpo #neo4j
Not Only SQL

          @bachmanm
Objem dat




            @bachmanm
Propojenost dat
                                                                                      GGG
                                                                              Ontologie

                                                                          RDFa
Propojenost informací




                                                                      Folksonomie
                                                           Tagování

                                                   Wiki

                                                           UGC
                                                   Blogy

                                                 Feedy


                                    Hypertext
                         Textové
                        dokumenty



                                                                                            @bachmanm
Ztráta struktury




                   @bachmanm
Architektura aplikací (80’s)


                     Aplikace




                       DB




                                @bachmanm
Architektura aplikací (90’s)


                 Aplikace   Aplikace   Aplikace




                              DB




                                       @bachmanm
Aplikace   Aplikace   Aplikace




  DB         DB         DB


                                 @bachmanm
Výkonnost RDBMS
            Seznam zaměstnanců                       Relační databáze

                                                     Náročnost aplikace




                            Spousta webových aplikací
Výkonnost




                                                Sociální síť



                                                                 Lokační služby




                                    Komplexita dat

                                                                              @bachmanm
Čtyři kategorie NOSQL




                        @bachmanm
Grafové databáze




                   @bachmanm
@bachmanm
http://en.wikipedia.org/wiki/File:Leonhard_Euler_2.jpg   @bachmanm
http://en.wikipedia.org/wiki/Seven_Bridges_of_Königsberg   @bachmanm
name: Michal Bachman




• vrcholy, uzly (nodes, vertices)
• hrany (relationships, edges)
                                    title: Intro to Neo4j
• vlastnosti (properties)           duration: 45




                    name: Neo4j             name: NOSQL




                                                            @bachmanm
• Výkonný datový model        • Shardování
• Rychlost                      – Ale jsou poměrně dobře
  – Několikanásobně               škálovatelné
    rychlejší pro propojená     – Některé grafy se
    data ve srovnání s            shardovat dají
    RDBMS




                                                   @bachmanm
Výkonnost na příkladu sociální sítě
         (existuje cesta?)
• Experiment:
  • cca 1000 lidí                  # lidí   čas dotazu

  • Každý průměrně 50   Relační    1000     2000ms
                        databáze
    kamarádů
  • pathExists(a,b)
    do hloubky 4
  • Cached (nečteme z
    disku)


                                              @bachmanm
Výkonnost na příkladu sociální sítě
         (existuje cesta?)
• Experiment:
  • cca 1000 lidí                  # lidí   čas dotazu

  • Každý průměrně 50   Relační    1000     2000ms
                        databáze
    kamarádů
                        Neo4j      1000     2ms
  • pathExists(a,b)
    do hloubky 4
  • Cached (nečteme z
    disku)


                                              @bachmanm
Výkonnost na příkladu sociální sítě
         (existuje cesta?)
• Experiment:
  • cca 1000 lidí                  # lidí    čas dotazu

  • Každý průměrně 50   Relační    1000      2000ms
                        databáze
    kamarádů
                        Neo4j      1000      2ms
  • pathExists(a,b)
                        Neo4j      1000000   2ms
    do hloubky 4
  • Cached (nečteme z
    disku)


                                               @bachmanm
Použití grafů
•   Sociální sítě
•   Doporučovací systémy
•   Telekomunikační sítě
•   Business intelligence
•   Geoprostorové problémy
•   MDM
•   ACL (access control lists)
•   Rodokmeny
•   Časové řady dat
•   Web analytics
•   Vědecká informatika (zejména bioinformatika)
•   Indexování pomalých RDBMS
•   Spousta dalších…!


                                                   @bachmanm
Graf nakreslíte na tabuli




                            @bachmanm
@bachmanm
Neo4j




        @bachmanm
32 miliard vrcholů
32 miliard hran
64 miliard vlastností
                        @bachmanm
@bachmanm
http://opfm.jpl.nasa.gov/




                      @bachmanm
http://news.xinhuanet.com




                       @bachmanm
@bachmanm
@bachmanm
Community


  Advanced



    Enterprise


                 @bachmanm
Server mode
  – cd <install directory>
  – bin/neo4j start
  – bin/neo4j stop


• REST API
• JMX, prohlížeč dat, vizualizace



                                    @bachmanm
Embedded mode
• Ve stejném procesu, jako aplikace
  – Stáhnout .jar knihovny
  – Nasměrovat na místo na disku


• Embedded mode má naprostou většinu funkcí




                                       @bachmanm
name: Jan Šrůtek



title: Kognitivní psychologie
duration: 30                                            name: Michal Bachman




                                        name: UX



                                                        title: Intro to Neo4j
                                                        duration: 45

    name: Martin Macke




       name: Aleš Havlík   INTERESTED   name: Neo4j   name: NOSQL




                                                                    @bachmanm
GraphDatabaseService neo = new EmbeddedGraphDatabase("/data/webexpo");

Transaction tx = neo.beginTx();
try {
      Node speaker = neo.createNode();
      speaker.setProperty("name", "Michal Bachman");

    Node talk = neo.createNode();
    talk.setProperty("title", "Intro to Neo4j");

    Relationship delivers
         = speaker.createRelationshipTo(talk,
              DynamicRelationshipType.withName("DELIVERS"));
    delivers.setProperty("day", ”Saturday");

      neo.index().forNodes("people")
             .add(speaker, "name", "Michal Bachman");
} finally {
      tx.finish();
}


      name: Michal Bachman                 DELIVERS     title: Intro to Neo4j
                                        day: Saturday

                                                                         @bachmanm
@bachmanm
Core API
• Vrcholy
  – Vlastnosti (volitelné KV páry)
• Hrany
  – Počáteční vrchol (start, povinný)
  – Konečný vrchol (konec, povinný)
  – Vlastnosti (volitelné KV páry)




                                        @bachmanm
Jaká jsou na WebExpu témata?
 (Give me all WebExpo topics)




                           @bachmanm
name: Jan Šrůtek



title: Kognitivní psychologie
duration: 30                                            name: Michal Bachman




                                        name: UX



                                                        title: Intro to Neo4j
                                                        duration: 45

    name: Martin Macke




       name: Aleš Havlík   INTERESTED   name: Neo4j   name: NOSQL




                                                                    @bachmanm
Jaká jsou na WebExpu témata?
    Node webExpo = neo.getReferenceNode();
    for (Relationship talksAt : webExpo.getRelationships(INCOMING, TALKS_AT)) {
          Node speaker = talksAt.getStartNode();
          for (Relationship delivers : speaker.getRelationships(OUTGOING, DELIVERS)) {
                Node talk = delivers.getEndNode();
                for (Relationship about : talk.getRelationships(OUTGOING, ABOUT)) {
                      String topicName = (String) about.getEndNode().getProperty(NAME);
                      //add to result...
                }
          }
    }




-------------------
Printing all topics
All topics: development, data, advertising, education, usa, business, microsoft, webdesign, software,
responsiveness, ux, e-commerce, php, psychology, crm, api, chef, javascript, patterns, product design,
marketing, metro, social media, web, startup, analytics, lean, cqrs, node.js, branding, cloud, testing, neo4j,
rest, css, design, publishing, nosql. Took: 2 ms
Na jaké přednášky mám jít?
(Which talks should I attend?)




                             @bachmanm
name: Jan Šrůtek



title: Kognitivní psychologie
duration: 30                                            name: Michal Bachman




                                        name: UX



                                                        title: Intro to Neo4j
                                                        duration: 45

    name: Martin Macke




       name: Aleš Havlík   INTERESTED   name: Neo4j   name: NOSQL




                                                                    @bachmanm
Na jaké přednášky mám jít?
   TraversalDescription talksTraversal = Traversal.description()
        .uniqueness(Uniqueness.NONE)
        .breadthFirst()
        .relationships(INTERESTED, OUTGOING)
        .relationships(ABOUT, INCOMING)
        .evaluator(Evaluators.atDepth(2));

   Node attendee =
        neo.index().forNodes("people").get("name", ”Aleš Havlík").getSingle();

   Iterable<Node> talks = talksTraversal.traverse(attendee).nodes();

   //iterate over talks and print




------------------------------------------
Suggesting talks for 100 random attendees.
...
Aneta Lebedová: Co nezměříš, nezměníš!, Do ameriky, The real me. Took: 1 ms
Bohumír Kubát: Beyond the polar bear, Jak (ne)dělat api, Critical interface design. Took: 1 ms
Vladimír Valeš: Vývoj aplikací pro windows 8 metro. Took: 1 ms
Suggested talks for 100 random attendees in 449 ms
Co máme společného?
(What do we have in common?)




                          @bachmanm
name: Jan Šrůtek



title: Kognitivní psychologie
duration: 30                                            name: Michal Bachman




                                        name: UX



                                                        title: Intro to Neo4j
                                                        duration: 45

    name: Martin Macke




       name: Aleš Havlík   INTERESTED   name: Neo4j   name: NOSQL




                                                                    @bachmanm
Co máme společného?
      //retrieve attendeeOne and attendeeTwo from index

      int maxDepth = 2;
      Iterable<Path> paths = GraphAlgoFactory
            .allPaths(Traversal.expanderForAllTypes(), maxDepth)
            .findAllPaths(attendeeOne, attendeeTwo);

      for (Path path : paths) {
            //print it
      }



------------------------------------------------------------
Finding things in common for 100 random couples of attendees
...
Karel Kunc and Aleš Matějka:

(Karel Kunc)--[INTERESTED]-->(ux)<--[INTERESTED]--(Aleš Matějka),
(Karel Kunc)--[DISLIKED]-->(Buď punkový konzument!)<--[DISLIKED]--(Aleš Matějka),
(Karel Kunc)--[DISLIKED]-->(Beyond the polar bear)<--[LIKED]--(Aleš Matějka),
(Karel Kunc)--[LIKED]-->(Shipito.com - podnikání v usa)<--[LIKED]--(Aleš Matějka).
Took: 0 ms.
...

Found things in common for 100 random couples of attendees in 142 ms.
Y U No Like Java?




                    @bachmanm
S kým na pivo?
         (Who is my beer mate?)

myself                       beerMate:?




                talk:?



                                   @bachmanm
S kým na pivo?

(myself)                    (beerMate)




               (talk)



                                  @bachmanm
S kým na pivo?
start myself=node:people(name = "Emil Votruba")

match (myself)-[:LIKED]->(talk)<-[:LIKED]-(beerMate)

return distinct beerMate.name, count(beerMate)

order by count(beerMate) desc

limit 5;




                                                       @bachmanm
Cypher Query
start myself=node:people(name = ”Aleš Havlík")

match (myself)-[:LIKED]->(talk)<-[:LIKED]-(beerMate)

return distinct beerMate.name, count(beerMate)

order by count(beerMate) desc

limit 5;




                                                       @bachmanm
Cypher Query
start myself=node:people(name = ”Aleš Havlík")

match (myself)-[:LIKED]->()<-[:LIKED]-(beerMate)

return distinct beerMate.name, count(beerMate)

order by count(beerMate) desc

limit 5;




                                                   @bachmanm
S kým na pivo?




                 @bachmanm
Novinky a budoucnost
• Verze 1.8.RC1 vydána tento měsíc
• Cypher dotazy mohou zapisovat do grafu
  – CREATE, SET, DELETE, …
• “Labels” pro vrcholy (1.9?)
• Zaměření na škálovatelnost a shardování




                                            @bachmanm
Tipy a triky
•   Design!
•   Nepoužívejte interní ID mimo Neo4j
•   Vyvarujte se operací přes celý graf
•   “Tales from the Trenches” pro další tipy
•   Experimetujte:
    git@github.com:bachmanm/neo4j-
    webexpo.git


                                               @bachmanm
Závěr
• Neo4j 1.8 community edition je zdarma
• Grafy mají expresivní datový model
• Neo4j rychle prochází grafy
  – Žádné joiny
  – Žádné šílené indexy
  – Žádný map reduce
• Podpora nejen Javy


                                          @bachmanm
http://www.561studios.com/blog/wp-content/uploads/2010/07/commonsense.jpg
Otázky?
Neo4j: http://neo4j.org
Neo Technology: http://neotechnology.com
OpenCredo: http://opencredo.com
Já: @bachmanm
Kód: git://github.com/bachmanm/neo4j-webexpo.git

WebExpo Prague 2012 - Introduction to Neo4j (Czech)

  • 1.
    Neo4j grafová databáze MichalBachman @bachmanm #webexpo #neo4j
  • 2.
    Not Only SQL @bachmanm
  • 3.
    Objem dat @bachmanm
  • 4.
    Propojenost dat GGG Ontologie RDFa Propojenost informací Folksonomie Tagování Wiki UGC Blogy Feedy Hypertext Textové dokumenty @bachmanm
  • 5.
  • 6.
    Architektura aplikací (80’s) Aplikace DB @bachmanm
  • 7.
    Architektura aplikací (90’s) Aplikace Aplikace Aplikace DB @bachmanm
  • 8.
    Aplikace Aplikace Aplikace DB DB DB @bachmanm
  • 9.
    Výkonnost RDBMS Seznam zaměstnanců Relační databáze Náročnost aplikace Spousta webových aplikací Výkonnost Sociální síť Lokační služby Komplexita dat @bachmanm
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
    name: Michal Bachman •vrcholy, uzly (nodes, vertices) • hrany (relationships, edges) title: Intro to Neo4j • vlastnosti (properties) duration: 45 name: Neo4j name: NOSQL @bachmanm
  • 16.
    • Výkonný datovýmodel • Shardování • Rychlost – Ale jsou poměrně dobře – Několikanásobně škálovatelné rychlejší pro propojená – Některé grafy se data ve srovnání s shardovat dají RDBMS @bachmanm
  • 17.
    Výkonnost na příkladusociální sítě (existuje cesta?) • Experiment: • cca 1000 lidí # lidí čas dotazu • Každý průměrně 50 Relační 1000 2000ms databáze kamarádů • pathExists(a,b) do hloubky 4 • Cached (nečteme z disku) @bachmanm
  • 18.
    Výkonnost na příkladusociální sítě (existuje cesta?) • Experiment: • cca 1000 lidí # lidí čas dotazu • Každý průměrně 50 Relační 1000 2000ms databáze kamarádů Neo4j 1000 2ms • pathExists(a,b) do hloubky 4 • Cached (nečteme z disku) @bachmanm
  • 19.
    Výkonnost na příkladusociální sítě (existuje cesta?) • Experiment: • cca 1000 lidí # lidí čas dotazu • Každý průměrně 50 Relační 1000 2000ms databáze kamarádů Neo4j 1000 2ms • pathExists(a,b) Neo4j 1000000 2ms do hloubky 4 • Cached (nečteme z disku) @bachmanm
  • 20.
    Použití grafů • Sociální sítě • Doporučovací systémy • Telekomunikační sítě • Business intelligence • Geoprostorové problémy • MDM • ACL (access control lists) • Rodokmeny • Časové řady dat • Web analytics • Vědecká informatika (zejména bioinformatika) • Indexování pomalých RDBMS • Spousta dalších…! @bachmanm
  • 21.
    Graf nakreslíte natabuli @bachmanm
  • 22.
  • 23.
    Neo4j @bachmanm
  • 24.
    32 miliard vrcholů 32miliard hran 64 miliard vlastností @bachmanm
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
    Community Advanced Enterprise @bachmanm
  • 31.
    Server mode – cd <install directory> – bin/neo4j start – bin/neo4j stop • REST API • JMX, prohlížeč dat, vizualizace @bachmanm
  • 32.
    Embedded mode • Vestejném procesu, jako aplikace – Stáhnout .jar knihovny – Nasměrovat na místo na disku • Embedded mode má naprostou většinu funkcí @bachmanm
  • 33.
    name: Jan Šrůtek title:Kognitivní psychologie duration: 30 name: Michal Bachman name: UX title: Intro to Neo4j duration: 45 name: Martin Macke name: Aleš Havlík INTERESTED name: Neo4j name: NOSQL @bachmanm
  • 34.
    GraphDatabaseService neo =new EmbeddedGraphDatabase("/data/webexpo"); Transaction tx = neo.beginTx(); try { Node speaker = neo.createNode(); speaker.setProperty("name", "Michal Bachman"); Node talk = neo.createNode(); talk.setProperty("title", "Intro to Neo4j"); Relationship delivers = speaker.createRelationshipTo(talk, DynamicRelationshipType.withName("DELIVERS")); delivers.setProperty("day", ”Saturday"); neo.index().forNodes("people") .add(speaker, "name", "Michal Bachman"); } finally { tx.finish(); } name: Michal Bachman DELIVERS title: Intro to Neo4j day: Saturday @bachmanm
  • 36.
  • 37.
    Core API • Vrcholy – Vlastnosti (volitelné KV páry) • Hrany – Počáteční vrchol (start, povinný) – Konečný vrchol (konec, povinný) – Vlastnosti (volitelné KV páry) @bachmanm
  • 38.
    Jaká jsou naWebExpu témata? (Give me all WebExpo topics) @bachmanm
  • 39.
    name: Jan Šrůtek title:Kognitivní psychologie duration: 30 name: Michal Bachman name: UX title: Intro to Neo4j duration: 45 name: Martin Macke name: Aleš Havlík INTERESTED name: Neo4j name: NOSQL @bachmanm
  • 40.
    Jaká jsou naWebExpu témata? Node webExpo = neo.getReferenceNode(); for (Relationship talksAt : webExpo.getRelationships(INCOMING, TALKS_AT)) { Node speaker = talksAt.getStartNode(); for (Relationship delivers : speaker.getRelationships(OUTGOING, DELIVERS)) { Node talk = delivers.getEndNode(); for (Relationship about : talk.getRelationships(OUTGOING, ABOUT)) { String topicName = (String) about.getEndNode().getProperty(NAME); //add to result... } } } ------------------- Printing all topics All topics: development, data, advertising, education, usa, business, microsoft, webdesign, software, responsiveness, ux, e-commerce, php, psychology, crm, api, chef, javascript, patterns, product design, marketing, metro, social media, web, startup, analytics, lean, cqrs, node.js, branding, cloud, testing, neo4j, rest, css, design, publishing, nosql. Took: 2 ms
  • 41.
    Na jaké přednáškymám jít? (Which talks should I attend?) @bachmanm
  • 42.
    name: Jan Šrůtek title:Kognitivní psychologie duration: 30 name: Michal Bachman name: UX title: Intro to Neo4j duration: 45 name: Martin Macke name: Aleš Havlík INTERESTED name: Neo4j name: NOSQL @bachmanm
  • 43.
    Na jaké přednáškymám jít? TraversalDescription talksTraversal = Traversal.description() .uniqueness(Uniqueness.NONE) .breadthFirst() .relationships(INTERESTED, OUTGOING) .relationships(ABOUT, INCOMING) .evaluator(Evaluators.atDepth(2)); Node attendee = neo.index().forNodes("people").get("name", ”Aleš Havlík").getSingle(); Iterable<Node> talks = talksTraversal.traverse(attendee).nodes(); //iterate over talks and print ------------------------------------------ Suggesting talks for 100 random attendees. ... Aneta Lebedová: Co nezměříš, nezměníš!, Do ameriky, The real me. Took: 1 ms Bohumír Kubát: Beyond the polar bear, Jak (ne)dělat api, Critical interface design. Took: 1 ms Vladimír Valeš: Vývoj aplikací pro windows 8 metro. Took: 1 ms Suggested talks for 100 random attendees in 449 ms
  • 44.
    Co máme společného? (Whatdo we have in common?) @bachmanm
  • 45.
    name: Jan Šrůtek title:Kognitivní psychologie duration: 30 name: Michal Bachman name: UX title: Intro to Neo4j duration: 45 name: Martin Macke name: Aleš Havlík INTERESTED name: Neo4j name: NOSQL @bachmanm
  • 46.
    Co máme společného? //retrieve attendeeOne and attendeeTwo from index int maxDepth = 2; Iterable<Path> paths = GraphAlgoFactory .allPaths(Traversal.expanderForAllTypes(), maxDepth) .findAllPaths(attendeeOne, attendeeTwo); for (Path path : paths) { //print it } ------------------------------------------------------------ Finding things in common for 100 random couples of attendees ... Karel Kunc and Aleš Matějka: (Karel Kunc)--[INTERESTED]-->(ux)<--[INTERESTED]--(Aleš Matějka), (Karel Kunc)--[DISLIKED]-->(Buď punkový konzument!)<--[DISLIKED]--(Aleš Matějka), (Karel Kunc)--[DISLIKED]-->(Beyond the polar bear)<--[LIKED]--(Aleš Matějka), (Karel Kunc)--[LIKED]-->(Shipito.com - podnikání v usa)<--[LIKED]--(Aleš Matějka). Took: 0 ms. ... Found things in common for 100 random couples of attendees in 142 ms.
  • 47.
    Y U NoLike Java? @bachmanm
  • 48.
    S kým napivo? (Who is my beer mate?) myself beerMate:? talk:? @bachmanm
  • 49.
    S kým napivo? (myself) (beerMate) (talk) @bachmanm
  • 50.
    S kým napivo? start myself=node:people(name = "Emil Votruba") match (myself)-[:LIKED]->(talk)<-[:LIKED]-(beerMate) return distinct beerMate.name, count(beerMate) order by count(beerMate) desc limit 5; @bachmanm
  • 51.
    Cypher Query start myself=node:people(name= ”Aleš Havlík") match (myself)-[:LIKED]->(talk)<-[:LIKED]-(beerMate) return distinct beerMate.name, count(beerMate) order by count(beerMate) desc limit 5; @bachmanm
  • 52.
    Cypher Query start myself=node:people(name= ”Aleš Havlík") match (myself)-[:LIKED]->()<-[:LIKED]-(beerMate) return distinct beerMate.name, count(beerMate) order by count(beerMate) desc limit 5; @bachmanm
  • 53.
    S kým napivo? @bachmanm
  • 54.
    Novinky a budoucnost •Verze 1.8.RC1 vydána tento měsíc • Cypher dotazy mohou zapisovat do grafu – CREATE, SET, DELETE, … • “Labels” pro vrcholy (1.9?) • Zaměření na škálovatelnost a shardování @bachmanm
  • 55.
    Tipy a triky • Design! • Nepoužívejte interní ID mimo Neo4j • Vyvarujte se operací přes celý graf • “Tales from the Trenches” pro další tipy • Experimetujte: git@github.com:bachmanm/neo4j- webexpo.git @bachmanm
  • 56.
    Závěr • Neo4j 1.8community edition je zdarma • Grafy mají expresivní datový model • Neo4j rychle prochází grafy – Žádné joiny – Žádné šílené indexy – Žádný map reduce • Podpora nejen Javy @bachmanm
  • 57.
  • 58.
    Otázky? Neo4j: http://neo4j.org Neo Technology:http://neotechnology.com OpenCredo: http://opencredo.com Já: @bachmanm Kód: git://github.com/bachmanm/neo4j-webexpo.git

Editor's Notes

  • #2 VitejteDobrý den, jájsem Michal Bachman a rádbychdnespředstavil open-source grafovoudatabázi Neo4J a podělil se s Vámi o některézkušenosti s jejímpoužívánímZeptat se, koliklidíslyšelo o grafovýchdatabázích, kdo je používáExistujeněkolikgrafovýchdatabází (OrientDB, AllegroGraph) a my se dneszaměřímenanejpopulárnější z nich, která se jmenuje Neo4J. Jápracuju v Londýnějakokonzultant pro firmu OpenCredo, která je blízkýmpartneremŠvédsko-Americkéfirmy Neo Technology. Neo Technology je firma, kterástojízavývojem Neo4J.Bylo by těžkémluvit o Neo4J, anižbychommělijasnoupředstavu, kamzapadá v celkemnepřehlednémsvětě NOSQL technologií, takženejdříverychlezrekapitulujeme NOSQL.Potompředstavímgrafovédatabáze a Neo4j.Následujepraktickáčást, kdesiukážem, jakpracovat s daty v Neo4j.Jápoužívám Neo4J naopravdovýchprojektech pro klientybezpřestávky od října 2011, čilitéměřrok, a tak se v závěrečnéčástiprezentacepřednáškypodělím o některédůležitézkušenosti z tohotoobdobí. To budedoufámužitečnézejména pro těchpárjedinců, kteří se přihlásilijakosoučasníuživateléčity, kteří o používání Neo4J vážněuvažují.Nakonec se podívámena to, co násčeká v příštíchdnech, měsících a letechBudu se snažitnazávěrnechatdostatekprostorunaotázky----- Meeting Notes (20/09/2012 15:25) -----kdo se nehlasil, nebojte, prednaska je urcena hlavne Vamale i na zkusene a pokrocile dojde, na zaver se podivame na tipy a triky
  • #3 Slychamehodne, nezdrzovatdlouhoProc ted? Neprobudili,rel DB jsou OK naspoustuproblemuExistuji trendy, kteredaly NOSQL zivot, 4 pripomenuNOSQL je trend, o kterémslýchámehodně, takže se u nějnebuduzdržovatpřílišdlouho. Nicménědatabáze, o kterébudememluvit je s tímtotrendemspojen a tak je důležitéudělatsiobrázek o tom, kamvesvětě NOSQL Neo4j zapadá. V prvnířaděbychrádzdůratnil, žejsemjedním z těch, kteřísivykládají NOSQL jako NOSQL, ne NoSQL a takhlemyšlenka se v tétopřednášceještěněkolikrátobjeví.Pročprávěteď?Není to proto, žejsme se všichnijeden den ránoprobudili a řeklisi, žerelačnímodely a databázejsounuda a proto musímepřijít s něčímvíc cool. Relačnídatabázenejsoutotižvůbecšpatnávěc, naopak. Existujespoustadobrýchproduktůpostavenýchnarelačníchdatabázích a spoustaskvělých, nabušenýchwebových, desktopovýchimobilníchaplikací a systémů, kterétytoproduktypoužívají. Zatěchněkolikdesítek let, co jsourelačnídatabázenasvětějsmejimsvěřiliobrovskákvanta dat. Ale v našemoboruexitujíurčité trendy, kterédalytomuto NOSQL hnutíživot. Vybraljsem 4, kterébychrádkrátcepřipomenul.
  • #4 Jendím z nichjsoudnodušeobjemydat, kterélidstvogenruje, zpracovává a ukládá. Ukazuje se, že pro tradičnírelačnídatabáze je velikostdat, se kteroudnespracujeme, stálevětší a většíproblém.
  • #5 Srostoucímobjememdatroste I propojenost/složitost/komplexitadatUGC = User Generated ContentGGG = Giant Global Graph (what the web will become) – každýkousíček, každájednotkazajímavýchdat je sémantickypropojená s každoudalšízajímavoujednotkoudat (Tim Berners-Lee)Data jsoupropojenější (lineárně)RDFa (Resource Description Framework in attributes), českysystémpopisuzdrojů v atributech, je technologie pro přenosstrukturovanýchinformacíuvnitřwebovýchstránek. RDFa je jedenzezpůsobůzápisu (serializace) datovéhoformátu Resource Description Framework (RDF). Ontologie je v informaticevýslovný (explicitní) a formalizovanýpopisurčitéproblematiky. Je to formální a deklarativníreprezentace, kteráobsahujeglosář (definicipojmů) a tezaurus (definicivztahůmezijednotlivýmipojmy). Ontologie je slovníkem, kterýslouží k uchovávání a předáváníznalostitýkající se určitéproblematiky.
  • #6 Data majívětšíobjem, jsoupropojenější a ztácenípředpovídatelnoustrukturuDochází k Individualizaci dat. Přestávábýtjednoduchézařaditkaždéhojedince do škatulkypodlepřesněnadefinovanýchkritérií, chci, abymoje data byla o mě.Tvardat se mění, dá se dalekohůřpředpovídatjejichstrukturaVlastnímodelyceléhosvětaVíceinformací o každémsubjektuDecentralizacetvorbyobsahu trend zrychluje
  • #7 Dalšímtrendem je to, jakstavíme software,neboliarchitekturaaplikací. Typickáaplikace 80. let vypadalaasitakhle.
  • #9 No a v 21. století, aťuž ten trendnazívámecloudemnebo ne, směřujeme k rozkouskovánítěchtradičníchmonolytickýchaplikacínamenší, samostatné, mezisebouintegrovanémikroaplikace.Poznamenatžeteďmůžeme pro každou z aplikacízvolitdatabázi, kterátukonkrétníaplikacidávásmysl. REST, hypermedia, composite micro-appsClarify
  • #10 Ale mimochodem, promnohověcíjsourelačnídatabázestálenaprosto v pořádku. Seznamzaměstnancůnapřiklad, data kterápřirozeněvypadajíjakotabulkypatřínaprostologicky do relačnídatabáze.Pro spoustuwebovýchaplikací, dokonce pro webovéaplikacekteréjsouveřejněpřístupné.Ale v momentě, kdy se začnemepohybovatdopravapoose X do prostoru, kde se komplexitadatzvětšuje, data jsoupropojenější a propojenější a objemná, relačnídatabázepřestávajíbýttímsprávnýmřešením.BTW: komplexita = funkceobjemu, propojenosti a strukturydatTakže: pro transakčnízpracovánítabulárníchdat a pro menšíwebovéaplikace, relačnídatabáze je OK! Pro jinýtypdatsimusímevybratjiné NOSQL řešení.This is strictly about connected data – joins kill performance there.No bashing of RDBMS performance for tabular transaction processingGreen line denotes “zone of SQL adequacy”
  • #11 Krásavesvětě NOSQL - nikdovámnepřikazuje, vybratdatabázi, kteráodpovídátypučicharakteristicedat, se kterýmipracujete. key-value databáze: jedenklíč - jednahodnota, hash mapy, Redis, Riak (Amazon Dynamo), Většinouvysocetolerantnívůčivýpadkům, Jednoduchýdatový model, Vynikajícíhorizontálníškálovatelnost, Dostupnost, BigTabledatabáze: k-vvvvvvv store s implicitnímiindexy, Cassandra (Google), PodporačástečněstrukturovanýchdatAutomatický index (sloupce), Dobráhorizontálníškálovatelnost, opětnevhodné pro propojená dataDokumentovédatabáze, známá je například subversion, MongoDB, CouchDB, …Kolekcedokumentů, Dokument je kolekce key-value párů, Index je důležitý, hodně map-reduce,Škálovatelnostcelkemdobrá. (Ne takjako key-value, složitějšímdatovýmmodelem, Jednoduchý a výkonýdatový model, jako subversion.Nevýhodouvšech 3 je nejsouúplněvhodné pro hustěpropojená data. Přílišjednoduchýdatový (HashMap, rychlá, ale…) model znamená, žechceme-li získatjakékolivokamžitéhlubšíporozuměníuloženýmdatům. Musí to býtzodpovědnostíaplikačnívrstvy (čili to musímenějaknaprogramovat). Velmičastojsoutedytytodatabázespojeny s frameworkyjako Map-Reduce, pro kterémusímevytvořitúlohy, kterénámtotoporozuměníumožnízískat.Map-reduce je dávkováoperace (to bychuvedl v kontrastu s on-line / in-the-click-stream synchronníoperací), abystezískalipohlednavašepropojená data.Všechny 3 pracují s agregovanýmidaty, tzn. Ževyžadujístruktutupředem, data, kterápatřílogicky k sobě (jakoobjednávka a jejíjednotlivépoložky), jsou v databáziuloženy u sebe a je k nimtaké v dotazechpřistupovánojako k celku. V key-value úložištích je tímcelkemhodnota, v CF CF a v Dok. Dbsdokumenty.OKvpřípadech, kdypřístup k datůmvyžadujepřesnětutostrukturu. Pokud se ale chcemena data podívatjinak, napříkladanalyzovat z objednávekcelkovéprodejejednotlivýchproduktů, musíme s toustrukturoutrochubojovat a to je ten důvod, proč se tolikmluví o map-reduce vespojení s těmitodatabázemi. Výhodouukládánídat v neagregovanýchformách je to, že se dajíanalyzovat a prezentovat z různáchúhlůpohledy v závislotinakonkrétnímpřípadě.A samozřejměgrafovédatabáze, kvůlikterýmtudnesjsme a o kterých se tohodozvíme o něcovíczaminutku
  • #12 Od teď se konečněbudemebavit o grafovýchdatabázích. Co to jsoutygrafy? V žádnémpřípadě se nejedná o grafnaobrázku, ale o bavíme se o grafech v matematickémslovasmyslu. Udělejmesitedykratičkouodbočku do teoriegrafů, nebojte se, žádnámatematikaVásnečeká
  • #13 Teoriegrafůzkoumávlastnostistruktur, zvanýchgrafy. Ty jsoutvořenyvrcholy, kteréjsouvzájemněspojenéhranami. Znázorňuje se obvyklejakomnožinabodůspojenýchčárami. Formálně je grafuspořádanoudvojicímnožinyvrcholů V a množinyhran E.
  • #14 Tradičně se zazakladateleteoriegrafůpovažuješvýcarskýmatematik Leonhard Euler, kterýroku 1736 řešilúlohu, jakprojítpřessedmmostů v Královci (každý z nichprávějednou) a vrátit se do výchozíhomísta. To v moderníteoriiodpovídápojmueulerovskýgraf.
  • #15 SedmmostůměstaKrálovce (dnes Kaliningrad)Kdodělá pro velkoufirmu, tímmyslímněkolikvrstevmanagementu, softwarovýarchitektnajinémpatřenežvývojářiTatoinformace je pro Vás, v těchtofirmáchbývátěžképrosadit “nové” technologie. Ale relační model, se kterýmpřišel E.F. Codd v roce 1969, je pouze 43 let starý. Grafový model je 276 starý. TakžepříštěažVámšéfnebochytrýarchitektřeknenaadopci NOSQL něcovesmyslu “tadypoužívámejenomzralé a prokázanévyspělétechnologie”, víte, kterýmsměrem ho máteposlat… tímmámnamyslitřebatutopřednáškunawebunebopříslušnéstránkynawikipedii. Takžejakukládáme data v grafu…
  • #16 Takžejakukládáme data v grafu…V grafuukládámedata jakovrcholy a vrcholyjsouvlastnědokumenty, kterémodoumítlibovolnéklíče a k nimpřiřazenéhodnoty. Stejnějakodokument v MongoDB. V čem se grafliší od MongoDB je že v grafujsouvztahymezivrcholy. A to je trade-off, MongoDB je lépeškálovatelné, protožetohlenedělá. Neo4J je lepší pro propojená data, tohledělá. Ukládávztahymezijednotlivýmivrcholy. Ale nenítakdobřeškálovatelné. A do musímevzít v potazpřiřešeníVašichproblémů: chcetemasivníškálovatelnost, nebookamžitýnáhled do propojenostiVašich dat. POPSAT GRAFVztahymajisemantickyvyznam! Recnici, prednasky v RDBMSJe to poměrněintuitivnízpůsobukládánídat! Úkolgrafovédatabáze je vzíttatointuitivní data, kterásimůžemejednodušenačrtnoutnatabulinebokuspapíru a rychle je procházetvevašichprogramech.
  • #17 Sílatohotomodeluspočívá v tom, že je velicedobrý pro hustěpropojená (komplexní – objem, propojenost, struktura) data. Vrcholy a hranyzprostředkovávajípřirozený index a umožňujíokamžitýnáhled do vztahůmezivěcmi.Jsoutakyvelicerychlé v procházení / traversování, což je většinouveliceobtížné v relačníchdatabázích, protože je zapotřebíjoinovattabulky.Na druhoustranu je extréměobtížnéškálovatgrafstějnějakotřeba K-V úložiště, protožegrafyjsouproměnlivé, dynamické, neustále se mění. Některégrafy se shardovatdají, ale pro některé je nemožnédosáhnoutstejnéškálovatelnostishardováním, jakotřeba u dokumentovýchdatabází.
  • #18 Grafovédatabázejsounaprostoskvělé v některýchsituacích. Tady je malý experiment.Popsat experiment
  • #20 Protože Neo4J a ostatnínativnígrafovédatabázenetrpí JOIN problémemrelačníchdatabází, nemusíjoinovattabulky, tak ten výkonzůstanena 2ms i pro miliardulidí. V relačníchdatabázíchbudoujoinynavětších a většíchsadáchdatpomalejší a pomalejší.
  • #21 Na jakétypyproblémůjsougrafydobré? Spoustadalšíchproblémů… pro kterébystesipředtoutopřednáškoumožnázvolilirelačnídatabázi, ale třebatomubudezítrajinakS Neo4J pracuji v produkčnímnasazeníužpřesrok a úspěšnějsme s nímimplementovalijednupoměrněvelkousociálnísíť s prvkydoporučovacíhosystému, kteráběží v Británii a Americe pro cca 500k uživatelů, Pliny, pivo, playstationfrancouzskoutelekomunikačníspolečnostnaanalýzudopaduporuch v síti (asi 2M vrcholů / nód) a v produkčnímplánováníjednéněmeckéautomobilky.Najednouuvidítegrafyvšude----- Meeting Notes (18/09/2012 17:14) -----zasazeny
  • #22 A to je jednahezkávlastnostgrafů – jsouideální pro tabule,zadnístranyobálek, pivníchtácků a krabiček od cigaret… to jsouvěci, nakterýchtynejlepšídesigny (zejménavestartupech) většinouvznikajíJájsemsivybraljakopříkladWebExpo, původnějsemchtělzmapovatkorupčníaféryčeskýchpolitiků, ale tohle je o něconeškodnější. Vztahymeziřečníky, přednáškam, tématy, účastníky a podobněsimůžemenakreslitnapivnítácek! WebExpo je doména,kterámáspoustuvztahů – řečnícimajípřednášky, …To simůžetejednodušenakreslitnatabuli, to je mimochodem to, co dělámejakoprogramátoři, kdyžsedíme s lidmi, kteřípotřebujínějakýkussoftwaru a my se snažímetomu business problému, tédoméněporozumět. Sednemsi k tabuli, nakreslímezákazníky, objednávky, faktury, produkty a podobně a vztahymezinimi!A co udělámepak – vezmemenášpěkný design a denormalizujeme ho. Potíme se vymýšlením, jak to všechnonaládujeme do tabulek. A jsmešťastní a usměvaví, než to zpustímenaživo, do provozu…. A ono to bežíjakželva… Co uděláme? Denormalitzujemenáš model! Všechnaenergie, kteroujsmeinvestovali, krev, pot a slzy, všechno v niveč. U grafovédatabáze, to co je napapíře je přesně to, co naházíte do databáze.
  • #23 To neznamená,žejsteomluveni s designovéfáze. Pořád se musítehlubocezamysletnadtím, jaké entity (neboobjekty) tvořívašidoménu a jakéjsoumezinimivztahy! Stálepotřebujete design.Nemůžetejednoduševzít data ztabulek, kterámáte a násilím je natřískat do vašízbrusunovégrafovédatabáze. Člověkmusízačítmyslet v nódách a vztazích.Přinavrhovánídatovéhomodelu pro WebExpomusímeudělathodnědesignovýchrozhodnutí: jakodlišitřečníky od účastníků? A je to vůbecpotřeba? Udělatzepátka a sobotynódy, nebojenomvlastnostnajednotlivýchpřednáškách?Stálemusítedělat design, ale pointa je že design datovéhomodelu pro grafovoudatabázimůžebýtpříjemná a přirozenázkušenost.
  • #24 Stará se proVás o nódy, vztahymezinimi a indexy.Neo4j je stabilní a běží od roku 2003ProcházíaktivnímvývojemPrimárně pro Javu, ale použitelná se spoustoudalšíchtechnologiíIdeální pro škáludesítekserverů v clusteru, ne pro stovkyPro hustěpropojená data, není to KV store
  • #25 32 billion nodes, 32 billion relationships, 64 billion properties
  • #26 Plně a militantně ACID. Kdoneví, co to znamená?Rychlevysvětlit: atomicity, consistency, isolation, durabilityNěkterédalší NOSQL databáze se vzdávajíněkterýchgarancíveprospěchvýkonu, u Neo4j tohlevypnoutnejde. Data jsouvždyzapsánana disk.
  • #27 Vyhledatzacatek v indexu (Lucene)Prozkoumavatokoli
  • #28 Vyhledatzacatek v indexu (Lucene)Prozkoumavatokoli
  • #29 Neo mázabudovanoucelouknihovnugrafovýchalgoritmů, jakonejkratšícesta, všechnycesty, atp
  • #30 1m hops zasekundunanormálnímlaptopu, žádnýrozdílpřiznásobenípočtudatHigh performance graph operationsTraverses 1,000,000+ relationships / second on commodity hardware
  • #31 Obecněpokudpoužíváte MySQL a neplatítezaněj, nebudeteplatitaniza Neo.
  • #33 Včetně HA, online backup
  • #34 Pojďmesikázatpoužití v embedded módunakonkrétnímpříkladu. Vytvořiljsemgraf z webexpa, řečníci a přednáškyjsouopravdové, 1000 účastníkůmánáhodněvygenerovanájména. Popsatgraf a scénář.KdonečteJavuKodbudenagithubu
  • #35 Vztahymůžoubýtbuďřetězceznaků, neboEnum, kterévámdajívýhodustatickéhotypování v IDE, pro Neo4j v tom nenížádnýrozdíl.Postupopakujemedokudnemámecelýgraf
  • #36 Tohle je screenshot z webovékonzole, kdemůžemegrafvizálněprocházet. Běžínalaptopu, dámVámnakonci URL, abystesi s tímmohlipohrát.Tak, mámegraf, ale jak z nějteďdostaneme data ven?
  • #37 Existujeněkolikzpůsobů,jakpsátdotazy v Neo4j, liší se čitelností, složitostí, výkonem a úrovníabstrakce. UkážuVámněkterézezpůsobů a začnuodspoda, tzn. On nativníhonejrychlejšího API.
  • #38 Core API pracujepřímo s jednotkami, kteréjsme do databázeuložili – vrcholy, hrany a jejichvlastnosti.
  • #40 Podívejme se ještějednounavelýgraf. Novýgrafmávždyjednunódu s ID 0, z téjsmeudělalliWebExpo.
  • #41 Tohle je imperativní API, všechnupráciděláprogramátor, je nejvýkonnější
  • #42 Pojďme se podívat o úroveňvýš co se abstrakcetýčenatakzvané traversal API, kterénámumožnípsátdotazydeklarativně, to znamenápopsat, jakchcemegrafprocházet. Samotnéprocházeníudělá Neo4J zanás.
  • #44 Můžemepsátvlastníevaluatory
  • #45 Dalšípovedenoufunkcí je knihovnaalgoritmů pro hledánícestmezidvěmauzly.
  • #47 Takénejkratšícesta, Dijkstra a další
  • #48 Těžké pro neprogramátory, pojďmě se podívatnaněcojednoduššího
  • #50 Na nejvyššíúrovniabstrakce Neo4j zprostředkovávásvůjvlastníjazyk pro psanídotazů, částečněinspirovaný SQL. Ten jazyk se jmenuje Cypher a rozumílidskyčitelnýmpříkazům, jakonapříkladtomu, kterýtadyteďvidíte.
  • #51 Musímenědezačít, napomocsivezmeme index s názvem people, kdenajdemepanaEmilaVotrubupodlejména.Dálemusímeupřesnit, co za data vlastněchcemezískat, v tomtopřípadějménočlověka a skóre, kolikvěcímámespolečnýchNakonecasinechcemejítnapivoúplně se všemi, ale janomřekněme s 5 lidmi, se kterýmitohomámespolečnéhonejvícAsividítevliv SQL----- Meeting Notes (09/09/2012 20:18) -----animace
  • #52 Musímenědezačít, napomocsivezmeme index s názvem people, kdenajdemepanaEmilaVotrubupodlejména.Dálemusímeupřesnit, co za data vlastněchcemezískat, v tomtopřípadějménočlověka a skóre, kolikvěcímámespolečnýchNakonecasinechcemejítnapivoúplně se všemi, ale janomřekněme s 5 lidmi, se kterýmitohomámespolečnéhonejvícAsividítevliv SQL----- Meeting Notes (09/09/2012 20:18) -----animace
  • #53 Musímenědezačít, napomocsivezmeme index s názvem people, kdenajdemepanaEmilaVotrubupodlejména.Dálemusímeupřesnit, co za data vlastněchcemezískat, v tomtopřípadějménočlověka a skóre, kolikvěcímámespolečnýchNakonecasinechcemejítnapivoúplně se všemi, ale janomřekněme s 5 lidmi, se kterýmitohomámespolečnéhonejvícAsividítevliv SQL----- Meeting Notes (09/09/2012 20:18) -----animace
  • #54 A výsledek pro panavotrubu.
  • #56 náhodnádoporučení, dávkovéoperace, atd.
  • #58 Můžemeudělat z relačnídatabáze key-value store, stejnějako z dokumentovédatabázegrafovou, ale proč?NOSQL Vámumožňujevybratsi ten nejvhodnějšídatový model pro konrétníproblém, pakdatabázi, kterátímtomodelemdisponuje.Vybíratdatabázi (a jakoukolivjinoutechnologii) rozumně a pragmaticky je poslednírada, se kteroubych se s Vámirádrozloučil.
  • #59 Odkaznaslajdy dam na twitterCastokladenouotazkou