grails and neo4j

27
Grails and Neo4j Stefan Armbruster gr8conf CPH, 2011 May 19th

Upload: darthvader42

Post on 10-May-2015

4.501 views

Category:

Technology


3 download

DESCRIPTION

Talk given at http://eu.gr8conf.org 2011 regarding integrating Neo4j as a full GORM compliant Datastore for Grails applications.

TRANSCRIPT

Page 1: Grails and Neo4j

Grails and Neo4j

Stefan Armbruster

gr8conf CPH, 2011 May 19th

Page 2: Grails and Neo4j

About myself

●located in Munich/Germany●freelancer since 10 years ●cofounder of Netjay●Java +10 years, Groovy ~5 years, Grails 3+ years●author of some Grails plugins●cofounder of the usergroup in Munich●passionate volunteer firefighter●twitter: darthvader42●http://blog.armbruster-it.de

Page 3: Grails and Neo4j

What's wrong with SQL?

What's about the hype of NoSQL?

Page 4: Grails and Neo4j
Page 5: Grails and Neo4j
Page 6: Grails and Neo4j

4 trends

●much larger data sets: ● IDC comparison: 2010 to 2007 is 40 : 1

●data gets more connected●semi-structured data●horizontal scalability – distributed architecture

Page 7: Grails and Neo4j

One size fits all?

Page 8: Grails and Neo4j

exploring the nosql-landscape

Key-Value:Key-Value:➢RIAK *➢Redis *➢Membase

Bigtable:Bigtable:➢Hadoop / Hbase *➢SimpleDB➢Cassandra **

Graph:Graph:➢InfiniteGraph➢Neo4j *

DocumentDocument:➢CouchDB * ➢Mongo *

*: GORM compliant implementation, **: Grails support without GORM

Page 9: Grails and Neo4j

nosql is not the silver bullet

Page 10: Grails and Neo4j

neo4j basic building blocks

1) nodes

2) relationships

3) properties on both, nodes and relationship

that's it!

Page 11: Grails and Neo4j

neo4j

Page 12: Grails and Neo4j

querying neo4j

●simple way: navigate the relationships●more powerful: use a traverser with callbacks for

● decide where to end● decide if node should be part of the result

Page 13: Grails and Neo4j

SQL querying vs traversing

Node node = // retrieve the starting poing

def myFriendsAndFriends = node.traverse( BREADTH_FIRST, { it.depth()<3 } as StopEvaluator, { true } as RetrunableEvaluator, DynamicRelationshipType.withName('friend'), Direction.OUTGOING).allNodes

SQL challenge: SQL statement that retrieves friends up to n'th grade. Anyone?

Neo4j: using a traverser:

Page 14: Grails and Neo4j

query performance

some benchmark data:

– each Person has 50 friends in avg

Database # persons query time

Relational 1.000 2000 ms

Neo4j 1.000 2 ms

Neo4j 1.000.000 2 ms

Page 15: Grails and Neo4j

accessing the database

Choosing an implementation of GraphDatabase:

● EmbeddedGraphDatabase: just local to JVM

● RestGraphDatabase (https://github.com/jexp/neo4j-java-rest-binding)

● HighAvailableGraphDatabase: uses Zookeeper

Page 16: Grails and Neo4j

neo4j - Licensing

3 editions:

community: GPL or $

advanced: AGPL or $

enterprise: AGPL or $

Page 17: Grails and Neo4j

history of nosql & neo4j for Grails

end 2009: first version of neo4j plugin

during 2010: GORM for nosql– 'inconsequential' -> 'spring-data-mapping'

end 2010: 'spring-data-graph'– aspectj based injection of JPA like methods

– focussed at Roo an POWAs

– "not the right approach for Grails" (IMHO)

May 2011: Neo4j for Grails using spring-data-mapping

Page 18: Grails and Neo4j

GORM: spring-data-mapping

●provides abstraction layer●TCK ●various implementations:

● hibernate, jpa● gemfire, redis, riak ● mongo, jcr● neo4j <- the new child on the block

Page 19: Grails and Neo4j

dependencies

Page 20: Grails and Neo4j

interfaces/abstract base classes in GORM

●Datastore:● create sessions● manage connection to low-level storage

●MappingContext:● holds metainformation about mapping domain classes to the underlying

datastore (type conversion, list of EntityPersisters,...)

●EntityPersister:● does the dirty work: interact with low level datastore

●Session:● similar HibernateSession

●Query:● knows how to query the datastore by criteria (criterion, projections,...)

Page 21: Grails and Neo4j

mapping domain model to nodespace

domain class

association

domain classinstance

domain instanceproperty

reference node

subreference

subreference node

instance

properties

Page 22: Grails and Neo4j

praying to the demo god....

Page 23: Grails and Neo4j

currently working in neo4j plugin

●passing >90% of GORM TCK (hurray!)●accessing embedded, REST and [HA datasources]●property type conversion●access to native API●<DomainClass>.traverseStatic, <instance>.traverse

Page 24: Grails and Neo4j

currently not working in neo4j plugin

●nasty bug: some trouble if a domain class references itself -> StackOverflowException

●Transactions●Optimistic Locking●Query performance not as good as could be●Indexing

Page 25: Grails and Neo4j

roadmap

●Write docs & publish●Handle relationship to self (Neo4j 1.4?)●Support for arbitrary attributes●Support for indexing (and its usage in criteria queries)●Embed some controller/servlet to visually navigate

the nodespace (SVG?)●Support for migrations?●... your suggestions?

Page 26: Grails and Neo4j

Q & A

Page 27: Grails and Neo4j

References

general overview of nosql:

– http://www.nosql-databases.org/

http://www.neo4j.org

neo4j grails plugin:

– source: https://github.com/sarmbruster/spring-data-mapping

– issues: http://jira.grails.org/browse/GPNEO4J

https://github.com/jexp/neo4j-java-rest-binding

site running grails w/ neo4j: http://www.fanorakel.de

my blog: http://blog.armbruster-it.de,

twitter: darthvader42