Exploring the Cypher Query Language through GraphGists
Luanne Misquitta @luannem
Our Path
Neo4j Cypher ExamplesGraphGists
What if…
Credit: Shantaram Waingankar
Or
Credit: Luanne M.
Or
Credit: Florent Biville
Or
6Credit: Luanne M.
All you need is…
According to The Beatles
But that’s not why you’re here
What you really need is… a Graph
What is Neo4j?
• A Graph Database • A labelled property graph • Nodes with properties and labels (both optional) • Directed and named relationships with properties
(optional) • ACID • Schema free • Scalable: Billions of nodes and relationships • Fast: More than 2 million traversals per second • Suited for highly connected and complex data
What is Neo4j
name:Neo
name: Agent Smith
name: Cypher
name: Morpheus
name:TrinityLoves
KnowsKnows {since: 1999}
Knows
Knows
CrewCrew
Crew
CrewMatrixMatrix
Cypher
• Declarative graph query language • Based on English prose and neat
iconography • Focuses on
• What to retrieve from the graph and not how to retrieve it
• Pattern matching • Your domain instead of database access
• Humane query language, suitable for developers and operations professionals
Patterns and picturesNeo Trinity
LovesNeo loves Trinity
(Neo)-[:LOVES]->(Trinity)
Cypher Agent Smith
KnowsCypher knows Agent Smith
(Cypher)-[:KNOWS]->(Agent Smith)
Pattern matching
14
MATCH (me:User {name:’Luanne’})-[f:FRIEND_OF]->(friend)-[:LISTENS_TO]->(artist)!WHERE NOT (me-[:LISTENS_TO]->(artist) AND f.similarity>0.7!RETURN artist
Luanne
The Beatles
F1
Aerosmith
F2
Pink Floyd
FRIEND_OF {similarity=0.9}
FRIEND_OF {similarity=0.4}
LISTENS_TO
LISTENS_TO
LISTENS_TOLISTENS_TO
Example Query Structure
15
MATCH (u:User)-[:LISTENS_TO]->(a:Artist) !WHERE a.genre=“Rock” !WITH u, a, count(a) as artistCount !MATCH (a)-[r:PLAYING_IN]->(city) !WHERE r.ticketsAvailable=true !RETURN u,a,city.name as cityName !ORDER BY cityName LIMIT 5
MATCH
• Allows you to specify patterns that Cypher will search for in the graph
16
Match
17
MATCH (u:User)-[:LISTENS_TO]->(a:Artist) !WHERE a.genre=“Rock” !WITH u, a, count(a) as artistCount !MATCH (a)-[r:PLAYING_IN]->(city) !WHERE r.ticketsAvailable=true !RETURN u,a,city.name as cityName !ORDER BY cityName LIMIT 5
Where
• Filters the results • Adds constraints to the pattern described in
MATCH
18
Where
19
MATCH (u:User)-[:LISTENS_TO]->(a:Artist) !WHERE a.genre=“Rock” !WITH u, a, count(a) as artistCount !MATCH (a)-[r:PLAYING_IN]->(city) !WHERE r.ticketsAvailable=true !RETURN u,a,city.name as cityName !ORDER BY cityName LIMIT 5
Return
• Returns results
20
Return
21
MATCH (u:User)-[:LISTENS_TO]->(a:Artist) !WHERE a.genre=“Rock” !WITH u, a, count(a) as artistCount !MATCH (a)-[r:PLAYING_IN]->(city) !WHERE r.ticketsAvailable=true !RETURN u,a,city.name as cityName !ORDER BY cityName LIMIT 5
Order By, Limit
• Sort the output • Return a subset
22
Order By, Limit
23
MATCH (u:User)-[:LISTENS_TO]->(a:Artist) !WHERE a.genre=“Rock” !WITH u, a, count(a) as artistCount !MATCH (a)-[r:PLAYING_IN]->(city) !WHERE r.ticketsAvailable=true !RETURN u,a,city.name as cityName !ORDER BY cityName LIMIT 5
WITH
• Manipulate the result sequence before it is passed on to the following query parts.
• The manipulations can be of the shape and/or number of entries in the result set.
• Combines queries
24
With
25
MATCH (u:User)-[:LISTENS_TO]->(a:Artist) !WHERE a.genre=“Rock” !WITH u, a, count(a) as artistCount !MATCH (a)-[r:PLAYING_IN]->(city) !WHERE r.ticketsAvailable=true !RETURN u,a,city.name as cityName !ORDER BY cityName LIMIT 5
GraphGists
What’s a Gist?
27
• A simple way to share snippets of code or data
• Automatically versioned, forkable, usable from Git
• Nicely rendered and presented
Okay, why?
• How do you share your graph model? • Whiteboard? • Document? • How do you demonstrate queries? • Need a live database? • Modelling is incremental
28
What’s a GraphGist?
29
• An AsciiDoc file with: • A graph domain model • Descriptive text and pictures • Example queries against the model • Interactive and executable Cypher queries • A Neo4j console for further exploration
• Nicely rendered and presented
GraphGist demos• Trek and mountaineering routing
http://gist.neo4j.org/?09520d20fbe707951e1b @shantaramw
• Organization learninghttp://gist.neo4j.org/?8021754 @luannem
• Doctor Finder http://gist.neo4j.org/?8748719 @fbiville
• Bombay Railway Routes http://gist.neo4j.org/?8159102 @luannem 30
Resources
32
Neo4j http://www.neo4j.org/ !Explore and create your own GraphGist http://www.neo4j.org/learn/graphgist !Online Training http://www.neo4j.org/learn/online_course
Spreading Graph Love