Redis Graph A graph database built on top of redis
What’s 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 String!" Hash Tables (objects!) { A: “foo”, B: “bar”, C: “baz” } Linked Lists [ A → B → C → D → E ] Key Sets { A , B , C , D , E } Sorted Sets { A: 0.1, B: 0.3, C: 100, D: 1337 } Geo Sets { A: (51.5, 0.12), B: (32.1, 34.7) } HyperLogLog 00110101 11001110 10101010
Node “Jerry Seinfeld”: { Jerry First_Name: “Jerry”, Seinfeld Age: 62 }
Relations Visit Jerry Berlin
Hexastore S P O Subject Predicate Object SPO SOP OPS 6 OSP PSO POS
Hexastore Triplets SPO :Jerry:Visit:Berlin SOP: Jerry:Berlin:Visit OPS: Berlin:Visit:Jerry Visit OSP: Berlin:Jerry:Visit Jerry Berlin PSO: Visit:Jerry:Berlin S O P POS: Visit:Berlin:Jerry
Hexastore Places Jerry been to? SPO :Jerry:Visit:* Who visited Berlin? OPS: Berlin:Visit:* Visit Jerry Berlin S O Who travels and to where? P PSO: Visit:*
Query language 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
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 Query Lexer Parser AST
End to end AST Root Match Where Return Order
End to end MATCH (Jerry:"Jerry Seinfeld")-[friend]->(F)-[visit]->(Country) Alias: Alias: Jerry Alias: F Country ID: Jerry ID: ? friend visit ID: ? Seinfeld
End to end Alias: Alias: Jerry Alias: F Country ID: Jerry ID: ? friend visit ID: ? Seinfeld SPO:Jerry Seinfeld:friend:* SPO:Jerry Seinfeld:friend:Cosmo Kramer SPO:Jerry Seinfeld:friend:George Costanza
End to end Alias: F Alias: Alias: ID: Jerry Country Cosmo ID: Jerry friend visit ID: ? Kramer Seinfeld
End to end WHERE F.age >= 50 AND Country.continent = “Europe” Filter tree AND continent age >= = 50 “Europe”
End to end Cosmo Kramer: { AND Name: ‘Cosmo Kramer’, Age: 48 } continent Kramer = .age >= “Europe” 50
End to end Cosmo Kramer: { AND Name: ‘Cosmo Kramer’, Age: 48 } Kramer continent .age >= = 50 “Europe” F
End to end Cosmo Kramer: { AND Name: ‘Cosmo Kramer’, F Age: 48 } Kramer continent .age >= = 50 “Europe” F
End to end Alias: Alias: Jerry Alias: F Country ID: Jerry ID: ? friend visit ID: ? Seinfeld SPO:Jerry Seinfeld:friend:* SPO:Jerry Seinfeld:friend:Cosmo Kramer SPO:Jerry Seinfeld:friend:George Costanza
End to end Alias: Alias: F Alias: Jerry ID: Country ID: Jerry George friend visit ID: ? Seinfeld Costanza
End to end AND George Costanza:{ Name: ‘George Costanza’, Age: 52 } continent George = .age >= “Europe” 50
End to end AND George Costanza:{ Name: ‘George Costanza’, Age: 52 } George continent .age >= = 50 “Europe” T
End to end AND George Costanza:{ T Name: ‘George Costanza’, Age: 52 } George continent .age >= = 50 “Europe” T T
End to end Alias: Alias: F Alias: Jerry ID: Country ID: Jerry George friend visit ID: ? Seinfeld Costanza SPO:George Costanza:visit:* SPO:George Costanza:visit:Italy SPO:George Costanza:visit:Cuba
End to end Alias: Alias: F Alias: Jerry ID: Country ID: Jerry George friend visit ID: Italy Seinfeld Costanza
End to end AND George Costanza:{ T Name: ‘George Costanza’, Age: 52 } Italy George .continent Italy: { .age >= = 50 Continent: ‘Europe’, “Europe” T T Population: 1000, Name: ‘Italy’ }
End to end TOP K heap [‘George Costanza’, 52, Italy] RETURN F.name, F.age, Country.name ORDER BY F.age DESC LIMIT 5
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
Recommend
More recommend