Redis Graph
A graph database built on top of redis
Open source in-memory database
Key => Data Structure server
Key features: Fast, Flexible, Simple
What’s Redis?
A Lego for your database
Key
"I'm a Plain Text String!"
{ A: “foo”, B: “bar”, C: “baz” }
Strings/Blobs/Bitmaps
Hash Tables (objects!)
Linked Lists
Sets
Sorted Sets
Geo Sets
HyperLogLog
{ A , B , C , D , E }
[ A → B → C → D → E ]
{ A: 0.1, B: 0.3, C: 100, D: 1337 }
{ A: (51.5, 0.12), B: (32.1, 34.7) }
00110101 11001110 10101010
Node
“Jerry Seinfeld”: {
First_Name: “Jerry”,
Age: 62
}
Jerry
Seinfeld
Relations
Jerry Berlin
Visit
SPO
SOP
OPS
OSP
PSO
POS
Hexastore
S
Subject
P
Predicate
O
Object
6
Hexastore
Triplets
SPO:Jerry:Visit:Berlin
SOP:Jerry:Berlin:Visit
OPS:Berlin:Visit:Jerry
OSP:Berlin:Jerry:Visit
PSO:Visit:Jerry:Berlin
POS:Visit:Berlin:Jerry
Jerry
S
Berlin
O
Visit
P
Places Jerry been to?
SPO:Jerry:Visit:*
Who visited Berlin?
OPS:Berlin:Visit:*
Who travels and to where?
PSO:Visit:*
Hexastore
Jerry
S
Berlin
O
Visit
P
Cypher*
MATCH (Jerry:’Jerry Seinfeld’)-[friend]->(F)-[visit]->(country)
WHERE (F.age >= Jerry.age AND country.continent = ‘Europe’)
RETURN F.name, count(country.name) AS countriesVisited
ORDER BY countriesVisited, F.age DESC
LIMIT 2
Query language
Tokenizer - Lex
Parser - Lemon, SQLite LALR(1) parser generator for C
opencypher
Query language
End to end
MATCH (Jerry:’Jerry Seinfeld’)-[friend]->(F)-[visit]->(Country)
WHERE F.age >= 50 AND Country.continent = “Europe”
RETURN F.name, F.age, Country.name
ORDER BY F.age DESC
LIMIT 5
End to end
LexerQuery Parser AST
End to end
AST
Root
Match Where Return Order
End to end
MATCH (Jerry:"Jerry Seinfeld")-[friend]->(F)-[visit]->(Country)
Alias:
Jerry
ID: Jerry
Seinfeld
Alias: F
ID: ?
Alias:
Country
ID: ?visitfriend
End to end
Alias:
Jerry
ID: Jerry
Seinfeld
Alias: F
ID: ?
Alias:
Country
ID: ?visitfriend
SPO:Jerry Seinfeld:friend:*
SPO:Jerry Seinfeld:friend:Cosmo Kramer
SPO:Jerry Seinfeld:friend:George Costanza
End to end
Alias:
Jerry
ID: Jerry
Seinfeld
Alias: F
ID:
Cosmo
Kramer
Alias:
Country
ID: ?visitfriend
End to end
WHERE F.age >= 50 AND Country.continent = “Europe”
AND
age >=
50
continent
=
“Europe”
Filter tree
End to end
AND
Kramer
.age >=
50
continent
=
“Europe”
Cosmo Kramer: {
Name: ‘Cosmo Kramer’,
Age: 48
}
End to end
AND
Kramer
.age >=
50
F
continent
=
“Europe”
Cosmo Kramer: {
Name: ‘Cosmo Kramer’,
Age: 48
}
End to end
AND
F
Kramer
.age >=
50
F
continent
=
“Europe”
Cosmo Kramer: {
Name: ‘Cosmo Kramer’,
Age: 48
}
End to end
Alias:
Jerry
ID: Jerry
Seinfeld
Alias: F
ID: ?
Alias:
Country
ID: ?visitfriend
SPO:Jerry Seinfeld:friend:*
SPO:Jerry Seinfeld:friend:Cosmo Kramer
SPO:Jerry Seinfeld:friend:George Costanza
End to end
Alias:
Jerry
ID: Jerry
Seinfeld
Alias: F
ID:
George
Costanza
Alias:
Country
ID: ?visitfriend
End to end
AND
George
.age >=
50
continent
=
“Europe”
George Costanza:{
Name: ‘George Costanza’,
Age: 52
}
End to end
AND
George
.age >=
50
T
continent
=
“Europe”
George Costanza:{
Name: ‘George Costanza’,
Age: 52
}
End to end
AND
T
George
.age >=
50
T
continent
=
“Europe”
T
George Costanza:{
Name: ‘George Costanza’,
Age: 52
}
End to end
Alias:
Jerry
ID: Jerry
Seinfeld
Alias: F
ID:
George
Costanza
Alias:
Country
ID: ?visitfriend
SPO:George Costanza:visit:*
SPO:George Costanza:visit:Italy
SPO:George Costanza:visit:Cuba
End to end
Alias:
Jerry
ID: Jerry
Seinfeld
Alias: F
ID:
George
Costanza
Alias:
Country
ID: Italyvisitfriend
End to end
AND
T
George
.age >=
50
T
Italy
.continent
=
“Europe”
T
George Costanza:{
Name: ‘George Costanza’,
Age: 52
}
Italy: {
Continent: ‘Europe’,
Population: 1000,
Name: ‘Italy’
}
End to end
TOP K heap
RETURN F.name, F.age,
Country.name
ORDER BY F.age DESC
LIMIT 5
[‘George Costanza’, 52,
Italy]
Features
Multi hop, multi entry point (A)-[R1]->(C)<-[R2]-(B)
(Nicolas:’Nicolas Cage’)-[act]->(Movie)<-[act]-(Actor)
Aggregations, Group bys RETURN F.gender, AVG(F.age) AS average_age
Order bys, Distinct
Benchmark
150K inserts per second
15K simple queries per second
There’s still work to be done
● Single node query: MATCH (A) RETURN A
● OPTIONAL MATCH
● WITH, SKIP, UNION
● Curly brackets filters (john {name: ‘John’})
● In place evaluations WHERE Me.age > F.age + X
● Shortest path between nodes (A)-[*]-(B)
● A number of aggregation functions: stdev, precentileCount
Roadmap
● Hexastore sorted-set -> Trie
● Indexed entities
● Single node query
● Python lib
Contribute/Contact
https://github.com/swilly22/redis-module-graph
@roilipman

Redis Graph