際際滷

際際滷Share a Scribd company logo
Application Modeling
with Graph Databases
@josh_adell
http://www.servicetrade.com
http://blog.everymansoftware.com
http://github.com/jadell/neo4jphp

https://joind.in/10430
The Problem
The Solution?
> -- First degree
> SELECT actor_name FROM cast WHERE movie_title IN (SELECT DISTINCT movie_title
FROM cast WHERE actor_name='Kevin Bacon')
> -- Second degree
> SELECT actor_name FROM cast WHERE movie_title IN (SELECT DISTINCT movie_title
FROM cast WHERE actor_name IN (SELECT actor_name FROM cast WHERE movie_title IN
(SELECT DISTINCT movie_title FROM cast WHERE actor_name='Kevin Bacon')))
> -- Third degree
> SELECT actor_name FROM cast WHERE movie_title IN(SELECT DISTINCT movie_title
FROM cast WHERE actor_name IN (SELECT actor_name FROM cast WHERE movie_title IN
(SELECT DISTINCT movie_title FROM cast WHERE actor_name IN (SELECT
actor_name FROM cast WHERE movie_title IN (SELECT DISTINCT movie_title FROM
cast WHERE actor_name='Kevin Bacon'))))
The Truth
Relational databases aren't very good with relationships

Data

RDBMs
Try again?
Application modelling with graph databases
Warning: Computer Science Ahead
A graph is an ordered pair G = (V, E)
where V is a set of vertices and
E is a set of edges,
which are pairs of vertices in V.
If vertex pairs in E are ordered,
the graph is directed.
Property Graph
Nodes have properties and labels
Relationships have properties, a type and direction
Relationships are first-class entities
Queried just like Nodes

Indexes
Unique constraints
new in Neo4j 2.0!
Graphs are Everywhere
Relational Databases are Graphs!
Everything is connected
Modeling "Whiteboard-Friendly"

Nouns => nodes, Verbs => relationships
Back to Bacon

MATCH p = shortestPath( (r:Actor) - [*] - (b:Actor) )
WHERE r.name=Keanu Reeves AND b.name=Kevin Bacon
RETURN p, LENGTH(p)/2
Social
MATCH
(:Person {name:"Josh"})-[:FRIEND_OF]-(p:Person),
(m:Movie)
WHERE NOT
(p)-[:HAS_WATCHED]->(m)
RETURN COUNT(p) as not_seen, m
ORDER BY not_seen DESC LIMIT 1
But Wait...There's More!
Mutating (insert, update ~ create, merge)
Indexing (auto, full-text, spatial)
Batches and Transactions
Embedded (for JVM) or REST
Where fore art thou, RDB?
Aggregation
Ordered data
Truly tabular data
Few or clearly defined relationships
Questions?
Resources
 http://github.com/jadell/neo4jphp
 http://neo4j.org
 Jim Webber - A Little Graph Theory for the Busy Developer
 http://vimeo.com/76713692 - Jim Webber
 http://joshadell.com
 https://joind.in/10430

More Related Content

Application modelling with graph databases