iPhoneJavaDev
iPhoneJavaDev

Reputation: 825

Retrieve relationships between child nodes using neo4j cypher

enter image description here

I have a following network result when I run this query in neo4j browser:

MATCH (n1:Item {name: 'A'})-[r]-(n2:Item) Return n1,r,n2

At the bottom of the graph, it says: Displaying 6 nodes, 7 relationships. But when I look on the table in the neo4j browser, I only have 5 records

n1,r,n2
A,A->B,B
A,A->C,C
A,A->D,D
A,A->E,E
A,A->F,F

So in the java code, when I get the list of records using the code below:

List<Record> records = session.run(query).list();

I only get 5 records, so I only get the 5 relationships. But I want to get all 7 relationships including the 2 below:

B->C
C->F

How can i achieve that using the cypher query?

Upvotes: 0

Views: 183

Answers (2)

cybersam
cybersam

Reputation: 66967

This should work:

MATCH (n:Item {name: 'A'})-[r1]-(n2:Item)
WITH n, COLLECT(r1) AS rs, COLLECT(n2) as others
UNWIND others AS n2
OPTIONAL MATCH (n2)-[r2]-(x)
WHERE x IN others
RETURN n, others, rs + COLLECT(r2) AS rs

Unlike @FrantišekHartman's first approach, this query uses UNWIND to bind n2 (which is not specified in the WITH clause and therefore becomes unbound) to the same n2 nodes found in the MATCH clause. This query also combines all the relationships into a single rs list.

Upvotes: 1

František Hartman
František Hartman

Reputation: 15076

There are many ways to achieve this. One ways is to travers to 2nd level and check that the 2nd level node is in the first level as well

MATCH (n1:Item {name: 'A'})-[r]-(n2:Item)
WITH n1,collect(r) AS firstRels,collect(n2) AS firstNodes
OPTIONAL MATCH (n2)-[r2]-(n3:Item)
WHERE n3 IN firstNodes
RETURN n1,firstRels,firstNodes,collect(r2) as secondRels

Or you could do a Cartesian product between the first level nodes and match:

MATCH (n1:Item {name: 'A'})-[r]-(n2:Item)
WITH n1,collect(r) AS firstRels,collect(n2) as firstNodes
UNWIND firstNodes AS x
UNWIND firstNodes AS y
OPTIONAL MATCH (x)-[r2]-(y)
RETURN n1,firstRels,firstNodes,collect(r2) as secondRels

Depending on on cardinality of firstNodes and secondRels and other existing relationships one might be faster than the other.

Upvotes: 1

Related Questions