0221 Cypher for SQL Professionals
-
Upload
neo4j -
Category
Technology
-
view
544 -
download
5
Transcript of 0221 Cypher for SQL Professionals
Cypher Query LanguageMichael Hunger
@neo4j
Sunday, February 24, 13
The plan
• Why graphs?
• How graphs?
• Why Cypher?
• How Cypher - Cypher & SQL side by side
Sunday, February 24, 13
Why graphs, why now?
Sunday, February 24, 13
• Big Data is the trend
Why graphs, why now?
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
HSunday, February 24, 13
• NOSQL is the answer• Big Data is the trend
Why graphs, why now?
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
Sunday, February 24, 13
• NOSQL is the answer• Big in size and in complexity
• Big Data is the trend
Why graphs, why now?
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
!"#
$
%
&
'
✈
⛽
⛵
+,
-
.
⚽
0
1
23
4
5
☕
7
8
9
:
;
<⚾
>
?@
A
B
C
D E
FGH
IJ
KL
M
N
O !
PQ
R
ST
UV
W
X
Y
Z"
$
✈⛽ -
1
3
4
5☕ [
E
I KMP
S WX
\ [
#
%&
'
⛵
+
,.
⚽
0
2
7
8
9
:;<
\
⚾ >
?@
A
B
C
]
D
FG
LN
O
Q
R TU
VY
Z
J]
H
Sunday, February 24, 13
A graph?Yes, a graph
Sunday, February 24, 13
A graph database...
• Mathematical graphs
• remember linked lists, trees?
• the general-purpose data structure
• “A relational database may tell you the average age of everyone in this room, but a graph database will tell you who is most likely to buy you a beer.”
Sunday, February 24, 13
Some well-known graphs
Sunday, February 24, 13
Some well-known graphs
diamond
Sunday, February 24, 13
Some well-known graphs
diamond butterfly
Sunday, February 24, 13
Some well-known graphs
diamond butterfly star
Sunday, February 24, 13
Some well-known graphs
diamond butterfly bullstar
Sunday, February 24, 13
Some well-known graphs
diamond butterfly bullstar
franklin
Sunday, February 24, 13
robertson
Some well-known graphs
diamond butterfly bullstar
franklin
Sunday, February 24, 13
robertson
Some well-known graphs
diamond butterfly bullstar
franklin horton
Sunday, February 24, 13
robertson
Some well-known graphs
diamond butterfly bullstar
franklin horton neo4j
Sunday, February 24, 13
Sunday, February 24, 13
Graphs are everywhere
Sunday, February 24, 13
The property graph model
Sunday, February 24, 13
The property graph model
Sunday, February 24, 13
The property graph model
Sunday, February 24, 13
The property graph model
:LOVES
:LOVES
:KNOWS
:KNOWS
:KNOWS
Sunday, February 24, 13
The property graph model
:LOVES
:LOVES
:KNOWS
:KNOWS
:KNOWS
name: “A”age: 35 name: “B”
age: 35
name: “D”age: 35
name: “C”age: 35
since: 2012
since: 2008
Sunday, February 24, 13
Sunday, February 24, 13
You know relational
Sunday, February 24, 13
You know relational
Sunday, February 24, 13
You know relational
foo
Sunday, February 24, 13
You know relational
foo bar
Sunday, February 24, 13
You know relational
foo barfoo_bar
Sunday, February 24, 13
You know relational
foo barfoo_bar
Sunday, February 24, 13
You know relational
foo barfoo_bar
Sunday, February 24, 13
You know relational
foo barfoo_bar
Sunday, February 24, 13
You know relationalnow consider relationships...
Sunday, February 24, 13
You know relationalnow consider relationships...
Sunday, February 24, 13
You know relationalnow consider relationships...
Sunday, February 24, 13
You know relationalnow consider relationships...
Sunday, February 24, 13
You know relationalnow consider relationships...
Sunday, February 24, 13
You know relationalnow consider relationships...
Sunday, February 24, 13
Neo4j is a graph database
• Open Source
• High Availability
• Backed by Neo Technology
• In production for 10+ years
Sunday, February 24, 13
Why Cypher?
• Not only scale of size is hard
• Scale of complexity is pretty hard as well
Sunday, February 24, 13
Cypher attributes
Sunday, February 24, 13
Cypher attributes
#1 Declarative
Sunday, February 24, 13
Cypher attributes
#1 Declarative
You tell Cypher what you want, not how to get it
Sunday, February 24, 13
Cypher attributes
Sunday, February 24, 13
Cypher attributes
#2 Expressive
Sunday, February 24, 13
Cypher attributes
#2 Expressive
Optimize syntax for reading
Sunday, February 24, 13
Cypher attributes
Sunday, February 24, 13
Cypher attributes
#3 Pattern Matching
Sunday, February 24, 13
Cypher attributes
#3 Pattern Matching
Patterns are easy for your brain
Sunday, February 24, 13
Cypher attributes
Sunday, February 24, 13
Cypher attributes
#4 Idempotent
Sunday, February 24, 13
Cypher attributes
#4 Idempotent
State change should be expressed idempotently
Sunday, February 24, 13
2 Databases5 Queries
Sunday, February 24, 13
Sunday, February 24, 13
Sunday, February 24, 13
Give me all persons older than 30 years
Q1
Sunday, February 24, 13
START n=node:Person("name:*") WHERE n.age>30 RETURN n
SELECT *FROM PersonWHERE age > 30
VS
Q1
Sunday, February 24, 13
START n=node:Person("name:*") WHERE n.age>30 RETURN n
SELECT *FROM PersonWHERE age > 30
VS
Q1
Sunday, February 24, 13
START n=node:Person("name:*") WHERE n.age>30 RETURN n
SELECT *FROM PersonWHERE age > 30
VS
Q1
Sunday, February 24, 13
START n=node:Person("name:*") WHERE n.age>30 RETURN n
SELECT *FROM PersonWHERE age > 30
VS
Q1
Sunday, February 24, 13
Show me all actors, and which movies they starred in
Q2
Sunday, February 24, 13
Neo4j is whiteboard friendly
Sunday, February 24, 13
Neo4j is whiteboard friendly
(actor)-[:ACTS_IN]->(movie)
Sunday, February 24, 13
Neo4j is whiteboard friendly
(actor)-[:ACTS_IN]->(movie)
Sunday, February 24, 13
START actor=node:Person("name:*") MATCH (actor)-[:ACTS_IN]->(movie)RETURN actor.name, movie.title
SELECT Person.name, Movie.titleFROM Person JOIN Actor on Person.person_id = Actor.person_id JOIN Movie on Movie.movie_id = Actor.movie_id
VS
Q2
Sunday, February 24, 13
START actor=node:Person("name:*") MATCH (actor)-[:ACTS_IN]->(movie)RETURN actor.name, movie.title
SELECT Person.name, Movie.titleFROM Person JOIN Actor on Person.person_id = Actor.person_id JOIN Movie on Movie.movie_id = Actor.movie_id
VS
Q2
Sunday, February 24, 13
START actor=node:Person("name:*") MATCH (actor)-[:ACTS_IN]->(movie)RETURN actor.name, movie.title
SELECT Person.name, Movie.titleFROM Person JOIN Actor on Person.person_id = Actor.person_id JOIN Movie on Movie.movie_id = Actor.movie_id
VS
Q2
Sunday, February 24, 13
START actor=node:Person("name:*") MATCH (actor)-[:ACTS_IN]->(movie)RETURN actor.name, movie.title
SELECT Person.name, Movie.titleFROM Person JOIN Actor on Person.person_id = Actor.person_id JOIN Movie on Movie.movie_id = Actor.movie_id
VS
Q2
Sunday, February 24, 13
START actor=node:Person("name:*") MATCH (actor)-[:ACTS_IN]->(movie)RETURN actor.name, movie.title
SELECT Person.name, Movie.titleFROM Person JOIN Actor on Person.person_id = Actor.person_id JOIN Movie on Movie.movie_id = Actor.movie_id
VS
Q2
Sunday, February 24, 13
START actor=node:Person("name:*") MATCH (actor)-[:ACTS_IN]->(movie)RETURN actor.name, movie.title
SELECT Person.name, Movie.titleFROM Person JOIN Actor on Person.person_id = Actor.person_id JOIN Movie on Movie.movie_id = Actor.movie_id
VS
Q2
Sunday, February 24, 13
Show me all persons that are both actors and directors
Q3
Sunday, February 24, 13
START person=node:Person("name:*") WHERE (person)-[:ACTS_IN]->() AND (person)-[:DIRECTED]->()RETURN person.name
SELECT nameFROM PersonWHERE person_id IN (
SELECT person_id FROM Actor) AND person_id IN (
SELECT person_id FROM Director)
VS
Q3
Sunday, February 24, 13
START person=node:Person("name:*") WHERE (person)-[:ACTS_IN]->() AND (person)-[:DIRECTED]->()RETURN person.name
SELECT nameFROM PersonWHERE person_id IN (
SELECT person_id FROM Actor) AND person_id IN (
SELECT person_id FROM Director)
VS
Q3
Sunday, February 24, 13
START person=node:Person("name:*") WHERE (person)-[:ACTS_IN]->() AND (person)-[:DIRECTED]->()RETURN person.name
SELECT nameFROM PersonWHERE person_id IN (
SELECT person_id FROM Actor) AND person_id IN (
SELECT person_id FROM Director)
VS
Q3
Sunday, February 24, 13
START person=node:Person("name:*") WHERE (person)-[:ACTS_IN]->() AND (person)-[:DIRECTED]->()RETURN person.name
SELECT nameFROM PersonWHERE person_id IN (
SELECT person_id FROM Actor) AND person_id IN (
SELECT person_id FROM Director)
VS
Q3
Sunday, February 24, 13
START person=node:Person("name:*") WHERE (person)-[:ACTS_IN]->() AND (person)-[:DIRECTED]->()RETURN person.name
SELECT nameFROM PersonWHERE person_id IN (
SELECT person_id FROM Actor) AND person_id IN (
SELECT person_id FROM Director)
VS
Q3
Sunday, February 24, 13
Show me all Lucy’s co-actors
Q4
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, co_actor-[:ACTS_IN]->movieRETURN DISTINCT co_actor.name
SELECT DISTINCT co_actor.nameFROM Person lucy JOIN Actor a1 ON lucy.person_id = a1.person_id JOIN Actor a2 ON a1.movie_id = a2.movie_id JOIN Person co_actor ON co_actor.person.id = a2.person_idWHERE lucy.name = "Lucy Liu"
VS
Q4
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, co_actor-[:ACTS_IN]->movieRETURN DISTINCT co_actor.name
SELECT DISTINCT co_actor.nameFROM Person lucy JOIN Actor a1 ON lucy.person_id = a1.person_id JOIN Actor a2 ON a1.movie_id = a2.movie_id JOIN Person co_actor ON co_actor.person.id = a2.person_idWHERE lucy.name = "Lucy Liu"
VS
Q4
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, co_actor-[:ACTS_IN]->movieRETURN DISTINCT co_actor.name
SELECT DISTINCT co_actor.nameFROM Person lucy JOIN Actor a1 ON lucy.person_id = a1.person_id JOIN Actor a2 ON a1.movie_id = a2.movie_id JOIN Person co_actor ON co_actor.person.id = a2.person_idWHERE lucy.name = "Lucy Liu"
VS
Q4
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, co_actor-[:ACTS_IN]->movieRETURN DISTINCT co_actor.name
SELECT DISTINCT co_actor.nameFROM Person lucy JOIN Actor a1 ON lucy.person_id = a1.person_id JOIN Actor a2 ON a1.movie_id = a2.movie_id JOIN Person co_actor ON co_actor.person.id = a2.person_idWHERE lucy.name = "Lucy Liu"
VS
Q4
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, co_actor-[:ACTS_IN]->movieRETURN DISTINCT co_actor.name
SELECT DISTINCT co_actor.nameFROM Person lucy JOIN Actor a1 ON lucy.person_id = a1.person_id JOIN Actor a2 ON a1.movie_id = a2.movie_id JOIN Person co_actor ON co_actor.person.id = a2.person_idWHERE lucy.name = "Lucy Liu"
VS
Q4
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, co_actor-[:ACTS_IN]->movieRETURN DISTINCT co_actor.name;
SELECT DISTINCT co_actor.nameFROM Person lucy JOIN Actor a1 ON lucy.person_id = a1.person_id JOIN Actor a2 ON a1.movie_id = a2.movie_id JOIN Person co_actor ON co_actor.person.id = a2.person_idWHERE lucy.name = "Lucy Liu"
VS
Q4
Sunday, February 24, 13
Show me Lucy’s favorite directors
Q5
Sunday, February 24, 13
Q5
VS
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, director-[:DIRECTED]->movieRETURN director.name, count(*)ORDER BY count(*) desc
SELECT dir.name, count(*)FROM Person lucy JOIN Actor on Person.person_id = Actor.person_id JOIN Director on Actor.movie_id = Director.movie_id JOIN Person dir on Director.person.id = dir.person_idWHERE lucy.name = "Lucy Liu"GROUP BY dir.nameORDER BY count(*) DESC
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, director-[:DIRECTED]->movieRETURN director.name, count(*)ORDER BY count(*) desc
Q5
VSSELECT dir.name, count(*)FROM Person lucy JOIN Actor on Person.person_id = Actor.person_id JOIN Director on Actor.movie_id = Director.movie_id JOIN Person dir on Director.person.id = dir.person_idWHERE lucy.name = "Lucy Liu"GROUP BY dir.nameORDER BY count(*) DESC
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, director-[:DIRECTED]->movieRETURN director.name, count(*)ORDER BY count(*) desc
Q5
VSSELECT dir.name, count(*)FROM Person lucy JOIN Actor on Person.person_id = Actor.person_id JOIN Director on Actor.movie_id = Director.movie_id JOIN Person dir on Director.person.id = dir.person_idWHERE lucy.name = "Lucy Liu"GROUP BY dir.nameORDER BY count(*) DESC
Sunday, February 24, 13
Q5
VS
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, director-[:DIRECTED]->movieRETURN director.name, count(*)ORDER BY count(*) desc
SELECT dir.name, count(*)FROM Person lucy JOIN Actor on Person.person_id = Actor.person_id JOIN Director on Actor.movie_id = Director.movie_id JOIN Person dir on Director.person.id = dir.person_idWHERE lucy.name = "Lucy Liu"GROUP BY dir.nameORDER BY count(*) DESC
Sunday, February 24, 13
Q5
VS
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, director-[:DIRECTED]->movieRETURN director.name, count(*)ORDER BY count(*) desc
SELECT dir.name, count(*)FROM Person lucy JOIN Actor on Person.person_id = Actor.person_id JOIN Director on Actor.movie_id = Director.movie_id JOIN Person dir on Director.person.id = dir.person_idWHERE lucy.name = "Lucy Liu"GROUP BY dir.nameORDER BY count(*) DESC
Sunday, February 24, 13
Q5
VS
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, director-[:DIRECTED]->movieRETURN director.name, count(*)ORDER BY count(*) desc
SELECT dir.name, count(*)FROM Person lucy JOIN Actor on Person.person_id = Actor.person_id JOIN Director on Actor.movie_id = Director.movie_id JOIN Person dir on Director.person.id = dir.person_idWHERE lucy.name = "Lucy Liu"GROUP BY dir.nameORDER BY count(*) DESC
Sunday, February 24, 13
Q5
VS
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, director-[:DIRECTED]->movieRETURN director.name, count(*)ORDER BY count(*) desc
SELECT dir.name, count(*)FROM Person lucy JOIN Actor on Person.person_id = Actor.person_id JOIN Director on Actor.movie_id = Director.movie_id JOIN Person dir on Director.person.id = dir.person_idWHERE lucy.name = "Lucy Liu"GROUP BY dir.nameORDER BY count(*) DESC
Sunday, February 24, 13
Q5
VS
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, director-[:DIRECTED]->movieRETURN director.name, count(*)ORDER BY count(*) desc
SELECT dir.name, count(*)FROM Person lucy JOIN Actor on Person.person_id = Actor.person_id JOIN Director on Actor.movie_id = Director.movie_id JOIN Person dir on Director.person.id = dir.person_idWHERE lucy.name = "Lucy Liu"GROUP BY dir.nameORDER BY count(*) DESC
Sunday, February 24, 13
...fasten your seat belt Dorothy, 'cause Kansas is going bye-bye
Sunday, February 24, 13
Show me all Lucy’s co-actors
Q4’
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN]->movie, co_actor-[:ACTS_IN]->movieRETURN DISTINCT co_actor.name
Q4
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN*2..2]-co_actorRETURN DISTINCT co_actor.name
Q4’
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu")MATCH lucy-[:ACTS_IN*2..2]-co_actorRETURN DISTINCT co_actor.name
Q4’
Sunday, February 24, 13
Bacon Lucy
Q6
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu"), kevin=node:Person(name="Kevin Bacon")MATCH p = shortestPath( lucy-[:ACTS_IN*]-kevin )RETURN EXTRACT(n in NODES(p) : COALESCE(n.name?, n.title?))
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu"), kevin=node:Person(name="Kevin Bacon")MATCH p = shortestPath( lucy-[:ACTS_IN*]-kevin )RETURN EXTRACT(n in NODES(p) : COALESCE(n.name?, n.title?))
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu"), kevin=node:Person(name="Kevin Bacon")MATCH p = shortestPath( lucy-[:ACTS_IN*]-kevin )RETURN EXTRACT(n in NODES(p) : COALESCE(n.name?, n.title?))
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu"), kevin=node:Person(name="Kevin Bacon")MATCH p = shortestPath( lucy-[:ACTS_IN*]-kevin )RETURN EXTRACT(n in NODES(p) : COALESCE(n.name?, n.title?))
Q6
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu"), kevin=node:Person(name="Kevin Bacon")MATCH p = shortestPath( lucy-[:ACTS_IN*]-kevin )RETURN EXTRACT(n in NODES(p) : COALESCE(n.name?, n.title?))
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu"), kevin=node:Person(name="Kevin Bacon")MATCH p = shortestPath( lucy-[:ACTS_IN*]-kevin )RETURN EXTRACT(n in NODES(p) : COALESCE(n.name?, n.title?))
Sunday, February 24, 13
START lucy=node:Person(name="Lucy Liu"), kevin=node:Person(name="Kevin Bacon")MATCH p = shortestPath( lucy-[:ACTS_IN*]-kevin )RETURN EXTRACT(n in NODES(p) : COALESCE(n.name?, n.title?))
Sunday, February 24, 13
Create Cypher 2(the movie)
Sunday, February 24, 13
START lucy = node:Person(name="Lucy Liu"), david = node:Person(name="David Lynch")CREATE andres={name:"Andrés Taylor"}, cypher2={title:"Cypher 2"}, lucy-[:ACTS_IN {name:"Rita Foster"}]->cypher2, andres-[:ACTS_IN {name:"Manuel"}]->cypher2, david-[:DIRECTED]->cypher2RETURN cypher2
Sunday, February 24, 13
START lucy = node:Person(name="Lucy Liu"), david = node:Person(name="David Lynch")CREATE andres={name:"Andrés Taylor"}, cypher2={title:"Cypher 2"}, lucy-[:ACTS_IN {name:"Rita Foster"}]->cypher2, andres-[:ACTS_IN {name:"Manuel"}]->cypher2, david-[:DIRECTED]->cypher2RETURN cypher2
Sunday, February 24, 13
START lucy = node:Person(name="Lucy Liu"), david = node:Person(name="David Lynch")CREATE andres={name:"Andrés Taylor"}, cypher2={title:"Cypher 2"}, lucy-[:ACTS_IN {name:"Rita Foster"}]->cypher2, andres-[:ACTS_IN {name:"Manuel"}]->cypher2, david-[:DIRECTED]->cypher2RETURN cypher2
Sunday, February 24, 13
START lucy = node:Person(name="Lucy Liu"), david = node:Person(name="David Lynch")CREATE andres={name:"Andrés Taylor"}, cypher2={title:"Cypher 2"}, lucy-[:ACTS_IN {name:"Rita Foster"}]->cypher2, andres-[:ACTS_IN {name:"Manuel"}]->cypher2, david-[:DIRECTED]->cypher2RETURN cypher2
Sunday, February 24, 13
START lucy = node:Person(name="Lucy Liu"), david = node:Person(name="David Lynch")CREATE andres={name:"Andrés Taylor"}, cypher2={title:"Cypher 2"}, lucy-[:ACTS_IN {name:"Rita Foster"}]->cypher2, andres-[:ACTS_IN {name:"Manuel"}]->cypher2, david-[:DIRECTED]->cypher2RETURN cypher2
Sunday, February 24, 13
START lucy = node:Person(name="Lucy Liu"), david = node:Person(name="David Lynch")CREATE andres={name:"Andrés Taylor"}, cypher2={title:"Cypher 2"}, lucy-[:ACTS_IN {name:"Rita Foster"}]->cypher2, andres-[:ACTS_IN {name:"Manuel"}]->cypher2, david-[:DIRECTED]->cypher2RETURN cypher2
Sunday, February 24, 13
Add genre nodes
Sunday, February 24, 13
Person
Movie
Root
Genre:GENRE
:IS_GENRE
:ACTS_IN:DIRECTED
Sunday, February 24, 13
Movietitle:"The Matrix"
genre: "Action"
Root
Genrename: "Action"
:GENRE
:IS_GENRE
Movietitle:"Highlander"
genre: "Action"
:GENRE
Sunday, February 24, 13
START ref=node(0), movie=node:Movie("title:*") WHERE HAS(movie.genre) CREATE UNIQUE ref<-[:IS_GENRE]->(genre {name:movie.genre}) genre-[:GENRE]->movie
Sunday, February 24, 13
START ref=node(0), movie=node:Movie("title:*") WHERE HAS(movie.genre) CREATE UNIQUE ref<-[:IS_GENRE]->(genre {name:movie.genre}) genre-[:GENRE]->movie
Sunday, February 24, 13
START ref=node(0), movie=node:Movie("title:*") WHERE HAS(movie.genre) CREATE UNIQUE ref<-[:IS_GENRE]->(genre {name:movie.genre}) genre-[:GENRE]->movie
Sunday, February 24, 13
START ref=node(0), movie=node:Movie("title:*") WHERE HAS(movie.genre) CREATE UNIQUE ref<-[:IS_GENRE]->(genre {name:movie.genre}) genre-[:GENRE]->movie
Sunday, February 24, 13
Rehash
Sunday, February 24, 13
STARTdesignates the start points
Sunday, February 24, 13
MATCHdescribes the pattern
Sunday, February 24, 13
WHEREfilters the result set
Sunday, February 24, 13
CREATEcreates nodes and relationships
Sunday, February 24, 13
CREATE UNIQUEcreates unique patterns
Sunday, February 24, 13
RETURNcreates the result table
Sunday, February 24, 13
ALL THE THINGS!
QUESTION
Sunday, February 24, 13