5. A graph database...
NO: not for charts & diagrams, or vector artwork
YES: for storing data that is structured as a graph
3
6. A graph database...
NO: not for charts & diagrams, or vector artwork
YES: for storing data that is structured as a graph
remember linked lists, trees?
3
7. A graph database...
NO: not for charts & diagrams, or vector artwork
YES: for storing data that is structured as a graph
remember linked lists, trees?
graphs are the general-purpose data structure
3
8. A graph database...
NO: not for charts & diagrams, or vector artwork
YES: for storing data that is structured as a graph
remember linked lists, trees?
graphs are the general-purpose data structure
“A relational database may tell you the average age of everyone
in this session,
but a graph database will tell you who is most likely to buy you a
beer.”
3
29. We're talking about a
Property Graph
Em Joh
il a n
knows knows
Alli Tob Lar
Nodes
son ias knows s
knows
And And knows
knows rea rés
s
knows knows knows
Pet Miic
Mc knows Ian
er knows a
a
knows knows
De Mic
lia h ael
Relationships
Properties (each a key+value)
+ Indexes (for easy look-ups)
5
36. You traverse the graph
// lookup starting point in an index
START n=node:People(name = ‘Andreas’)
And
rea
s
7
37. You traverse the graph
// lookup starting point in an index
then traverse to find results
START n=node:People(name ==‘Andreas’)
me=node:People(name ‘Andreas’
MATCH (me)-[:FRIEND]-(friend)-[:FRIEND]-(friend2)
RETURN friend2
And
rea
s
7
39. START user = node(1)
MATCH user -[user_skill]-> skill
RETURN skill, user_skill
SELECT skills.*, user_skill.*
FROM users
JOIN user_skill ON users.id = user_skill.user_id
JOIN skills ON user_skill.skill_id = skill.id WHERE users.id = 1
8
43. neoid
Jogger
neology
neography
Pacer
Server
#REST embedded
JRuby
Cypher-
DSL
neo4j.rb
roll Rails/
AR
your own
11
44. neo4j.rb by Andreas Ronge
gem install neo4j
require 'rubygems'
require 'neo4j'
class Person
include Neo4j::NodeMixin
property :name, :age, :rank
index :name
has_n :friends
end
Neo4j::Transaction.run do
neo = Person.new :name=>'Neo', :age=>29
morpheus =
Person.new :name=>'Morpheus', :rank=>'Captain'
neo.friends << morpheus
end
neo.friends.each {|p|...}
neo4j.rubyforge.org
45. neography by Max De Marzi
@neo = Neography::Rest.new
def suggestions_for(node)
node.incoming(:friends)
.order("breadth first")
.uniqueness("node global")
.filter("position.length() == 2;").depth(2)
end
john = Neography::Node.create("name" =>'John')
....
luke = Neography::Node.create("name" =>'Luke')
johnathan.both(:friends) << mark
...
luke.both(:friends) << mary
john.both(:friends) << luke
puts "John should become friends with
#{suggestions_for(john).map{|n| n.name }.join(', ')}"
github.com/maxdemarzi/neography
47. jogger by Jannis Hermann (MoviePilot)
class Jogger
module NamedTraversals
# Traverse to somebody's woman friends
def self.friends(current_traversal, gender)
t = current_traversal.in(:friends)
t = t.filter(gender: gender)
end
# Group and sort
def self.top_list(current_traversal, type)
t = current_traversal.out(type)
t = t.filter(type: 'Movie')
t = t.group_count{ |v| v }
end
end
end
github.com/moviepilot/jogger