redis graph - amazon s3€¦ · spo:jerry seinfeld:friend:cosmo kramer spo:jerry...
TRANSCRIPT
Redis GraphA 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 BerlinVisit
SPOSOPOPSOSPPSOPOS
Hexastore
SSubject
PPredicate
OObject
6
HexastoreTriplets
SPO:Jerry:Visit:BerlinSOP:Jerry:Berlin:VisitOPS:Berlin:Visit:JerryOSP:Berlin:Jerry:VisitPSO:Visit:Jerry:BerlinPOS:Visit:Berlin:Jerry
JerryS
BerlinO
Visit
P
Places Jerry been to?SPO:Jerry:Visit:*
Who visited Berlin?OPS:Berlin:Visit:*
Who travels and to where?PSO:Visit:*
Hexastore
JerryS
BerlinO
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 endMATCH (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 endAST
Root
Match Where Return Order
End to endMATCH (Jerry:"Jerry Seinfeld")-[friend]->(F)-[visit]->(Country)
Alias: Jerry
ID: Jerry Seinfeld
Alias: FID: ?
Alias: Country
ID: ?visitfriend
End to end
Alias: Jerry
ID: Jerry Seinfeld
Alias: FID: ?
Alias: Country
ID: ?visitfriend
SPO:Jerry Seinfeld:friend:*
SPO:Jerry Seinfeld:friend:Cosmo KramerSPO:Jerry Seinfeld:friend:George Costanza
End to end
Alias: Jerry
ID: Jerry Seinfeld
Alias: FID:
Cosmo Kramer
Alias: Country
ID: ?visitfriend
End to endWHERE 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
ANDF
Kramer.age >=
50
F
continent =
“Europe”
Cosmo Kramer: {Name: ‘Cosmo Kramer’,Age: 48
}
End to end
Alias: Jerry
ID: Jerry Seinfeld
Alias: FID: ?
Alias: Country
ID: ?visitfriend
SPO:Jerry Seinfeld:friend:*
SPO:Jerry Seinfeld:friend:Cosmo KramerSPO:Jerry Seinfeld:friend:George Costanza
End to end
Alias: Jerry
ID: Jerry Seinfeld
Alias: FID:
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
ANDT
George.age >=
50
T
continent =
“Europe”
T
George Costanza:{Name: ‘George Costanza’,Age: 52
}
End to end
Alias: Jerry
ID: Jerry Seinfeld
Alias: FID:
George Costanza
Alias: Country
ID: ?visitfriend
SPO:George Costanza:visit:*
SPO:George Costanza:visit:ItalySPO:George Costanza:visit:Cuba
End to end
Alias: Jerry
ID: Jerry Seinfeld
Alias: FID:
George Costanza
Alias: CountryID: Italyvisitfriend
End to end
ANDT
George.age >=
50
T
Italy.continent
= “Europe”
T
George Costanza:{Name: ‘George Costanza’,Age: 52
}
Italy: {Continent: ‘Europe’,Population: 1000,Name: ‘Italy’
}
End to endTOP K heap
RETURN F.name, F.age, Country.nameORDER BY F.age DESCLIMIT 5
[‘George Costanza’, 52, Italy]
FeaturesMulti 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
Benchmark150K 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