Redis Graph A graph database built on top of redis Whats Redis? - - PowerPoint PPT Presentation
Redis Graph A graph database built on top of redis Whats Redis? - - PowerPoint PPT Presentation
Redis Graph A graph database built on top of redis Whats Redis? Open source in-memory database Key => Data Structure server Key features: Fast, Flexible, Simple A Lego for your database Strings/Blobs/Bitmaps "I'm a Plain Text
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
- pencypher
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
Lexer Query 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: ? visit friend
End to end
Alias: Jerry ID: Jerry Seinfeld Alias: F ID: ? Alias: Country ID: ? visit friend
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: ? visit friend
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: ? visit friend
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: ? visit friend
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: ? visit friend
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: Italy visit friend
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