Neo4j Relationships are what connect any two nodes in the graph. To copy paste from the Neo4j guide:
Relationships organize nodes into arbitrary structures, allowing a graph to resemble a list, a tree, a map, or a compound entity — any of which can be combined into yet more complex, richly inter-connected structures.
The cool thing about Relations is that it need not be directional. We can even traverse the relation in either direction. For instance consider the Person ACTED_IN Movie relation. Here I could run a query to get all Actors from an single movie as well all movies of a single actor:
MATCH (a:Person)-[:ACTED_IN]->(m:Movie) WHERE a.name={aName} RETURN mHere while the WHERE clause has changed the MATCH clause is the same and RETURN now fetches the movie nodes instead of actor nodes.
Relationships organize nodes into arbitrary structures, allowing a graph to resemble a list, a tree, a map, or a compound entity — any of which can be combined into yet more complex, richly inter-connected structures.
The cool thing about Relations is that it need not be directional. We can even traverse the relation in either direction. For instance consider the Person ACTED_IN Movie relation. Here I could run a query to get all Actors from an single movie as well all movies of a single actor:
public List<Actor> getActorsInMovie(String movieName, int released);Here is the code for the two:
public List<Movie> getMoviesActedIn(String actorName);
public List<Actor> getActorsInMovie(String movieName, int released) {The query here is : MATCH (a:Person)-[:ACTED_IN]->(m:Movie) WHERE m.title={mName} and m.released={releasedYear} RETURN aand the output on calling this method:
try (Transaction tx = graphDb.beginTx()) {
Map<String, Object> params = new HashMap<>();
params.put("mName", movieName);
params.put("releasedYear", released);
Result result = graphDb.execute(
"MATCH (a:Person)-[:ACTED_IN]->(m:Movie) WHERE m.title={mName} and m.released={releasedYear} RETURN a",
params);
if (!result.hasNext()) {
returnnull;
}
List<Actor> actors = new ArrayList<>();
while (result.hasNext()) {
actors.add(extractActor((Node) result.next().get("a")));
}
return actors;
}
Movie [ id : 154, title : Something's Gotta Give, released : 2003, tagline : null]Similar is the method to retrieve actors with a slight difference in query:
Movie [ id : 100, title : Johnny Mnemonic, released : 1995, tagline : The hottest data on earth. In the coolest head in town]
Movie [ id : 87, title : The Replacements, released : 2000, tagline : Pain heals, Chicks dig scars... Glory lasts forever]
Movie [ id : 3, title : The Devil's Advocate, released : 1997, tagline : Evil has its winning ways]
Movie [ id : 2, title : The Matrix Revolutions, released : 2003, tagline : Everything that has a beginning has an end]
Movie [ id : 1, title : The Matrix Reloaded, released : 2003, tagline : Free your mind]
Movie [ id : 0, title : The Matrix, released : 1999, tagline : Welcome to the Real World]
MATCH (a:Person)-[:ACTED_IN]->(m:Movie) WHERE a.name={aName} RETURN mHere while the WHERE clause has changed the MATCH clause is the same and RETURN now fetches the movie nodes instead of actor nodes.
public List<Movie>getMoviesActedIn(String actorName) {The output is as below:
try (Transaction tx = graphDb.beginTx()) {
Map<String, Object> params = new HashMap<>();
params.put("aName", actorName);
Result result = graphDb.execute(
"MATCH (a:Person)-[:ACTED_IN]->(m:Movie) WHERE a.name={aName} RETURN m",
params);
if (!result.hasNext()) {
returnnull;
}
List<Movie> movies = new ArrayList<>();
while (result.hasNext()) {
movies.add(extractMovie((Node)result.next().get("m")));
}
return movies;
}
Actor [ title : Dina Meyer, yearBorn : 1968 ]
Actor [ title : Ice-T, yearBorn : 1958 ]
Actor [ title : Keanu Reeves, yearBorn : 1964 ]
Actor [ title : Takeshi Kitano, yearBorn : 1947 ]