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;