SlideShare a Scribd company logo
1 of 83
NOSQL
                  - an overview -
                    JFokus 2011
Emil Eifrem                     @emileifrem
CEO, Neo Technology             emil@neotechnology.com
                                #neo4j
So what’s the plan?
๏ Why NOSQL?

๏ The NOSQL landscape

๏ NOSQL challenges

๏ Conclusion




                        2
First off: the name

๏ WE ALL HATES IT, M’KAY?




                            3
NOSQL is NOT...




                  4
NOSQL is NOT...
 ๏ NO to SQL




                  4
NOSQL is NOT...
 ๏ NO to SQL

 ๏ NEVER SQL


                  4
NOSQL is simply




Not Only SQL


                    5
An overview of NOSQL (JFokus 2011)
NOSQL - Why now?
    Four trends

                  7
Trend 1:
data set size



40
2007            Source: IDC 2007
988

Trend 1:
data set size



40
2007            2010   Source: IDC 2007
Trend 2: Connectedness
  Information connectivity




                                    web 1.0          web 2.0          “web 3.0”

                             1990             2000             2010           2020   10
Trend 2: Connectedness
  Information connectivity




                         Text documents
                                                 web 1.0          web 2.0          “web 3.0”

                                          1990             2000             2010           2020   11
Trend 2: Connectedness
  Information connectivity




                                            Hypertext


                         Text documents
                                                  web 1.0          web 2.0          “web 3.0”

                                          1990              2000             2010           2020   12
Trend 2: Connectedness



                                                                                                Folksonomies
  Information connectivity




                                                                              Tagging


                                                              Wikis            User-generated
                                                                                  content
                                                                      Blogs


                                                            RSS


                                            Hypertext


                         Text documents
                                                  web 1.0               web 2.0                     “web 3.0”

                                          1990              2000                        2010                   2020   13
Trend 2: Connectedness
                                                                                                          Giant
                                                                                                          Global
                                                                                                       Graph (GGG)


                                                                                          Ontologies


                                                                                 RDF


                                                                                                Folksonomies
  Information connectivity




                                                                              Tagging


                                                              Wikis            User-generated
                                                                                  content
                                                                      Blogs


                                                            RSS


                                            Hypertext


                         Text documents
                                                  web 1.0               web 2.0                        “web 3.0”

                                          1990              2000                        2010                   2020   14
Trend 2: Connectedness
                                                                                                          Giant
                                                                                                          Global
                                                                                                       Graph (GGG)


                                                                                          Ontologies


                                                                                 RDF


                                                                                                Folksonomies
  Information connectivity




                                                                              Tagging


                                                              Wikis            User-generated
                                                                                  content
                                                                      Blogs


                                                            RSS


                                            Hypertext


                         Text documents
                                                  web 1.0               web 2.0                        “web 3.0”

                                          1990              2000                        2010                   2020   15
Trend 3: Semi-structure
๏ Individualization of content
   • In the salary lists of the 1970s, all elements had exactly one job
   • In Or 15? lists of the 2000s, we need 5 job columns! Or 8?
        the salary


๏ All encompassing “entire world views”
   • Store more data about each entity
๏ Trend accelerated by the decentralization of content generation
     that is the hallmark of the age of participation (“web 2.0”)



                                                                    16
Aside: RDBMS performance
                              Relational database

                              Requirement of application
 Performance




                           Data complexity                 17
Aside: RDBMS performance
                              Relational database

                              Requirement of application
 Performance




                           Data complexity                 18
Aside: RDBMS performance
               Salary List      Relational database

                                Requirement of application
 Performance




                             Data complexity                 19
Aside: RDBMS performance
               Salary List                    Relational database

                                              Requirement of application
 Performance




                             Majority of
                             Webapps




                                           Data complexity                 20
Aside: RDBMS performance
               Salary List                            Relational database

                                                      Requirement of application
 Performance




                             Majority of
                             Webapps



                                           Social network




                                                }
                                                                  Semantic Trading




                                                            custom



                                                Data complexity                      21
Trend 4: Architecture

              1980s: Application   (<-- note lack of s)




                       Application




                           DB




                                                          22
Trend 4: Architecture

             1990s: Database as integration hub


          Application   Application    Application




                            DB




                                                     23
Trend 4: Architecture

         2000s: (moving towards) Decoupled services
                     with their own backend

           Service         Service            Service




             DB               DB                DB




                                                        24
Why NOSQL Now?

๏Trend 1: Size
๏Trend 2: Connectedness
๏Trend 3: Semi-structure
๏Trend 4: Architecture

                           25
Four NOSQL categories


                  26
Category 1: Key-Value stores
๏ Lineage:
   • “Dynamo: Amazon’s Highly Available Key-Value Store” (2007)
๏ Data model:
   • Global key-value mapping
   • Think: Globally available HashMap/Dict/etc
๏ Examples:
   • Project Voldemort
   • Tokyo {Cabinet,Tyrant, etc}                           27
     Riak
Category 1: Key-Value stores
๏ Strengths
   • Simple data model
   • Great at scaling out horizontally
๏ Weaknesses:
   • Simplistic data model
   • Poor for complex data

                                         28
Category II: ColumnFamily (BigTable) stores
๏ Lineage:
   • “Bigtable:(2006)
       Data”
                 A Distributed Storage System for Structured



๏ Data model:
   • A big table, with column families
๏ Examples:
   • HBase
   • HyperTable
   • Cassandra                                                 29
Category III: Document databases
๏ Lineage:
   • Lotus Notes
๏ Data model:
   • Collections of documents
   • A document is a key-value collection
๏ Examples:
   • CouchDB
   • MongoDB                                30
     Terrastore
Document db: An example
๏ How would we model a blogging software?

๏ One stab:
   • Represent each Blog as a Collection of Post documents
   • Represent Comments as nested documents in the Post
       documents




                                                             31
Document db: Creating a blog post
import com.mongodb.Mongo;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
// ...
Mongo mongo = new Mongo( "localhost" ); // Connect to MongoDB
// ...
DB blogs = mongo.getDB( "blogs" ); // Access the blogs database
DBCollection myBlog = blogs.getCollection( "Thobe’s blog" );

DBObject blogPost = new BasicDBObject();
blogPost.put( "title", "JFokus 2011" );
blogPost.put( "pub_date", new Date() );
blogPost.put( "body", "Publishing a post about JFokus in my
  MongoDB blog!" );
blogPost.put( "tags", Arrays.asList( "conference", "names" ) );
blogPost.put( "comments", new ArrayList() );

myBlog.insert( blogPost );                               32
Retrieving posts
// ...
import com.mongodb.DBCursor;
// ...

public Object getAllPosts( String blogName ) {
   DBCollection blog = db.getCollection( blogName );
   return renderPosts( blog.find() );
}

private Object renderPosts( DBCursor cursor ) {
   // order by publication date (descending)
   cursor = cursor.sort( new BasicDBObject( "pub_date", -1 ) );
   // ...
}




                                                         33
Category IV: Graph databases
๏ Lineage:
   • Euler and graph theory
๏ Data model:
   • Nodes with properties
   • Typed relationships with properties
๏ Examples:
   • Sones GraphDB
   • InfiniteGraph                          34
     Neo4j
Property Graph model




                       35
Property Graph model

                           LOVES

                LIVES WITH
                         LOVES



         OWNS
                                 DRIVES




                                          36
Property Graph model
                                                    name: “Mary”
                                     LOVES
name: “James”                                       age: 35
age: 32                   LIVES WITH
twitter: “@spam”                   LOVES



                   OWNS
          property type: “car”             DRIVES



                                   brand: “Volvo”
                                   model: “V70”



                                                                   37
Graphs are whiteboard friendly                        An application domain model
                                                      outlined on a whiteboard or piece
                                                      of paper would be translated to
                                                      an ER-diagram, then normalized
                                                      to fit a Relational Database.
                                                      With a Graph Database the model
                                                      from the whiteboard is
                                                      implemented directly.




                     Image credits: Tobias Ivarsson
                                                                         38
Graphs are whiteboard friendly                              An application domain model
                                                            outlined on a whiteboard or piece
                                                            of paper would be translated to
                                                            an ER-diagram, then normalized
                                                            to fit a Relational Database.
                                                            With a Graph Database the model
                   thobe                                    from the whiteboard is
                                                            implemented directly.



                                  Joe project blog


                                Wardrobe Strength


            Hello Joe

             Modularizing Jython

               Neo4j performance analysis
                           Image credits: Tobias Ivarsson
                                                                               39
Graph db: Creating a social graph
GraphDatabaseService graphDb = new EmbeddedGraphDatabase(
  GRAPH_STORAGE_LOCATION );

Transaction tx = graphDb.beginTx();
try {
   Node mrAnderson = graphDb.createNode();
   mrAnderson.setProperty( "name", "Thomas Anderson" );
   mrAnderson.setProperty( "age", 29 );

   Node morpheus = graphDb.createNode();
   morpheus.setProperty( "name", "Morpheus" );
   morpheus.setProperty( "rank", "Captain" );

   Relationship friendship = mrAnderson.createRelationshipTo(
     morpheus, SocialGraphTypes.FRIENDSHIP );

   tx.success();
} finally {
   tx.finish();
}                                                           40
Graph db: How do I know this person?
Node me = ...
Node you = ...

PathFinder shortestPathFinder = GraphAlgoFactory.shortestPath(
   Traversals.expanderForTypes(
       SocialGraphTypes.FRIENDSHIP, Direction.BOTH ),
   /* maximum depth: */ 4 );

Path shortestPath = shortestPathFinder.findSinglePath(me, you);

for ( Node friend : shortestPath.nodes() ) {
   System.out.println( friend.getProperty( "name" ) );
}




                                                         41
Graph db: Recommend new friends
Node person = ...

TraversalDescription friendsOfFriends = Traversal.description()
   .expand( Traversals.expanderForTypes(
                 SocialGraphTypes.FRIENDSHIP, Direction.BOTH ) )
   .prune( Traversal.pruneAfterDepth( 2 ) )
   .breadthFirst() // Visit my friends before their friends.
   //Visit a node at most once (don’t recommend direct friends)
   .uniqueness( Uniqueness.NODE_GLOBAL )
   .filter( new Predicate<Path>() {
       // Only return friends of friends
       public boolean accept( Path traversalPos ) {
          return traversalPos.length() == 2;
       }
   } );

for ( Node recommendation :
           friendsOfFriends.traverse( person ).nodes() ) {
   System.out.println( recommendedFriend.getProperty("name") );
}                                                        42
Four emerging NOSQL categories

       ๏Key-Value stores
       ๏ColumnFamiy stores
       ๏Document databases
       ๏Graph databases

                                 43
Scaling to size vs. Scaling to complexity
    Size
       Key/Value stores




                                            Complexity

                                                44
Scaling to size vs. Scaling to complexity
    Size
       Key/Value stores

                          ColumnFamily stores




                                                Complexity

                                                    44
Scaling to size vs. Scaling to complexity
    Size
       Key/Value stores

                          ColumnFamily stores

                                                Document databases




                                                                     Complexity

                                                                         44
Scaling to size vs. Scaling to complexity
    Size
       Key/Value stores

                          ColumnFamily stores

                                                Document databases

                                                                     Graph databases




                                                                               Complexity

                                                                                       44
Scaling to size vs. Scaling to complexity
    Size
       Key/Value stores

                          ColumnFamily stores

                                                Document databases

                                                                     Graph databases
                                                                                 Billions of nodes
                                                                                 and relationships




             My subjective view: > 90% of use cases

                                                                               Complexity

                                                                                       44
NOSQL challenges?




                    45
NOSQL challenges?
๏ Mindshare
   • But that’s also product usability (“how do you query it?”)




                                                                  45
NOSQL challenges?
๏ Mindshare
   • But that’s also product usability (“how do you query it?”)
๏ Tool support
   • Both devtime tools and runtime ops tools
   • Standards may help?
   • ... or maybe just time

                                                                  45
NOSQL challenges?
๏ Mindshare
   • But that’s also product usability (“how do you query it?”)
๏ Tool support
   • Both devtime tools and runtime ops tools
   • Standards may help?
   • ... or maybe just time
๏ Middleware support

                                                                  45
Middleware support?
๏ Lemme tell you the story about Mike and his restaurant site




                                                                46
Domain & data model


             Restaurant                           UserAccount
     @Entity                       @Entity
     public class Restaurant {     @Table(name = "user_account")
         @Id @GeneratedValue       public class UserAccount {
         private Long id;              @Id @GeneratedValue
         private String name;          private Long id;
         private String city;          private String userName;
         private String state;         private String firstName;
         private String zipCode;       private String lastName;
                                       @Temporal(TemporalType.TIMESTAMP)
                                       private Date birthDate;
                                       @ManyToMany(cascade = CascadeType.ALL)
                                       private Set<Restaurant> favorites;




                                                                                47
Step 1: Buildsing a web site



                      Tomcat



                               One box


                      MySQL




                                         48
Step II: Whoa, ppl are actually using it?




                                            49
Step II: Whoa, ppl are actually using it?



                       Tomcat



                                   Two boxes


                       MySQL




                                               49
Step III: That’s a LOT of pages served...




                                            50
Step III: That’s a LOT of pages served...



        Tomcat         Tomcat        Tomcat        n boxes




                       MySQL                       1 box




                                              50
Step IV: Our DB is completely overwhelmed...




                                        51
Step IV: Our DB is completely overwhelmed...



       Tomcat               Tomcat               Tomcat        n boxes




                MySQL (m)            MySQL (s)                 n boxes




                                                          51
Step V: Our DBs are STILL overwhelmed




                  ?
                                        52
What does the site look like now?




                                    53
Step V: Our DBs are STILL overwhelmed
๏ Turns out the problem is due to joins

๏ A while back Mike introduced a new feature
   • Recommend restaurants based on the user’s friends (and friends
       of friends)

   • Whoa, recommendations aren’t just simple get and put!
   • They’re killing us with joins
๏ What about sharding?
๏ What about SSDs?
                                                            54
Polyglot persistence (Not Only SQL)
๏ How did we get into this situation?

๏ Well, data sets are increasingly less uniform
๏ Parts of Mike’s data fits well in an RDBMS
๏ But parts of it is graph-shaped
   • It fits much better in a graph database!
   • And I’m sure that there is or will be very key-value-esque parts
        of the dataset


๏ Simple, just store some of it in a graph db and some of it in MySQL!
     But what does the code look like?                         55
We were here




               56
We were here


             Restaurant                           UserAccount
     @Entity                       @Entity
     public class Restaurant {     @Table(name = "user_account")
         @Id @GeneratedValue       public class UserAccount {
         private Long id;              @Id @GeneratedValue
         private String name;          private Long id;
         private String city;          private String userName;
         private String state;         private String firstName;
         private String zipCode;       private String lastName;
                                       @Temporal(TemporalType.TIMESTAMP)
                                       private Date birthDate;
                                       @ManyToMany(cascade = CascadeType.ALL)
                                       private Set<Restaurant> favorites;




                                                                                56
Then we added recommendations
              Restaurant                              UserAccount
     @Entity                           @Entity
     @NodeEntity(partial = true)       @Table(name = "user_account")
     public class Restaurant {         @NodeEntity(partial = true)
       @Id @GeneratedValue             public class UserAccount {
       private Long id;                  @Id @GeneratedValue
       private String name;              private Long id;
       private String city;              private String userName;
       private String state;             private String firstName;
       private String zipCode;           private String lastName;
                                         @Temporal(TemporalType.TIMESTAMP)
                                         private Date birthDate;
                                         @ManyToMany(cascade = CascadeType.ALL)
           Recommendation                private Set<Restaurant> favorites;

    @RelationshipEntity                  @GraphProperty
    public class Recommendation {        String nickname;
      @StartNode                         @RelatedTo(type = "friends",
      private UserAccount user;               elementClass = UserAccount.class)
      @EndNode                           Set<UserAccount> friends;
      private Restaurant restaurant;     @RelatedToVia(type = "recommends",
      private int stars;                      elementClass = Recommendation.class)
      private String comment;            Iterable<Recommendation> recommendations;



                                                                                     57
Then we added recommendations
              Restaurant                              UserAccount
     @Entity                           @Entity
     @NodeEntity(partial = true)       @Table(name = "user_account")
     public class Restaurant {         @NodeEntity(partial = true)
       @Id @GeneratedValue             public class UserAccount {
       private Long id;                  @Id @GeneratedValue
       private String name;              private Long id;
       private String city;              private String userName;
       private String state;             private String firstName;
       private String zipCode;           private String lastName;
                                         @Temporal(TemporalType.TIMESTAMP)
                                         private Date birthDate;
                                         @ManyToMany(cascade = CascadeType.ALL)
           Recommendation                private Set<Restaurant> favorites;

    @RelationshipEntity                  @GraphProperty
    public class Recommendation {        String nickname;
      @StartNode                         @RelatedTo(type = "friends",
      private UserAccount user;               elementClass = UserAccount.class)
      @EndNode                           Set<UserAccount> friends;
      private Restaurant restaurant;     @RelatedToVia(type = "recommends",
      private int stars;                      elementClass = Recommendation.class)
      private String comment;            Iterable<Recommendation> recommendations;



                                                                                     58
Then we added recommendations
              Restaurant                              UserAccount
     @Entity                           @Entity
     @NodeEntity(partial = true)       @Table(name = "user_account")
     public class Restaurant {         @NodeEntity(partial = true)
       @Id @GeneratedValue             public class UserAccount {
       private Long id;                  @Id @GeneratedValue
       private String name;              private Long id;
       private String city;              private String userName;
       private String state;             private String firstName;
       private String zipCode;           private String lastName;
                                         @Temporal(TemporalType.TIMESTAMP)
                                         private Date birthDate;
                                         @ManyToMany(cascade = CascadeType.ALL)
           Recommendation                private Set<Restaurant> favorites;

    @RelationshipEntity                  @GraphProperty
    public class Recommendation {        String nickname;
      @StartNode                         @RelatedTo(type = "friends",
      private UserAccount user;               elementClass = UserAccount.class)
      @EndNode                           Set<UserAccount> friends;
      private Restaurant restaurant;     @RelatedToVia(type = "recommends",
      private int stars;                      elementClass = Recommendation.class)
      private String comment;            Iterable<Recommendation> recommendations;



                                                                                     58
Then we added recommendations
              Restaurant                              UserAccount
     @Entity                           @Entity
     @NodeEntity(partial = true)       @Table(name = "user_account")
     public class Restaurant {         @NodeEntity(partial = true)
       @Id @GeneratedValue             public class UserAccount {
       private Long id;                  @Id @GeneratedValue
       private String name;              private Long id;
       private String city;              private String userName;
       private String state;             private String firstName;
       private String zipCode;           private String lastName;
                                         @Temporal(TemporalType.TIMESTAMP)
                                         private Date birthDate;
                                         @ManyToMany(cascade = CascadeType.ALL)
           Recommendation                private Set<Restaurant> favorites;

    @RelationshipEntity                  @GraphProperty
    public class Recommendation {        String nickname;
      @StartNode                         @RelatedTo(type = "friends",
      private UserAccount user;               elementClass = UserAccount.class)
      @EndNode                           Set<UserAccount> friends;
      private Restaurant restaurant;     @RelatedToVia(type = "recommends",
      private int stars;                      elementClass = Recommendation.class)
      private String comment;            Iterable<Recommendation> recommendations;



                                                                                     58
Then we added recommendations
              Restaurant                              UserAccount
     @Entity                           @Entity
     @NodeEntity(partial = true)       @Table(name = "user_account")
     public class Restaurant {         @NodeEntity(partial = true)
       @Id @GeneratedValue             public class UserAccount {
       private Long id;                  @Id @GeneratedValue
       private String name;              private Long id;
       private String city;              private String userName;
       private String state;             private String firstName;
       private String zipCode;           private String lastName;
                                         @Temporal(TemporalType.TIMESTAMP)
                                         private Date birthDate;
                                         @ManyToMany(cascade = CascadeType.ALL)
           Recommendation                private Set<Restaurant> favorites;

    @RelationshipEntity                  @GraphProperty
    public class Recommendation {        String nickname;
      @StartNode                         @RelatedTo(type = "friends",
      private UserAccount user;               elementClass = UserAccount.class)
      @EndNode                           Set<UserAccount> friends;
      private Restaurant restaurant;     @RelatedToVia(type = "recommends",
      private int stars;                      elementClass = Recommendation.class)
      private String comment;            Iterable<Recommendation> recommendations;



                                                                                     58
And we’re back to talking about Middleware




                                        59
And we’re back to talking about Middleware
๏ This example was from the Spring Data project
   • Specifically Spring Data Graph
   • Available at: http://www.springsource.org/spring-data
   • Currently in M02 -- will be released 1.0 end of March
   • Would LOVEkinda love,REALLY love, likeifValentine’s day user
       yesterday
                    <--- like
                              some feedback you’re a Spring




                                                             59
And we’re back to talking about Middleware
๏ This example was from the Spring Data project
   • Specifically Spring Data Graph
   • Available at: http://www.springsource.org/spring-data
   • Currently in M02 -- will be released 1.0 end of March
   • Would LOVEkinda love,REALLY love, likeifValentine’s day user
       yesterday
                    <--- like
                              some feedback you’re a Spring


๏ But this really should be available in any middleware stack
   • Ask Redhat / JBoss
   • Ask Sun / Oracle                                           59
      Ask Microsoft
Conclusion
๏ There’s an explosion of ‘nosql’ databases out there
   • Some are immature and experimental
   • Some are coming out of years of battle-hardened production
๏ NOSQL is about finding the right tool for the job
   • Frequently that’s an RDBMS
   • But increasingly commonly an RDBMS is the perfect fit
๏ We will have heterogenous data backends in the future
   • Now the restthatthe stack needs to step up and help developers
      cope with
                  of
                                                            60
Key takeaway

Not Only SQL
   is here
               61
Key takeaway

Not Only SQL
is here to stay
                  62
Key takeaway

 Not Only SQL
is FUN - dl & play
   around now!
                     63
Image credits: Lost! Sorry... :(



                                   64
http://neotechnology.com

More Related Content

Viewers also liked

MysticWealth's Presentation at IIF 2016, New Delhi
MysticWealth's Presentation at IIF 2016, New DelhiMysticWealth's Presentation at IIF 2016, New Delhi
MysticWealth's Presentation at IIF 2016, New DelhiManish Dhawan
 
Tony tata harvard jfk school educated
Tony tata   harvard jfk school educatedTony tata   harvard jfk school educated
Tony tata harvard jfk school educatedTony Tata
 
Cuentos colegio orlando higuita rojas. claudia martinez
Cuentos colegio orlando higuita rojas. claudia martinezCuentos colegio orlando higuita rojas. claudia martinez
Cuentos colegio orlando higuita rojas. claudia martinezClaudia Martinez
 
Alpha & Omega Presentation
Alpha & Omega PresentationAlpha & Omega Presentation
Alpha & Omega PresentationDarryl Santa
 
La gerencia y ciclo de vida de los proyectos maclau
La gerencia y ciclo de vida de los proyectos maclauLa gerencia y ciclo de vida de los proyectos maclau
La gerencia y ciclo de vida de los proyectos maclauClaudia Martinez
 
Seritex nordan salazar
Seritex nordan salazarSeritex nordan salazar
Seritex nordan salazarnordansalazar
 
Slides from GraphDay Santa Clara
Slides from GraphDay Santa ClaraSlides from GraphDay Santa Clara
Slides from GraphDay Santa ClaraNeo4j
 
Startups in Sweden vs Startups in Silicon Valley, 2015 edition
Startups in Sweden vs Startups in Silicon Valley, 2015 editionStartups in Sweden vs Startups in Silicon Valley, 2015 edition
Startups in Sweden vs Startups in Silicon Valley, 2015 editionEmil Eifrem
 
How I Smashed Our Indiegogo in 2 Days
How I Smashed Our Indiegogo in 2 DaysHow I Smashed Our Indiegogo in 2 Days
How I Smashed Our Indiegogo in 2 DaysIdea Hunt
 
8 grejer som storföretag kan lära av startups
8 grejer som storföretag kan lära av startups8 grejer som storföretag kan lära av startups
8 grejer som storföretag kan lära av startupsIdea Hunt
 
Scann artikel Nevelpanters - Majesteit 104 dec-jan 2016
Scann artikel Nevelpanters - Majesteit 104 dec-jan 2016Scann artikel Nevelpanters - Majesteit 104 dec-jan 2016
Scann artikel Nevelpanters - Majesteit 104 dec-jan 2016Mari van Kampen
 
GraphConnect Europe 2016 - Importing Data - Mark Needham, Michael Hunger
GraphConnect Europe 2016 - Importing Data - Mark Needham, Michael HungerGraphConnect Europe 2016 - Importing Data - Mark Needham, Michael Hunger
GraphConnect Europe 2016 - Importing Data - Mark Needham, Michael HungerNeo4j
 
GraphConnect Europe 2016 - Pushing the Evolution of Software Analytics with G...
GraphConnect Europe 2016 - Pushing the Evolution of Software Analytics with G...GraphConnect Europe 2016 - Pushing the Evolution of Software Analytics with G...
GraphConnect Europe 2016 - Pushing the Evolution of Software Analytics with G...Neo4j
 

Viewers also liked (16)

MysticWealth's Presentation at IIF 2016, New Delhi
MysticWealth's Presentation at IIF 2016, New DelhiMysticWealth's Presentation at IIF 2016, New Delhi
MysticWealth's Presentation at IIF 2016, New Delhi
 
CV-Ios Developer
CV-Ios DeveloperCV-Ios Developer
CV-Ios Developer
 
Tony tata harvard jfk school educated
Tony tata   harvard jfk school educatedTony tata   harvard jfk school educated
Tony tata harvard jfk school educated
 
Cuentos colegio orlando higuita rojas. claudia martinez
Cuentos colegio orlando higuita rojas. claudia martinezCuentos colegio orlando higuita rojas. claudia martinez
Cuentos colegio orlando higuita rojas. claudia martinez
 
Alpha & Omega Presentation
Alpha & Omega PresentationAlpha & Omega Presentation
Alpha & Omega Presentation
 
La gerencia y ciclo de vida de los proyectos maclau
La gerencia y ciclo de vida de los proyectos maclauLa gerencia y ciclo de vida de los proyectos maclau
La gerencia y ciclo de vida de los proyectos maclau
 
New Purist
New PuristNew Purist
New Purist
 
Seritex nordan salazar
Seritex nordan salazarSeritex nordan salazar
Seritex nordan salazar
 
Slides from GraphDay Santa Clara
Slides from GraphDay Santa ClaraSlides from GraphDay Santa Clara
Slides from GraphDay Santa Clara
 
Startups in Sweden vs Startups in Silicon Valley, 2015 edition
Startups in Sweden vs Startups in Silicon Valley, 2015 editionStartups in Sweden vs Startups in Silicon Valley, 2015 edition
Startups in Sweden vs Startups in Silicon Valley, 2015 edition
 
How I Smashed Our Indiegogo in 2 Days
How I Smashed Our Indiegogo in 2 DaysHow I Smashed Our Indiegogo in 2 Days
How I Smashed Our Indiegogo in 2 Days
 
8 grejer som storföretag kan lära av startups
8 grejer som storföretag kan lära av startups8 grejer som storföretag kan lära av startups
8 grejer som storföretag kan lära av startups
 
Scann artikel Nevelpanters - Majesteit 104 dec-jan 2016
Scann artikel Nevelpanters - Majesteit 104 dec-jan 2016Scann artikel Nevelpanters - Majesteit 104 dec-jan 2016
Scann artikel Nevelpanters - Majesteit 104 dec-jan 2016
 
GraphConnect Europe 2016 - Importing Data - Mark Needham, Michael Hunger
GraphConnect Europe 2016 - Importing Data - Mark Needham, Michael HungerGraphConnect Europe 2016 - Importing Data - Mark Needham, Michael Hunger
GraphConnect Europe 2016 - Importing Data - Mark Needham, Michael Hunger
 
GraphConnect Europe 2016 - Pushing the Evolution of Software Analytics with G...
GraphConnect Europe 2016 - Pushing the Evolution of Software Analytics with G...GraphConnect Europe 2016 - Pushing the Evolution of Software Analytics with G...
GraphConnect Europe 2016 - Pushing the Evolution of Software Analytics with G...
 
Sistema Linfático
Sistema Linfático Sistema Linfático
Sistema Linfático
 

Similar to An overview of NOSQL (JFokus 2011)

NOSQLEU - Graph Databases and Neo4j
NOSQLEU - Graph Databases and Neo4jNOSQLEU - Graph Databases and Neo4j
NOSQLEU - Graph Databases and Neo4jTobias Lindaaker
 
Web 2.0 toolset overview
Web 2.0 toolset overviewWeb 2.0 toolset overview
Web 2.0 toolset overviewTom Raftery
 
NoSQL with Hadoop and HBase
NoSQL with Hadoop and HBaseNoSQL with Hadoop and HBase
NoSQL with Hadoop and HBaseNGDATA
 
NoSQL intro for YaJUG / NoSQL UG Luxembourg
NoSQL intro for YaJUG / NoSQL UG LuxembourgNoSQL intro for YaJUG / NoSQL UG Luxembourg
NoSQL intro for YaJUG / NoSQL UG LuxembourgNGDATA
 
Explaining The Semantic Web
Explaining The Semantic WebExplaining The Semantic Web
Explaining The Semantic WebSourav Sharma
 
Towards Social Webtops Using Semantic Wiki
Towards Social Webtops Using Semantic WikiTowards Social Webtops Using Semantic Wiki
Towards Social Webtops Using Semantic WikiJie Bao
 
Linked data and semantic wikis
Linked data and semantic wikisLinked data and semantic wikis
Linked data and semantic wikisSören Auer
 
Ontodia Overview - Semantics and Wikis panel - SemTech West 2012
Ontodia Overview - Semantics and Wikis panel - SemTech West 2012Ontodia Overview - Semantics and Wikis panel - SemTech West 2012
Ontodia Overview - Semantics and Wikis panel - SemTech West 2012Joel Natividad
 
WordLift - Microdata for WordPress using the Interactive Knowledge Stack (IKS)
WordLift - Microdata for WordPress using the Interactive Knowledge Stack (IKS)WordLift - Microdata for WordPress using the Interactive Knowledge Stack (IKS)
WordLift - Microdata for WordPress using the Interactive Knowledge Stack (IKS)Andrea Volpini
 
Django and Neo4j - Domain modeling that kicks ass
Django and Neo4j - Domain modeling that kicks assDjango and Neo4j - Domain modeling that kicks ass
Django and Neo4j - Domain modeling that kicks assTobias Lindaaker
 
Content Used to be King: The Semantic Web in Education
Content Used to be King: The Semantic Web in EducationContent Used to be King: The Semantic Web in Education
Content Used to be King: The Semantic Web in EducationJudy O'Connell
 
Semantic Web & Web 3.0 – Eine Einführung
Semantic Web & Web 3.0 – Eine EinführungSemantic Web & Web 3.0 – Eine Einführung
Semantic Web & Web 3.0 – Eine Einführungbasis06 AG
 
CSC 8101 Non Relational Databases
CSC 8101 Non Relational DatabasesCSC 8101 Non Relational Databases
CSC 8101 Non Relational Databasessjwoodman
 
Tics Article 6 Ideas
Tics Article 6 IdeasTics Article 6 Ideas
Tics Article 6 IdeasXimenaBonilla
 
Tics Article 6 Ideas
Tics Article 6 IdeasTics Article 6 Ideas
Tics Article 6 IdeasXimenaBonilla
 
00 융복합형태 콘텐츠 서비스 환경 v0.7 20110527
00 융복합형태 콘텐츠 서비스 환경 v0.7 2011052700 융복합형태 콘텐츠 서비스 환경 v0.7 20110527
00 융복합형태 콘텐츠 서비스 환경 v0.7 20110527Kyung Rog Kim
 
Web 3.0: The Upcoming Revolution
Web 3.0: The Upcoming RevolutionWeb 3.0: The Upcoming Revolution
Web 3.0: The Upcoming RevolutionNitin Godawat
 

Similar to An overview of NOSQL (JFokus 2011) (20)

NOSQLEU - Graph Databases and Neo4j
NOSQLEU - Graph Databases and Neo4jNOSQLEU - Graph Databases and Neo4j
NOSQLEU - Graph Databases and Neo4j
 
Web 2.0 toolset overview
Web 2.0 toolset overviewWeb 2.0 toolset overview
Web 2.0 toolset overview
 
NoSQL with Hadoop and HBase
NoSQL with Hadoop and HBaseNoSQL with Hadoop and HBase
NoSQL with Hadoop and HBase
 
NoSQL intro for YaJUG / NoSQL UG Luxembourg
NoSQL intro for YaJUG / NoSQL UG LuxembourgNoSQL intro for YaJUG / NoSQL UG Luxembourg
NoSQL intro for YaJUG / NoSQL UG Luxembourg
 
Frydenberg Web20 Scu09
Frydenberg Web20 Scu09Frydenberg Web20 Scu09
Frydenberg Web20 Scu09
 
Explaining The Semantic Web
Explaining The Semantic WebExplaining The Semantic Web
Explaining The Semantic Web
 
Towards Social Webtops Using Semantic Wiki
Towards Social Webtops Using Semantic WikiTowards Social Webtops Using Semantic Wiki
Towards Social Webtops Using Semantic Wiki
 
Linked data and semantic wikis
Linked data and semantic wikisLinked data and semantic wikis
Linked data and semantic wikis
 
Ontodia Overview - Semantics and Wikis panel - SemTech West 2012
Ontodia Overview - Semantics and Wikis panel - SemTech West 2012Ontodia Overview - Semantics and Wikis panel - SemTech West 2012
Ontodia Overview - Semantics and Wikis panel - SemTech West 2012
 
WordLift - Microdata for WordPress using the Interactive Knowledge Stack (IKS)
WordLift - Microdata for WordPress using the Interactive Knowledge Stack (IKS)WordLift - Microdata for WordPress using the Interactive Knowledge Stack (IKS)
WordLift - Microdata for WordPress using the Interactive Knowledge Stack (IKS)
 
Sws Han
Sws HanSws Han
Sws Han
 
Django and Neo4j - Domain modeling that kicks ass
Django and Neo4j - Domain modeling that kicks assDjango and Neo4j - Domain modeling that kicks ass
Django and Neo4j - Domain modeling that kicks ass
 
Nederland Leert Event 10 juni 2010
Nederland Leert Event 10 juni 2010Nederland Leert Event 10 juni 2010
Nederland Leert Event 10 juni 2010
 
Content Used to be King: The Semantic Web in Education
Content Used to be King: The Semantic Web in EducationContent Used to be King: The Semantic Web in Education
Content Used to be King: The Semantic Web in Education
 
Semantic Web & Web 3.0 – Eine Einführung
Semantic Web & Web 3.0 – Eine EinführungSemantic Web & Web 3.0 – Eine Einführung
Semantic Web & Web 3.0 – Eine Einführung
 
CSC 8101 Non Relational Databases
CSC 8101 Non Relational DatabasesCSC 8101 Non Relational Databases
CSC 8101 Non Relational Databases
 
Tics Article 6 Ideas
Tics Article 6 IdeasTics Article 6 Ideas
Tics Article 6 Ideas
 
Tics Article 6 Ideas
Tics Article 6 IdeasTics Article 6 Ideas
Tics Article 6 Ideas
 
00 융복합형태 콘텐츠 서비스 환경 v0.7 20110527
00 융복합형태 콘텐츠 서비스 환경 v0.7 2011052700 융복합형태 콘텐츠 서비스 환경 v0.7 20110527
00 융복합형태 콘텐츠 서비스 환경 v0.7 20110527
 
Web 3.0: The Upcoming Revolution
Web 3.0: The Upcoming RevolutionWeb 3.0: The Upcoming Revolution
Web 3.0: The Upcoming Revolution
 

More from Emil Eifrem

GraphConnect SF 2013 Keynote
GraphConnect SF 2013 KeynoteGraphConnect SF 2013 Keynote
GraphConnect SF 2013 KeynoteEmil Eifrem
 
An Overview of the Emerging Graph Landscape (Oct 2013)
An Overview of the Emerging Graph Landscape (Oct 2013)An Overview of the Emerging Graph Landscape (Oct 2013)
An Overview of the Emerging Graph Landscape (Oct 2013)Emil Eifrem
 
Startups in Sweden vs Startups in Silicon Valley
Startups in Sweden vs Startups in Silicon ValleyStartups in Sweden vs Startups in Silicon Valley
Startups in Sweden vs Startups in Silicon ValleyEmil Eifrem
 
An intro to Neo4j and some use cases (JFokus 2011)
An intro to Neo4j and some use cases (JFokus 2011)An intro to Neo4j and some use cases (JFokus 2011)
An intro to Neo4j and some use cases (JFokus 2011)Emil Eifrem
 
NOSQL part of the SpringOne 2GX 2010 keynote
NOSQL part of the SpringOne 2GX 2010 keynoteNOSQL part of the SpringOne 2GX 2010 keynote
NOSQL part of the SpringOne 2GX 2010 keynoteEmil Eifrem
 
Neo4j -- or why graph dbs kick ass
Neo4j -- or why graph dbs kick assNeo4j -- or why graph dbs kick ass
Neo4j -- or why graph dbs kick assEmil Eifrem
 

More from Emil Eifrem (6)

GraphConnect SF 2013 Keynote
GraphConnect SF 2013 KeynoteGraphConnect SF 2013 Keynote
GraphConnect SF 2013 Keynote
 
An Overview of the Emerging Graph Landscape (Oct 2013)
An Overview of the Emerging Graph Landscape (Oct 2013)An Overview of the Emerging Graph Landscape (Oct 2013)
An Overview of the Emerging Graph Landscape (Oct 2013)
 
Startups in Sweden vs Startups in Silicon Valley
Startups in Sweden vs Startups in Silicon ValleyStartups in Sweden vs Startups in Silicon Valley
Startups in Sweden vs Startups in Silicon Valley
 
An intro to Neo4j and some use cases (JFokus 2011)
An intro to Neo4j and some use cases (JFokus 2011)An intro to Neo4j and some use cases (JFokus 2011)
An intro to Neo4j and some use cases (JFokus 2011)
 
NOSQL part of the SpringOne 2GX 2010 keynote
NOSQL part of the SpringOne 2GX 2010 keynoteNOSQL part of the SpringOne 2GX 2010 keynote
NOSQL part of the SpringOne 2GX 2010 keynote
 
Neo4j -- or why graph dbs kick ass
Neo4j -- or why graph dbs kick assNeo4j -- or why graph dbs kick ass
Neo4j -- or why graph dbs kick ass
 

Recently uploaded

UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...DianaGray10
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationIES VE
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URLRuncy Oommen
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024D Cloud Solutions
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostMatt Ray
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsSafe Software
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6DianaGray10
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-pyJamie (Taka) Wang
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxGDSC PJATK
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 

Recently uploaded (20)

UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
Connector Corner: Extending LLM automation use cases with UiPath GenAI connec...
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
Designing A Time bound resource download URL
Designing A Time bound resource download URLDesigning A Time bound resource download URL
Designing A Time bound resource download URL
 
20230104 - machine vision
20230104 - machine vision20230104 - machine vision
20230104 - machine vision
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6
 
20230202 - Introduction to tis-py
20230202 - Introduction to tis-py20230202 - Introduction to tis-py
20230202 - Introduction to tis-py
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
Cybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptxCybersecurity Workshop #1.pptx
Cybersecurity Workshop #1.pptx
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 

An overview of NOSQL (JFokus 2011)

  • 1. NOSQL - an overview - JFokus 2011 Emil Eifrem @emileifrem CEO, Neo Technology emil@neotechnology.com #neo4j
  • 2. So what’s the plan? ๏ Why NOSQL? ๏ The NOSQL landscape ๏ NOSQL challenges ๏ Conclusion 2
  • 3. First off: the name ๏ WE ALL HATES IT, M’KAY? 3
  • 5. NOSQL is NOT... ๏ NO to SQL 4
  • 6. NOSQL is NOT... ๏ NO to SQL ๏ NEVER SQL 4
  • 7. NOSQL is simply Not Only SQL 5
  • 9. NOSQL - Why now? Four trends 7
  • 10. Trend 1: data set size 40 2007 Source: IDC 2007
  • 11. 988 Trend 1: data set size 40 2007 2010 Source: IDC 2007
  • 12. Trend 2: Connectedness Information connectivity web 1.0 web 2.0 “web 3.0” 1990 2000 2010 2020 10
  • 13. Trend 2: Connectedness Information connectivity Text documents web 1.0 web 2.0 “web 3.0” 1990 2000 2010 2020 11
  • 14. Trend 2: Connectedness Information connectivity Hypertext Text documents web 1.0 web 2.0 “web 3.0” 1990 2000 2010 2020 12
  • 15. Trend 2: Connectedness Folksonomies Information connectivity Tagging Wikis User-generated content Blogs RSS Hypertext Text documents web 1.0 web 2.0 “web 3.0” 1990 2000 2010 2020 13
  • 16. Trend 2: Connectedness Giant Global Graph (GGG) Ontologies RDF Folksonomies Information connectivity Tagging Wikis User-generated content Blogs RSS Hypertext Text documents web 1.0 web 2.0 “web 3.0” 1990 2000 2010 2020 14
  • 17. Trend 2: Connectedness Giant Global Graph (GGG) Ontologies RDF Folksonomies Information connectivity Tagging Wikis User-generated content Blogs RSS Hypertext Text documents web 1.0 web 2.0 “web 3.0” 1990 2000 2010 2020 15
  • 18. Trend 3: Semi-structure ๏ Individualization of content • In the salary lists of the 1970s, all elements had exactly one job • In Or 15? lists of the 2000s, we need 5 job columns! Or 8? the salary ๏ All encompassing “entire world views” • Store more data about each entity ๏ Trend accelerated by the decentralization of content generation that is the hallmark of the age of participation (“web 2.0”) 16
  • 19. Aside: RDBMS performance Relational database Requirement of application Performance Data complexity 17
  • 20. Aside: RDBMS performance Relational database Requirement of application Performance Data complexity 18
  • 21. Aside: RDBMS performance Salary List Relational database Requirement of application Performance Data complexity 19
  • 22. Aside: RDBMS performance Salary List Relational database Requirement of application Performance Majority of Webapps Data complexity 20
  • 23. Aside: RDBMS performance Salary List Relational database Requirement of application Performance Majority of Webapps Social network } Semantic Trading custom Data complexity 21
  • 24. Trend 4: Architecture 1980s: Application (<-- note lack of s) Application DB 22
  • 25. Trend 4: Architecture 1990s: Database as integration hub Application Application Application DB 23
  • 26. Trend 4: Architecture 2000s: (moving towards) Decoupled services with their own backend Service Service Service DB DB DB 24
  • 27. Why NOSQL Now? ๏Trend 1: Size ๏Trend 2: Connectedness ๏Trend 3: Semi-structure ๏Trend 4: Architecture 25
  • 29. Category 1: Key-Value stores ๏ Lineage: • “Dynamo: Amazon’s Highly Available Key-Value Store” (2007) ๏ Data model: • Global key-value mapping • Think: Globally available HashMap/Dict/etc ๏ Examples: • Project Voldemort • Tokyo {Cabinet,Tyrant, etc} 27 Riak
  • 30. Category 1: Key-Value stores ๏ Strengths • Simple data model • Great at scaling out horizontally ๏ Weaknesses: • Simplistic data model • Poor for complex data 28
  • 31. Category II: ColumnFamily (BigTable) stores ๏ Lineage: • “Bigtable:(2006) Data” A Distributed Storage System for Structured ๏ Data model: • A big table, with column families ๏ Examples: • HBase • HyperTable • Cassandra 29
  • 32. Category III: Document databases ๏ Lineage: • Lotus Notes ๏ Data model: • Collections of documents • A document is a key-value collection ๏ Examples: • CouchDB • MongoDB 30 Terrastore
  • 33. Document db: An example ๏ How would we model a blogging software? ๏ One stab: • Represent each Blog as a Collection of Post documents • Represent Comments as nested documents in the Post documents 31
  • 34. Document db: Creating a blog post import com.mongodb.Mongo; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; // ... Mongo mongo = new Mongo( "localhost" ); // Connect to MongoDB // ... DB blogs = mongo.getDB( "blogs" ); // Access the blogs database DBCollection myBlog = blogs.getCollection( "Thobe’s blog" ); DBObject blogPost = new BasicDBObject(); blogPost.put( "title", "JFokus 2011" ); blogPost.put( "pub_date", new Date() ); blogPost.put( "body", "Publishing a post about JFokus in my MongoDB blog!" ); blogPost.put( "tags", Arrays.asList( "conference", "names" ) ); blogPost.put( "comments", new ArrayList() ); myBlog.insert( blogPost ); 32
  • 35. Retrieving posts // ... import com.mongodb.DBCursor; // ... public Object getAllPosts( String blogName ) { DBCollection blog = db.getCollection( blogName ); return renderPosts( blog.find() ); } private Object renderPosts( DBCursor cursor ) { // order by publication date (descending) cursor = cursor.sort( new BasicDBObject( "pub_date", -1 ) ); // ... } 33
  • 36. Category IV: Graph databases ๏ Lineage: • Euler and graph theory ๏ Data model: • Nodes with properties • Typed relationships with properties ๏ Examples: • Sones GraphDB • InfiniteGraph 34 Neo4j
  • 38. Property Graph model LOVES LIVES WITH LOVES OWNS DRIVES 36
  • 39. Property Graph model name: “Mary” LOVES name: “James” age: 35 age: 32 LIVES WITH twitter: “@spam” LOVES OWNS property type: “car” DRIVES brand: “Volvo” model: “V70” 37
  • 40. Graphs are whiteboard friendly An application domain model outlined on a whiteboard or piece of paper would be translated to an ER-diagram, then normalized to fit a Relational Database. With a Graph Database the model from the whiteboard is implemented directly. Image credits: Tobias Ivarsson 38
  • 41. Graphs are whiteboard friendly An application domain model outlined on a whiteboard or piece of paper would be translated to an ER-diagram, then normalized to fit a Relational Database. With a Graph Database the model thobe from the whiteboard is implemented directly. Joe project blog Wardrobe Strength Hello Joe Modularizing Jython Neo4j performance analysis Image credits: Tobias Ivarsson 39
  • 42. Graph db: Creating a social graph GraphDatabaseService graphDb = new EmbeddedGraphDatabase( GRAPH_STORAGE_LOCATION ); Transaction tx = graphDb.beginTx(); try { Node mrAnderson = graphDb.createNode(); mrAnderson.setProperty( "name", "Thomas Anderson" ); mrAnderson.setProperty( "age", 29 ); Node morpheus = graphDb.createNode(); morpheus.setProperty( "name", "Morpheus" ); morpheus.setProperty( "rank", "Captain" ); Relationship friendship = mrAnderson.createRelationshipTo( morpheus, SocialGraphTypes.FRIENDSHIP ); tx.success(); } finally { tx.finish(); } 40
  • 43. Graph db: How do I know this person? Node me = ... Node you = ... PathFinder shortestPathFinder = GraphAlgoFactory.shortestPath( Traversals.expanderForTypes( SocialGraphTypes.FRIENDSHIP, Direction.BOTH ), /* maximum depth: */ 4 ); Path shortestPath = shortestPathFinder.findSinglePath(me, you); for ( Node friend : shortestPath.nodes() ) { System.out.println( friend.getProperty( "name" ) ); } 41
  • 44. Graph db: Recommend new friends Node person = ... TraversalDescription friendsOfFriends = Traversal.description() .expand( Traversals.expanderForTypes( SocialGraphTypes.FRIENDSHIP, Direction.BOTH ) ) .prune( Traversal.pruneAfterDepth( 2 ) ) .breadthFirst() // Visit my friends before their friends. //Visit a node at most once (don’t recommend direct friends) .uniqueness( Uniqueness.NODE_GLOBAL ) .filter( new Predicate<Path>() { // Only return friends of friends public boolean accept( Path traversalPos ) { return traversalPos.length() == 2; } } ); for ( Node recommendation : friendsOfFriends.traverse( person ).nodes() ) { System.out.println( recommendedFriend.getProperty("name") ); } 42
  • 45. Four emerging NOSQL categories ๏Key-Value stores ๏ColumnFamiy stores ๏Document databases ๏Graph databases 43
  • 46. Scaling to size vs. Scaling to complexity Size Key/Value stores Complexity 44
  • 47. Scaling to size vs. Scaling to complexity Size Key/Value stores ColumnFamily stores Complexity 44
  • 48. Scaling to size vs. Scaling to complexity Size Key/Value stores ColumnFamily stores Document databases Complexity 44
  • 49. Scaling to size vs. Scaling to complexity Size Key/Value stores ColumnFamily stores Document databases Graph databases Complexity 44
  • 50. Scaling to size vs. Scaling to complexity Size Key/Value stores ColumnFamily stores Document databases Graph databases Billions of nodes and relationships My subjective view: > 90% of use cases Complexity 44
  • 52. NOSQL challenges? ๏ Mindshare • But that’s also product usability (“how do you query it?”) 45
  • 53. NOSQL challenges? ๏ Mindshare • But that’s also product usability (“how do you query it?”) ๏ Tool support • Both devtime tools and runtime ops tools • Standards may help? • ... or maybe just time 45
  • 54. NOSQL challenges? ๏ Mindshare • But that’s also product usability (“how do you query it?”) ๏ Tool support • Both devtime tools and runtime ops tools • Standards may help? • ... or maybe just time ๏ Middleware support 45
  • 55. Middleware support? ๏ Lemme tell you the story about Mike and his restaurant site 46
  • 56. Domain & data model Restaurant UserAccount @Entity @Entity public class Restaurant { @Table(name = "user_account") @Id @GeneratedValue public class UserAccount { private Long id; @Id @GeneratedValue private String name; private Long id; private String city; private String userName; private String state; private String firstName; private String zipCode; private String lastName; @Temporal(TemporalType.TIMESTAMP) private Date birthDate; @ManyToMany(cascade = CascadeType.ALL) private Set<Restaurant> favorites; 47
  • 57. Step 1: Buildsing a web site Tomcat One box MySQL 48
  • 58. Step II: Whoa, ppl are actually using it? 49
  • 59. Step II: Whoa, ppl are actually using it? Tomcat Two boxes MySQL 49
  • 60. Step III: That’s a LOT of pages served... 50
  • 61. Step III: That’s a LOT of pages served... Tomcat Tomcat Tomcat n boxes MySQL 1 box 50
  • 62. Step IV: Our DB is completely overwhelmed... 51
  • 63. Step IV: Our DB is completely overwhelmed... Tomcat Tomcat Tomcat n boxes MySQL (m) MySQL (s) n boxes 51
  • 64. Step V: Our DBs are STILL overwhelmed ? 52
  • 65. What does the site look like now? 53
  • 66. Step V: Our DBs are STILL overwhelmed ๏ Turns out the problem is due to joins ๏ A while back Mike introduced a new feature • Recommend restaurants based on the user’s friends (and friends of friends) • Whoa, recommendations aren’t just simple get and put! • They’re killing us with joins ๏ What about sharding? ๏ What about SSDs? 54
  • 67. Polyglot persistence (Not Only SQL) ๏ How did we get into this situation? ๏ Well, data sets are increasingly less uniform ๏ Parts of Mike’s data fits well in an RDBMS ๏ But parts of it is graph-shaped • It fits much better in a graph database! • And I’m sure that there is or will be very key-value-esque parts of the dataset ๏ Simple, just store some of it in a graph db and some of it in MySQL! But what does the code look like? 55
  • 69. We were here Restaurant UserAccount @Entity @Entity public class Restaurant { @Table(name = "user_account") @Id @GeneratedValue public class UserAccount { private Long id; @Id @GeneratedValue private String name; private Long id; private String city; private String userName; private String state; private String firstName; private String zipCode; private String lastName; @Temporal(TemporalType.TIMESTAMP) private Date birthDate; @ManyToMany(cascade = CascadeType.ALL) private Set<Restaurant> favorites; 56
  • 70. Then we added recommendations Restaurant UserAccount @Entity @Entity @NodeEntity(partial = true) @Table(name = "user_account") public class Restaurant { @NodeEntity(partial = true) @Id @GeneratedValue public class UserAccount { private Long id; @Id @GeneratedValue private String name; private Long id; private String city; private String userName; private String state; private String firstName; private String zipCode; private String lastName; @Temporal(TemporalType.TIMESTAMP) private Date birthDate; @ManyToMany(cascade = CascadeType.ALL) Recommendation private Set<Restaurant> favorites; @RelationshipEntity @GraphProperty public class Recommendation { String nickname; @StartNode @RelatedTo(type = "friends", private UserAccount user; elementClass = UserAccount.class) @EndNode Set<UserAccount> friends; private Restaurant restaurant; @RelatedToVia(type = "recommends", private int stars; elementClass = Recommendation.class) private String comment; Iterable<Recommendation> recommendations; 57
  • 71. Then we added recommendations Restaurant UserAccount @Entity @Entity @NodeEntity(partial = true) @Table(name = "user_account") public class Restaurant { @NodeEntity(partial = true) @Id @GeneratedValue public class UserAccount { private Long id; @Id @GeneratedValue private String name; private Long id; private String city; private String userName; private String state; private String firstName; private String zipCode; private String lastName; @Temporal(TemporalType.TIMESTAMP) private Date birthDate; @ManyToMany(cascade = CascadeType.ALL) Recommendation private Set<Restaurant> favorites; @RelationshipEntity @GraphProperty public class Recommendation { String nickname; @StartNode @RelatedTo(type = "friends", private UserAccount user; elementClass = UserAccount.class) @EndNode Set<UserAccount> friends; private Restaurant restaurant; @RelatedToVia(type = "recommends", private int stars; elementClass = Recommendation.class) private String comment; Iterable<Recommendation> recommendations; 58
  • 72. Then we added recommendations Restaurant UserAccount @Entity @Entity @NodeEntity(partial = true) @Table(name = "user_account") public class Restaurant { @NodeEntity(partial = true) @Id @GeneratedValue public class UserAccount { private Long id; @Id @GeneratedValue private String name; private Long id; private String city; private String userName; private String state; private String firstName; private String zipCode; private String lastName; @Temporal(TemporalType.TIMESTAMP) private Date birthDate; @ManyToMany(cascade = CascadeType.ALL) Recommendation private Set<Restaurant> favorites; @RelationshipEntity @GraphProperty public class Recommendation { String nickname; @StartNode @RelatedTo(type = "friends", private UserAccount user; elementClass = UserAccount.class) @EndNode Set<UserAccount> friends; private Restaurant restaurant; @RelatedToVia(type = "recommends", private int stars; elementClass = Recommendation.class) private String comment; Iterable<Recommendation> recommendations; 58
  • 73. Then we added recommendations Restaurant UserAccount @Entity @Entity @NodeEntity(partial = true) @Table(name = "user_account") public class Restaurant { @NodeEntity(partial = true) @Id @GeneratedValue public class UserAccount { private Long id; @Id @GeneratedValue private String name; private Long id; private String city; private String userName; private String state; private String firstName; private String zipCode; private String lastName; @Temporal(TemporalType.TIMESTAMP) private Date birthDate; @ManyToMany(cascade = CascadeType.ALL) Recommendation private Set<Restaurant> favorites; @RelationshipEntity @GraphProperty public class Recommendation { String nickname; @StartNode @RelatedTo(type = "friends", private UserAccount user; elementClass = UserAccount.class) @EndNode Set<UserAccount> friends; private Restaurant restaurant; @RelatedToVia(type = "recommends", private int stars; elementClass = Recommendation.class) private String comment; Iterable<Recommendation> recommendations; 58
  • 74. Then we added recommendations Restaurant UserAccount @Entity @Entity @NodeEntity(partial = true) @Table(name = "user_account") public class Restaurant { @NodeEntity(partial = true) @Id @GeneratedValue public class UserAccount { private Long id; @Id @GeneratedValue private String name; private Long id; private String city; private String userName; private String state; private String firstName; private String zipCode; private String lastName; @Temporal(TemporalType.TIMESTAMP) private Date birthDate; @ManyToMany(cascade = CascadeType.ALL) Recommendation private Set<Restaurant> favorites; @RelationshipEntity @GraphProperty public class Recommendation { String nickname; @StartNode @RelatedTo(type = "friends", private UserAccount user; elementClass = UserAccount.class) @EndNode Set<UserAccount> friends; private Restaurant restaurant; @RelatedToVia(type = "recommends", private int stars; elementClass = Recommendation.class) private String comment; Iterable<Recommendation> recommendations; 58
  • 75. And we’re back to talking about Middleware 59
  • 76. And we’re back to talking about Middleware ๏ This example was from the Spring Data project • Specifically Spring Data Graph • Available at: http://www.springsource.org/spring-data • Currently in M02 -- will be released 1.0 end of March • Would LOVEkinda love,REALLY love, likeifValentine’s day user yesterday <--- like some feedback you’re a Spring 59
  • 77. And we’re back to talking about Middleware ๏ This example was from the Spring Data project • Specifically Spring Data Graph • Available at: http://www.springsource.org/spring-data • Currently in M02 -- will be released 1.0 end of March • Would LOVEkinda love,REALLY love, likeifValentine’s day user yesterday <--- like some feedback you’re a Spring ๏ But this really should be available in any middleware stack • Ask Redhat / JBoss • Ask Sun / Oracle 59 Ask Microsoft
  • 78. Conclusion ๏ There’s an explosion of ‘nosql’ databases out there • Some are immature and experimental • Some are coming out of years of battle-hardened production ๏ NOSQL is about finding the right tool for the job • Frequently that’s an RDBMS • But increasingly commonly an RDBMS is the perfect fit ๏ We will have heterogenous data backends in the future • Now the restthatthe stack needs to step up and help developers cope with of 60
  • 79. Key takeaway Not Only SQL is here 61
  • 80. Key takeaway Not Only SQL is here to stay 62
  • 81. Key takeaway Not Only SQL is FUN - dl & play around now! 63
  • 82. Image credits: Lost! Sorry... :( 64