no sql
play

No SQL? Image credit: http://browsertoolkit.com/fault-tolerance.png - PowerPoint PPT Presentation

No SQL? Image credit: http://browsertoolkit.com/fault-tolerance.png No SQL? Image credit: http://browsertoolkit.com/fault-tolerance.png No SQL? Image credit: http://browsertoolkit.com/fault-tolerance.png Neo4j the benefits of graph databases


  1. No SQL? Image credit: http://browsertoolkit.com/fault-tolerance.png

  2. No SQL? Image credit: http://browsertoolkit.com/fault-tolerance.png

  3. No SQL? Image credit: http://browsertoolkit.com/fault-tolerance.png

  4. Neo4j the benefits of graph databases + a NOSQL overview QCon London 2010 #neo4j Emil Eifrem @emileifrem emil@neotechnology.com CEO, Neo Technology

  5. What's the plan? Why now? – Four trends NOSQL overview Graph databases && Neo4j A production example of Neo4j Conclusions

  6. Trend 1: data set size 40 2007 Source: IDC 2007

  7. 988 Trend 1: data set size 40 2010 2007 Source: IDC 2007

  8. Trend 2: connectedness Giant Global Information connectivity Graph (GGG) Ontologies RDF Folksonomies Tagging User- Wikis generated content Blogs RSS Hypertext Text web 1.0 web 2.0 “web 3.0” documents 1990 2000 2010 2020

  9. Trend 3: semi-structure Individualization of content! In the salary lists of the 1970s, all elements had exactly one job In the salary lists of the 2000s, we need 5 job columns! Or 8? Or 15? Trend accelerated by the decentralization of content generation that is the hallmark of the age of participation (“web 2.0”)

  10. Aside: RDBMS performance Relational database Salary List Performance Majority of Webapps Social network Semantic } Trading custom Data complexity

  11. Trend 4: architecture 1990s: Database as integration hub

  12. Trend 4: architecture 2000s: (Slowly towards...) Decoupled services with own backend

  13. Why NOSQL 2009? Trend 1: Size. Trend 2: Connectivity. Trend 3: Semi-structure. Trend 4: Architecture.

  14. NOSQL overview

  15. First off: the name NoSQL is NOT “Never SQL” NoSQL is NOT “No To SQL”

  16. NOSQL is simply N ot O nly SQL !

  17. Four (emerging) NOSQL categories Key-value stores Based on Amazon's Dynamo paper Data model: (global) collection of K-V pairs Example: Dynomite, Voldemort, Tokyo* BigTable clones Based on Google's BigTable paper Data model: big table, column families Example: HBase, Hypertable, Cassandra

  18. Four (emerging) NOSQL categories Document databases Inspired by Lotus Notes Data model: collections of K-V collections Example: CouchDB, MongoDB Graph databases Inspired by Euler & graph theory Data model: nodes, rels, K-V on both Example: AllegroGraph, Sones, Neo4j

  19. NOSQL data models Data size Key-value stores Bigtable clones Document databases Graph databases Data complexity

  20. NOSQL data models Data size Key-value stores Bigtable clones Document databases Graph databases (This is still billions of nodes & relationships) 90% of use cases Data complexity

  21. Graph DBs & Neo4j intro

  22. The Graph DB model: representation Core abstractions: name = “Emil” age = 29 Nodes sex = “yes” Relationships between nodes 1 2 1 2 Properties on both type = KNOWS 3 3 time = 4 years type = car vendor = “SAAB” model = “95 Aero”

  23. Example: The Matrix name = “The Architect” name = “Morpheus” rank = “Captain” 42 42 occupation = “Total badass” name = “Thomas Anderson” age = 29 disclosure = public KNOWS KNOWS CODED_BY 1 K 1 7 7 3 3 N O W S 13 13 S K W name = “Cypher” N O O W last name = “Reagan” S N K name = “Agent Smith” version = 1.0b disclosure = secret age = 3 days language = C++ age = 6 months 2 2 name = “Trinity”

  24. Code (1): Building a node space GraphDatabaseService graphDb = ... // Get factory // Create Thomas 'Neo' Anderson Node mrAnderson = graphDb.createNode(); mrAnderson.setProperty( "name", "Thomas Anderson" ); mrAnderson.setProperty( "age", 29 ); // Create Morpheus Node morpheus = graphDb.createNode(); morpheus.setProperty( "name", "Morpheus" ); morpheus.setProperty( "rank", "Captain" ); morpheus.setProperty( "occupation", "Total bad ass" ); // Create a relationship representing that they know each other mrAnderson.createRelationshipTo( morpheus, RelTypes. KNOWS ); // ...create Trinity, Cypher, Agent Smith, Architect similarly

  25. Code (1): Building a node space GraphDatabaseService graphDb = ... // Get factory Transaction tx = neo.beginTx(); // Create Thomas 'Neo' Anderson Node mrAnderson = graphDb.createNode(); mrAnderson.setProperty( "name", "Thomas Anderson" ); mrAnderson.setProperty( "age", 29 ); // Create Morpheus Node morpheus = graphDb.createNode(); morpheus.setProperty( "name", "Morpheus" ); morpheus.setProperty( "rank", "Captain" ); morpheus.setProperty( "occupation", "Total bad ass" ); // Create a relationship representing that they know each other mrAnderson.createRelationshipTo( morpheus, RelTypes. KNOWS ); // ...create Trinity, Cypher, Agent Smith, Architect similarly tx.commit();

  26. Code (1b): Defining RelationshipTypes // In package org.neo4j.graphdb public interface RelationshipType { String name() ; } // In package org.yourdomain.yourapp // Example on how to roll dynamic RelationshipTypes class MyDynamicRelType implements RelationshipType { private final String name ; MyDynamicRelType ( String name ){ this. name = name ; } public String name() { return this .name; } } // Example on how to kick it, static-RelationshipType-like enum MyStaticRelTypes implements RelationshipType { KNOWS, WORKS_FOR, }

  27. Whiteboard friendly owns Björn Björn Big Car build drives DayCare

  28. The Graph DB model: traversal Traverser framework for name = “Emil” high-performance traversing age = 31 sex = “yes” across the node space 1 2 1 2 type = KNOWS 3 3 time = 4 years type = car vendor = “SAAB” model = “95 Aero”

  29. Example: Mr Anderson’s friends name = “The Architect” name = “Morpheus” rank = “Captain” 42 42 occupation = “Total badass” name = “Thomas Anderson” age = 29 disclosure = public KNOWS KNOWS CODED_BY 1 K 1 7 7 3 3 N O W S 13 13 S K W name = “Cypher” N O O W last name = “Reagan” S N K name = “Agent Smith” version = 1.0b disclosure = secret age = 3 days language = C++ age = 6 months 2 2 name = “Trinity”

  30. Code (2): Traversing a node space // Instantiate a traverser that returns Mr Anderson's friends Traverser friendsTraverser = mrAnderson.traverse( Traverser.Order.BREADTH_FIRST, StopEvaluator.END_OF_GRAPH, ReturnableEvaluator.ALL_BUT_START_NODE, RelTypes.KNOWS, Direction.OUTGOING ); // Traverse the node space and print out the result System.out.println( "Mr Anderson's friends:" ); for ( Node friend : friendsTraverser ) { System.out.printf( "At depth %d => %s%n", friendsTraverser.currentPosition().getDepth(), friend.getProperty( "name" ) ); }

  31. name = “The Architect” name = “Morpheus” rank = “Captain” 42 42 occupation = “Total badass” name = “Thomas Anderson” age = 29 disclosure = public KNOWS KNOWS CODED_BY K 1 1 7 3 7 3 N O W S 13 13 S K W name = “Cypher” N O O W last name = “Reagan” S N K name = “Agent Smith” version = 1.0b disclosure = secret age = 3 days language = C++ age = 6 months 2 2 $ bin/start-neo-example name = “Trinity” Mr Anderson's friends: At depth 1 => Morpheus friendsTraverser = mrAnderson.traverse( At depth 1 => Trinity Traverser.Order. BREADTH_FIRST , At depth 2 => Cypher StopEvaluator. END_OF_GRAPH , ReturnableEvaluator. ALL_BUT_START_NODE , At depth 3 => Agent Smith RelTypes. KNOWS , $ Direction. OUTGOING );

  32. Example: Friends in love? name = “The Architect” name = “Morpheus” rank = “Captain” 42 42 occupation = “Total badass” name = “Thomas Anderson” age = 29 disclosure = public KNOWS KNOWS CODED_BY 1 1 7 3 K 7 3 N O W S 13 13 S K W name = “Cypher” N O O W last name = “Reagan” S N K name = “Agent Smith” version = 1.0b L disclosure = secret O V language = C++ age = 6 months E S 2 2 name = “Trinity”

  33. Code (3a): Custom traverser // Create a traverser that returns all “friends in love” Traverser loveTraverser = mrAnderson.traverse( Traverser.Order.BREADTH_FIRST, StopEvaluator.END_OF_GRAPH, new ReturnableEvaluator() { public boolean isReturnableNode( TraversalPosition pos ) { return pos.currentNode().hasRelationship( RelTypes.LOVES, Direction.OUTGOING ); } }, RelTypes.KNOWS, Direction.OUTGOING );

  34. Code (3a): Custom traverser // Traverse the node space and print out the result System.out.println( "Who’s a lover?" ); for ( Node person : loveTraverser ) { System.out.printf( "At depth %d => %s%n", loveTraverser.currentPosition().getDepth(), person.getProperty( "name" ) ); }

Recommend


More recommend