Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
No SQL?<br />Image credit: http://browsertoolkit.com/fault-tolerance.png<br />
Neo4j<br />graph databases<br />the benefits of<br />#neo4j<br />@emileifrem<br />emil@neotechnology.com<br />Emil Eifrem<...
Trend 1:<br />data set size<br />40<br />2007<br />Source: IDC 2007<br />
988<br />Trend 1:<br />data set size<br />40<br />2007<br />2010<br />Source: IDC 2007<br />
Trend 2: connectedness<br />Giant<br />					Global<br />					Graph<br />					(GGG)<br />			Ontologies<br />		RDF<br />				...
Trend 3: semi-structure<br />Individualization of content!<br />In the salary lists of the 1970s, all elements had<br />ex...
Aside: RDBMS performance<br />Relational database<br />Social network<br />				Semantic<br />					Trading<br />custom<br /...
Trend 4: architecture<br />1990s: Database as integration hub<br />
Trend 4: architecture<br />2000s: (Slowly towards...)<br />Decoupled services with own backend<br />
Why NoSQL 2009?<br />Trend 1: Size.<br />Trend 2: Connectivity.<br />Trend 3: Semi-structure.<br />Trend 4: Architecture.<...
NoSQL<br />overview<br />
First off: the name<br />NoSQL is NOT “Never SQL”<br />NoSQL is NOT “No To SQL”<br />
NOSQL<br />is simply<br />Not Only SQL!<br />
Four (emerging) NOSQL categories<br />Key-value stores<br />Based on Amazon's Dynamo paper<br />Data model: (global) colle...
Four (emerging) NOSQL categories<br />Document databases<br />	Inspired by Lotus Notes<br />Data model: collections of K-V...
NOSQL data models<br />Key-value stores<br />Data size<br />Bigtable clones<br />Document<br />databases<br />Graph databa...
NOSQL data models<br />Key-value stores<br />		Bigtable clones<br />			Document<br />				databases<br />					Graph databas...
Graph DBs<br />& Neo4j intro<br />
The Graph DB model: representation<br />Core abstractions:<br />	Nodes<br />name = “Emil”<br />age = 29<br />sex = “yes”<b...
Example: The Matrix<br />name = “The Architect”<br />	name = “Morpheus”<br />rank = “Captain”<br />occupation = “Total bad...
Code (1): Building a node space<br />GraphDatabaseService graphDb = ... // Get factory<br />// Create Thomas 'Neo' Anderso...
Code (1): Building a node space<br />GraphDatabaseService graphDb = ... // Get factory<br />Transaction tx = neo.beginTx()...
Code (1b): Defining RelationshipTypes<br />// In package org.neo4j.graphdb<br />public interface RelationshipType<br />{<b...
Whiteboard friendly<br />owns<br />Björn<br />build<br />Big Car<br />drives<br />DayCare<br />
The Graph DB model: traversal<br />Traverser framework for<br />high-performance traversing<br />across the node space<br ...
Example: Mr Anderson’s friends<br />name = “The Architect”<br />	name = “Morpheus”<br />rank = “Captain”<br />occupation =...
Code (2): Traversing a node space<br />// Instantiate a traverser that returns Mr Anderson's friends<br />Traverser friend...
name = “The Architect”<br />name = “Morpheus”<br />rank = “Captain”<br />occupation = “Total badass”<br />42<br />name = “...
Example: Friends in love?<br />name = “The Architect”<br />	name = “Morpheus”<br />rank = “Captain”<br />occupation = “Tot...
Code (3a): Custom traverser<br />// Create a traverser that returns all “friends in love”<br />Traverser loveTraverser = m...
Code (3a): Custom traverser<br />// Traverse the node space and print out the result<br />System.out.println( "Who’s a lov...
name = “The Architect”<br />name = “Morpheus”<br />rank = “Captain”<br />occupation = “Total badass”<br />42<br />name = “...
Bonus code: domain model<br />How do you implement your domain model?<br />Use the delegator pattern, i.e. every domain en...
Domain layer frameworks<br />Qi4j (www.qi4j.org)<br />Framework for doing DDD in pure Java5<br />Defines Entities / Associ...
Neo4j system characteristics<br />Disk-based<br />Native graph storage engine with custom binary<br />	on-disk format<br /...
Social network pathExists()<br />12<br />~1k persons<br />3<br />Avg 50 friends per<br />1<br />7<br />person<br />pathExi...
Social network pathExists()<br />2<br />Emil<br />5<br />Kevin<br />1<br />Mike<br />7<br />John<br />3<br />Marcus<br />4...
Pros & Cons compared to RDBMS<br />+ No O/R impedance mismatch (whiteboard friendly)<br />+ Can easily evolve schemas<br /...
Query languages<br />SPARQL – “SQL for linked data”<br />Ex:<br />”SELECT ?person WHERE {<br />?person neo4j:KNOWS ?friend...
The Neo4j ecosystem<br />Neo4j is an embedded database<br />Tiny teeny lil jar file<br />Component ecosystem<br />index<br...
Example: Neo4j-RDF<br />Neo4j-RDF triple/quad store<br />SPARQL<br />OWL<br />RDF<br />Metamodel<br />Graph<br />match<br ...
Language bindings<br />Neo4j.py – bindings for Jython and CPython<br />http://components.neo4j.org/neo4j.py<br />Neo4jrb –...
Grails Neoclipse screendump<br />
Scale out – replication<br />Rolling out Neo4j HA... soon :)<br />Master-slave replication, 1st  configuration<br />MySQL ...
Scale out – partitioning<br />Sharding possible today<br />… but you have to do manual work<br />… just as with MySQL<br /...
How ego are you? (aka other impls?)<br />Franz’ AllegroGraph<br />(http://agraph.franz.com)<br />Proprietary, Lisp, RDF-or...
Conclusion<br />Graphs && Neo4j => teh awesome!<br />Available NOW under AGPLv3 / commercial license<br />AGPLv3: “if you’...
Party pooper slides<br />
Poop 1<br />Key-value stores?<br />	=> the awesome<br />… if you have 1000s of BILLIONS records OR you<br />don't care abo...
Poop 2<br />In a not-suck architecture...<br />… the only thing that makes sense is to have an<br />embedded database.<br />
Poop 3<br />Exposing your data model on the wire is bad.<br />Period.<br />Adding a couple of buzzwords doesn't make it le...
Poop 4<br />In-memory database<br />What the hell?<br />That's an oxymoron!<br />Up next: ascii-only JPEG<br />Up next: lo...
Ait<br />so, srsly?<br />
Looking ahead: polyglot persistence<br />NoSQL<br />SQL<br />&&<br />
Questions?<br />Image credit: lost again! Sorry :(<br />
http://neotechnology.com<br />
Upcoming SlideShare
Loading in …5
×

Neo4j And The Benefits Of Graph Dbs 3

5,814 views

Published on

Emil Eifrem, the CEO, founder and developer of neo4j in Mumbai at Directi giving a talk on NoSQL databases (his area of expertise) where he covers various NoSQL databases and then spends a bulk of time on neo4j.

Published in: Technology
  • Be the first to comment

Neo4j And The Benefits Of Graph Dbs 3

  1. 1.
  2. 2. No SQL?<br />Image credit: http://browsertoolkit.com/fault-tolerance.png<br />
  3. 3. Neo4j<br />graph databases<br />the benefits of<br />#neo4j<br />@emileifrem<br />emil@neotechnology.com<br />Emil Eifrem<br />CEO, Neo Technology<br />
  4. 4. Trend 1:<br />data set size<br />40<br />2007<br />Source: IDC 2007<br />
  5. 5. 988<br />Trend 1:<br />data set size<br />40<br />2007<br />2010<br />Source: IDC 2007<br />
  6. 6. Trend 2: connectedness<br />Giant<br /> Global<br /> Graph<br /> (GGG)<br /> Ontologies<br /> RDF<br /> Folksonomies<br /> Tagging<br />Information connectivity<br />User-<br />generated<br />Wikis<br />content<br /> Blogs<br /> RSS<br />Hypertext<br />Text<br />documents<br />web 1.0<br />web 2.0<br />“web 3.0”<br />1990<br />2000<br />2010<br />2020<br />
  7. 7. Trend 3: semi-structure<br />Individualization of content!<br />In the salary lists of the 1970s, all elements had<br />exactly one job<br />In the salary lists of the 2000s, we need 5 job<br />columns! Or 8? Or 15?<br />Trend accelerated by the decentralization of<br />content generation that is the hallmark of the age<br />of participation (“web 2.0”)<br />
  8. 8. Aside: RDBMS performance<br />Relational database<br />Social network<br /> Semantic<br /> Trading<br />custom<br />Data complexity<br />Salary List<br />Performance<br />Majority of<br /> Webapps<br />}<br />
  9. 9. Trend 4: architecture<br />1990s: Database as integration hub<br />
  10. 10. Trend 4: architecture<br />2000s: (Slowly towards...)<br />Decoupled services with own backend<br />
  11. 11. Why NoSQL 2009?<br />Trend 1: Size.<br />Trend 2: Connectivity.<br />Trend 3: Semi-structure.<br />Trend 4: Architecture.<br />
  12. 12. NoSQL<br />overview<br />
  13. 13. First off: the name<br />NoSQL is NOT “Never SQL”<br />NoSQL is NOT “No To SQL”<br />
  14. 14. NOSQL<br />is simply<br />Not Only SQL!<br />
  15. 15. Four (emerging) NOSQL categories<br />Key-value stores<br />Based on Amazon's Dynamo paper<br />Data model: (global) collection of K-V pairs<br />Example: Dynomite, Voldemort, Tokyo*<br />BigTable clones<br />Based on Google's BigTable paper<br />Data model: big table, column families<br />Example: HBase, Hypertable, Cassandra<br />
  16. 16. Four (emerging) NOSQL categories<br />Document databases<br /> Inspired by Lotus Notes<br />Data model: collections of K-V collections<br />Example: CouchDB, MongoDB<br />Graph databases<br />Inspired by Euler & graph theory<br />Data model: nodes, rels, K-V on both<br />Example: AllegroGraph, Sones, Neo4j<br />
  17. 17. NOSQL data models<br />Key-value stores<br />Data size<br />Bigtable clones<br />Document<br />databases<br />Graph databases<br />Data complexity<br />
  18. 18. NOSQL data models<br />Key-value stores<br /> Bigtable clones<br /> Document<br /> databases<br /> Graph databases<br />(This is still billions of<br />Data size<br />nodes & relationships)<br />Data complexity<br />90%<br /> of<br /> use<br />cases<br />
  19. 19. Graph DBs<br />& Neo4j intro<br />
  20. 20. The Graph DB model: representation<br />Core abstractions:<br /> Nodes<br />name = “Emil”<br />age = 29<br />sex = “yes”<br />Relationships between nodes<br />Properties on both<br />type = KNOWS<br /> time = 4 years<br />1<br />2<br />type = car<br />vendor = “SAAB”<br />model = “95 Aero”<br />3<br />
  21. 21. Example: The Matrix<br />name = “The Architect”<br /> name = “Morpheus”<br />rank = “Captain”<br />occupation = “Total badass”<br />42<br />name = “Thomas Anderson”<br />age = 29<br /> disclosure = public<br />KNOWS<br />KNOWS<br />CODED_BY<br />KNOW<br />1<br />3<br />7<br />S<br />13<br />KW<br />KN<br />S<br />name = “Cypher”<br />last name = “Reagan”<br />OW<br />NO<br />S<br />name = “Agent Smith”<br />version = 1.0b<br />language = C++<br />disclosure = secret<br />age = 6 months<br />age = 3 days<br />2<br />name = “Trinity”<br />
  22. 22. Code (1): Building a node space<br />GraphDatabaseService graphDb = ... // Get factory<br />// Create Thomas 'Neo' Anderson<br />Node mrAnderson = graphDb.createNode();<br />mrAnderson.setProperty( "name", "Thomas Anderson" );<br />mrAnderson.setProperty( "age", 29 );<br />// Create Morpheus<br />Node morpheus = graphDb.createNode();<br />morpheus.setProperty( "name", "Morpheus" );<br />morpheus.setProperty( "rank", "Captain" );<br />morpheus.setProperty( "occupation", "Total bad ass" );<br />// Create a relationship representing that they know each other<br />mrAnderson.createRelationshipTo( morpheus, RelTypes.KNOWS );<br />// ...create Trinity, Cypher, Agent Smith, Architect similarly<br />
  23. 23. Code (1): Building a node space<br />GraphDatabaseService graphDb = ... // Get factory<br />Transaction tx = neo.beginTx();<br />// Create Thomas 'Neo' Anderson<br />Node mrAnderson = graphDb.createNode();<br />mrAnderson.setProperty( "name", "Thomas Anderson" );<br />mrAnderson.setProperty( "age", 29 );<br />// Create Morpheus<br />Node morpheus = graphDb.createNode();<br />morpheus.setProperty( "name", "Morpheus" );<br />morpheus.setProperty( "rank", "Captain" );<br />morpheus.setProperty( "occupation", "Total bad ass" );<br />// Create a relationship representing that they know each other<br />mrAnderson.createRelationshipTo( morpheus, RelTypes.KNOWS );<br />// ...create Trinity, Cypher, Agent Smith, Architect similarly<br />tx.commit();<br />
  24. 24. Code (1b): Defining RelationshipTypes<br />// In package org.neo4j.graphdb<br />public interface RelationshipType<br />{<br />String name();<br />}<br />// In package org.yourdomain.yourapp<br />// Example on how to roll dynamic RelationshipTypes<br />class MyDynamicRelType implements RelationshipType<br />{<br />private final String name;<br />MyDynamicRelType( String name ){ this.name = name; }<br />public String name() { return this.name; }<br />}<br />// Example on how to kick it, static-RelationshipType-like<br />enum MyStaticRelTypes implements RelationshipType<br />{<br />KNOWS,<br />WORKS_FOR,<br />}<br />
  25. 25. Whiteboard friendly<br />owns<br />Björn<br />build<br />Big Car<br />drives<br />DayCare<br />
  26. 26.
  27. 27. The Graph DB model: traversal<br />Traverser framework for<br />high-performance traversing<br />across the node space<br />type = KNOWS<br /> time = 4 years<br />name = “Emil”<br />age = 31<br />sex = “yes”<br />1<br />2<br />type = car<br />vendor = “SAAB”<br />model = “95 Aero”<br />3<br />
  28. 28. Example: Mr Anderson’s friends<br />name = “The Architect”<br /> name = “Morpheus”<br />rank = “Captain”<br />occupation = “Total badass”<br />42<br />name = “Thomas Anderson”<br />age = 29<br /> disclosure = public<br />KNOWS<br />KNOWS<br />CODED_BY<br />KNOW<br />1<br />3<br />7<br />S<br />13<br />KW<br />KN<br />S<br />name = “Cypher”<br />last name = “Reagan”<br />OW<br />NO<br />S<br />name = “Agent Smith”<br />version = 1.0b<br />language = C++<br />disclosure = secret<br />age = 6 months<br />age = 3 days<br />2<br />name = “Trinity”<br />
  29. 29. Code (2): Traversing a node space<br />// Instantiate a traverser that returns Mr Anderson's friends<br />Traverser friendsTraverser = mrAnderson.traverse(<br />Traverser.Order.BREADTH_FIRST,<br />StopEvaluator.END_OF_GRAPH,<br />ReturnableEvaluator.ALL_BUT_START_NODE,<br />RelTypes.KNOWS,<br />Direction.OUTGOING );<br />// Traverse the node space and print out the result<br />System.out.println( "Mr Anderson's friends:" );<br />for ( Node friend : friendsTraverser )<br />{<br />System.out.printf( "At depth %d => %s%n",<br />friendsTraverser.currentPosition().getDepth(),<br />friend.getProperty( "name" ) );<br />}<br />
  30. 30. name = “The Architect”<br />name = “Morpheus”<br />rank = “Captain”<br />occupation = “Total badass”<br />42<br />name = “Thomas Anderson”<br />age = 29<br /> disclosure = public<br />KNOWS<br />KNOWS<br />CODED_BY<br />KNOW<br />1<br />7<br />3<br />S<br />13<br />KW<br />KN<br />S<br />name = “Cypher”<br />last name = “Reagan”<br />OW<br />NO<br />S<br />name = “Agent Smith”<br />version = 1.0b<br />language = C++<br />disclosure = secret<br />age = 6 months<br />age = 3 days<br />2<br />$ bin/start-neo-example<br />Mr Anderson's friends:<br />name = “Trinity”<br />=><br />=><br />=><br />=><br />Morpheus<br />Trinity<br />Cypher<br />Agent Smith<br />depth<br />depth<br />depth<br />depth<br />1<br />1<br />2<br />3<br />At<br />At<br />At<br />At<br />$<br />friendsTraverser = mrAnderson.traverse(<br /> Traverser.Order.BREADTH_FIRST,<br /> StopEvaluator.END_OF_GRAPH,<br /> ReturnableEvaluator.ALL_BUT_START_NODE,<br /> RelTypes.KNOWS,<br /> Direction.OUTGOING );<br />
  31. 31. Example: Friends in love?<br />name = “The Architect”<br /> name = “Morpheus”<br />rank = “Captain”<br />occupation = “Total badass”<br />42<br />name = “Thomas Anderson”<br />age = 29<br /> disclosure = public<br />KNOWS<br />KNOWS<br />CODED_BY<br />1<br />KNO<br />7<br />3<br />WS<br />13<br />KW<br />KN<br />S<br />name = “Cypher”<br />last name = “Reagan”<br />OW<br />NO<br />S<br />name = “Agent Smith”<br />version = 1.0b<br />language = C++<br />LO<br />disclosure = secret<br />age = 6 months<br />VE<br />S<br />2<br />name = “Trinity”<br />
  32. 32. Code (3a): Custom traverser<br />// Create a traverser that returns all “friends in love”<br />Traverser loveTraverser = mrAnderson.traverse(<br />Traverser.Order.BREADTH_FIRST,<br />StopEvaluator.END_OF_GRAPH,<br />new ReturnableEvaluator()<br />{<br />public boolean isReturnableNode( TraversalPosition pos )<br />{<br />return pos.currentNode().hasRelationship(<br />RelTypes.LOVES, Direction.OUTGOING );<br />}<br />},<br />RelTypes.KNOWS,<br />Direction.OUTGOING );<br />
  33. 33. Code (3a): Custom traverser<br />// Traverse the node space and print out the result<br />System.out.println( "Who’s a lover?" );<br />for ( Node person : loveTraverser )<br />{<br />System.out.printf( "At depth %d => %s%n",<br /> loveTraverser.currentPosition().getDepth(),<br /> person.getProperty( "name" ) );<br />}<br />
  34. 34. name = “The Architect”<br />name = “Morpheus”<br />rank = “Captain”<br />occupation = “Total badass”<br />42<br />name = “Thomas Anderson”<br />age = 29<br /> disclosure = public<br />KNOWS<br />KNOWS<br />CODED_BY<br />KNOW<br />1<br />7<br />3<br />S<br />13<br />KOW<br />KN<br />S<br />name = “Cypher”<br />last name = “Reagan”<br />OW<br />S<br />N<br />name = “Agent Smith”<br />version = 1.0b<br />language = C++<br />LO<br />disclosure = secret<br />age = 6 months<br />VE<br />S<br />2<br />name = “Trinity”<br />$ bin/start-neo-example<br />Who’s a lover?<br />new ReturnableEvaluator()<br />{<br />At depth 1 => Trinity<br />$<br />public boolean isReturnableNode(<br /> TraversalPosition pos)<br />{<br />return pos.currentNode().<br /> hasRelationship( RelTypes.LOVES,<br />Direction.OUTGOING );<br /> }<br />},<br />
  35. 35. Bonus code: domain model<br />How do you implement your domain model?<br />Use the delegator pattern, i.e. every domain entity<br />wraps a Neo4j primitive:<br />// In package org.yourdomain.yourapp<br />class PersonImpl implements Person<br />{<br />private final Node underlyingNode;<br />PersonImpl( Node node ){ this.underlyingNode = node; }<br />public String getName()<br />{<br />return (String) this.underlyingNode.getProperty( "name" );<br />}<br />public void setName( String name )<br />{<br />this.underlyingNode.setProperty( "name", name );<br />}<br />}<br />
  36. 36. Domain layer frameworks<br />Qi4j (www.qi4j.org)<br />Framework for doing DDD in pure Java5<br />Defines Entities / Associations / Properties<br /> Sound familiar? Nodes / Rel’s / Properties!<br />Neo4j is an “EntityStore” backend<br />Jo4neo (http://code.google.com/p/jo4neo)<br />Annotation driven<br />Weaves Neo4j-backed persistence into domain<br />objects at runtime<br />
  37. 37. Neo4j system characteristics<br />Disk-based<br />Native graph storage engine with custom binary<br /> on-disk format<br />Transactional<br />JTA/JTS, XA, 2PC, Tx recovery, deadlock<br />detection, MVCC, etc<br />Scales up<br />Many billions of nodes/rels/props on single JVM<br />Robust<br />6+ years in 24/7 production<br />
  38. 38. Social network pathExists()<br />12<br />~1k persons<br />3<br />Avg 50 friends per<br />1<br />7<br />person<br />pathExists(a, b) limit<br />depth 4<br />Two backends<br />36<br />77<br />41<br />5<br />Eliminate disk IO so<br />warm up caches<br />
  39. 39. Social network pathExists()<br />2<br />Emil<br />5<br />Kevin<br />1<br />Mike<br />7<br />John<br />3<br />Marcus<br />4<br />Leigh<br /># persons query time<br />9<br />Bruce<br />Relational database<br />Graph database (Neo4j)<br />Graph database (Neo4j)<br />1 000<br /> 1 000<br />1 000 000<br />2 000 ms<br /> 2 ms<br /> 2 ms<br />
  40. 40.
  41. 41.
  42. 42. Pros & Cons compared to RDBMS<br />+ No O/R impedance mismatch (whiteboard friendly)<br />+ Can easily evolve schemas<br />+ Can represent semi-structured info<br />+ Can represent graphs/networks (with performance)<br />- Lacks in tool and framework support<br />- Few other implementations => potential lock in<br />-+ No support for ad-hoc queries<br />
  43. 43. Query languages<br />SPARQL – “SQL for linked data”<br />Ex:<br />”SELECT ?person WHERE {<br />?person neo4j:KNOWS ?friend .<br /> ?friend neo4j:KNOWS ?foe .<br /> ?foe neo4j:name “Larry Ellison” .<br /> }”<br />Gremlin – “perl for graphs”<br />Ex:<br />”./outE[@label='KNOWS']/inV[@age > 30]/@name”<br />
  44. 44. The Neo4j ecosystem<br />Neo4j is an embedded database<br />Tiny teeny lil jar file<br />Component ecosystem<br />index<br />meta-model<br />graph-matching<br />remote-graphdb<br />sparql-engine<br />...<br />See http://components.neo4j.org<br />
  45. 45. Example: Neo4j-RDF<br />Neo4j-RDF triple/quad store<br />SPARQL<br />OWL<br />RDF<br />Metamodel<br />Graph<br />match<br />Neo4j<br />
  46. 46. Language bindings<br />Neo4j.py – bindings for Jython and CPython<br />http://components.neo4j.org/neo4j.py<br />Neo4jrb – bindings for JRuby (incl RESTful API)<br />http://wiki.neo4j.org/content/Ruby<br />Neo4jrb-simple<br />http://github.com/mdeiters/neo4jr-simple<br />Clojure<br />http://wiki.neo4j.org/content/Clojure<br />Scala (incl RESTful API)<br />http://wiki.neo4j.org/content/Scala<br />
  47. 47.
  48. 48.
  49. 49. Grails Neoclipse screendump<br />
  50. 50. Scale out – replication<br />Rolling out Neo4j HA... soon :)<br />Master-slave replication, 1st configuration<br />MySQL style... ish<br />Except all instances can write, synchronously<br />between writing slave & master (strong consistency)<br />Updates are asynchronously propagated to the<br />other slaves (eventual consistency)<br />This can handle billions of entities...<br />… but not 100B<br />
  51. 51. Scale out – partitioning<br />Sharding possible today<br />… but you have to do manual work<br />… just as with MySQL<br />Great option: shard on top of resilient, scalable<br />OSS app server , see: www.codecauldron.org<br />Transparent partitioning? Neo4j 2.0<br />100B? Easy to say. Sliiiiightly harder to do.<br />Fundamentals: BASE & eventual consistency<br />Generic clustering algorithm as base case, but<br />give lots of knobs for developers<br />
  52. 52. How ego are you? (aka other impls?)<br />Franz’ AllegroGraph<br />(http://agraph.franz.com)<br />Proprietary, Lisp, RDF-oriented but real graphdb<br />Sones graphDB<br />(http://sones.com)<br />Proprietary, .NET, cloud-only, req invite for test<br />Kloudshare<br />(http://kloudshare.com)<br />Graph database in the cloud, still stealth mode<br />Google Pregel<br />(http://bit.ly/dP9IP)<br />We are oh-so-secret<br />Some academic papers from ~10 years ago<br />G = {V, E}<br />#FAIL<br />
  53. 53. Conclusion<br />Graphs && Neo4j => teh awesome!<br />Available NOW under AGPLv3 / commercial license<br />AGPLv3: “if you’re open source, we’re open source”<br /> If you have proprietary software? Must buy a<br /> commercial license<br />But the first one is free!<br />Download<br />http://neo4j.org<br />Feedback<br />http://lists.neo4j.org<br />
  54. 54. Party pooper slides<br />
  55. 55. Poop 1<br />Key-value stores?<br /> => the awesome<br />… if you have 1000s of BILLIONS records OR you<br />don't care about programmer productivity<br />What if you had no variables at all in your programs<br />except a single globally accessible hashtable?<br />Would your software be maintainable?<br />
  56. 56. Poop 2<br />In a not-suck architecture...<br />… the only thing that makes sense is to have an<br />embedded database.<br />
  57. 57. Poop 3<br />Exposing your data model on the wire is bad.<br />Period.<br />Adding a couple of buzzwords doesn't make it less<br />bad.<br />If it was bad with SQL-over-sockets (hint: it was)<br />then – surprise! – it's still bad even tho you use<br />Hype-compliant(tm) JSON-over-REST.<br />We don't want to couple everything to a specific<br />data model or schema again!<br />
  58. 58. Poop 4<br />In-memory database<br />What the hell?<br />That's an oxymoron!<br />Up next: ascii-only JPEG<br />Up next: loopback-only web server<br />If you're not durable, you're a variable!<br />If you happen to asynchronously spill over to disk,<br />you're a variable that asynchronously spills over to<br />disk<br />
  59. 59. Ait<br />so, srsly?<br />
  60. 60. Looking ahead: polyglot persistence<br />NoSQL<br />SQL<br />&&<br />
  61. 61.
  62. 62. Questions?<br />Image credit: lost again! Sorry :(<br />
  63. 63. http://neotechnology.com<br />

×