Training Cypher - tomgeudens/practical-neo4j GitHub Wiki
Context: Cut-and-paste commands for the Cypher training.
Prerequisite: This document will assume you have a Neo4j instance running and are connected to it either with the Neo4j Browser or the Neo4j Cypher Shell. You also need to have the basic database loaded and active (see Bulk Loading scripts).
Queries
001
RETURN "just a projection" AS YesThisWorks;
002
MATCH (p:Person {name: "Tom Hanks"})
RETURN p;
003
MATCH (p1:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(p2:Person),(m)<-[:ACTED_IN]-(p3:Person)
RETURN p1.name, p2.name, p3.name;
004
MATCH (p1:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(p2:Person)
MATCH (m)<-[:ACTED_IN]-(p3:Person)
RETURN p1.name, p2.name, p3.name;
005
MATCH (p1:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie)
MATCH (m)<-[:ACTED_IN]-(p2:Person)
MATCH (m)<-[:ACTED_IN]-(p3:Person)
RETURN p1.name, p2.name, p3.name;
006
MATCH (p:Person {name: "Tom Hanks"})-[a:ACTED_IN]->(m:Movie)
RETURN {name: p.name, randomrole: apoc.coll.randomItem(a.roles), title: m.title} as result;
007
MATCH (p:Person)
WHERE p.name = "Tom Hanks"
RETURN p;
008
MATCH (p:Person)
WHERE EXISTS( (p)-[:DIRECTED]->() )
RETURN p.name;
009
MATCH (p:Person)-[:DIRECTED]->()
RETURN p.name;
010
MATCH (p:Person)
WHERE EXISTS( (p)-[:DIRECTED]->(m) )
RETURN p.name, m.title;
011
MATCH (p:Person)
WHERE NOT EXISTS( p.born )
RETURN p.name;
012
MATCH (p1:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(p2:Person)
MATCH (m)<-[:ACTED_IN]-(p3:Person)
WHERE p1 <> p3 AND p2 <> p3
RETURN p1.name, p2.name, p3.name;
013
MATCH (p1:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m:Movie)
MATCH (m)<-[:ACTED_IN]-(p2:Person)
MATCH (m)<-[:ACTED_IN]-(p3:Person)
WHERE p1 <> p3 AND p2 <> p3 AND p1 <> p2
RETURN p1.name, p2.name, p3.name;
014
PROFILE MATCH (p:Person)
WHERE p.name = "Tom Hanks"
RETURN p;
015
PROFILE MATCH (p:Person {name: "Tom Hanks"})
RETURN p;
016
EXPLAIN MATCH (p:Person)
WHERE p.name = "Tom Hanks"
RETURN p;
017
MATCH (m:Movie {title: "The Matrix"})<-[a:ACTED_IN]-(p:Person)
RETURN m.title AS title, p.name AS name
ORDER BY name DESC
SKIP 1 LIMIT 2;
018
MATCH (m:Movie {title: "The Matrix"})<-[a:ACTED_IN]-(p:Person)
RETURN m.title AS title, collect(p.name) AS cast, count(p) as sizecast;
019
UNWIND apoc.coll.randomItems(range(1, 100), 100, true) AS aRandomNumber
RETURN aRandomNumber, collect(aRandomNumber) as occurences
ORDER BY aRandomNumber ASC;
020
MATCH (m:Movie)<-[a:ACTED_IN]-(p:Person)
WITH m.title AS title, m.released as released, collect(p.name) AS cast
RETURN title, released, cast, size(cast) as sizecast
021
MATCH (m:Movie)<-[a:ACTED_IN]-(p:Person)
WITH m.title AS title, m.released as released, collect(p.name) AS cast
ORDER BY size(cast) DESC
WHERE size(cast) > 4
RETURN title, released, cast, size(cast) as sizecast
022
MATCH (m:Movie)<-[a:ACTED_IN]-(p:Person)
WITH m, collect(p) as actors, avg(2021 - p.born) as averageageinmovie
UNWIND actors as actor
RETURN m.title, actor.name, 2021 - actor.born as actorage, 2021 - actor.born - averageageinmovie as agegapinmovie
023
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH p, count(m) as acts
MATCH (p)-[:DIRECTED]->(m:Movie)
RETURN p.name, acts, count(m) as directs;
024
MATCH (p:Person)
RETURN p.name,
size([(p)-[:ACTED_IN]->(m:Movie) | m]) as acts,
size([(p)-[:DIRECTED]->(m:Movie) | m]) as directs;
025
MATCH (p:Person)
OPTIONAL MATCH (p)-[:ACTED_IN]->(m:Movie)
WITH p, count(m) as acts
OPTIONAL MATCH (p)-[:DIRECTED]->(m:Movie)
RETURN p.name, acts, count(m) as directs;
Updates
001
CREATE (:Person {name: "Tom Geudens", born: 1972});
002
MATCH (p:Person {name: "Tom Geudens"})
MATCH (m:Movie {title: "The Matrix"})
MERGE (p)-[i:IS_FAN_OF]->(m)
ON CREATE SET i.since = "he joined Neo4j", i.count=1
ON MATCH SET i.count = i.count + 1
RETURN p.name, i.since, i.count, m.title;
003
MATCH (p:Person {name: "Tom Geudens"})
DELETE p;
004
MATCH (p:Person {name: "Tom Geudens"})-[r]-()
// you could possibly do something with r here
DELETE r;
005
MATCH (p:Person {name: "Tom Geudens"})
DELETE p;
006
CALL apoc.periodic.commit(
"MATCH ()-[r]->() WITH r LIMIT $limit DELETE r RETURN count(*)",
{limit:2000}
);
007
CALL apoc.periodic.commit(
"MATCH (n) WITH n LIMIT $limit DELETE n RETURN count(*)",
{limit:2000}
);
008
MATCH (p:Person {name: "Emil Eifrem"})
SET p.actor = false, p:CEO;
009
MATCH (c:CEO)
REMOVE c.actor, c:CEO;
Recommendations
001
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m1)<-[:ACTED_IN]-(coActors:Person)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors:Person)
WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors)
AND tom <> cocoActors
RETURN cocoActors.name AS Recommended, count(*) AS Strength ORDER BY Strength DESC;
002
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(m1)<-[:ACTED_IN]-(coActors:Person)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors:Person)
WHERE NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors)
AND tom <> cocoActors
RETURN cocoActors.name AS Recommended, collect(DISTINCT coActors.name) as inthemiddle, count(DISTINCT coActors) AS Strength ORDER BY Strength DESC;