Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cypher return twice for nodes that connected in bi-directional relationship

Tags:

neo4j

cypher

I have 2 nodes: (A), (B), connected by [:FRIEND]

When I run the following command,

start n = node(*) match (n)-[r:FRIEND]-(b) return n.name, b.name;

it returns 2 rows: A, B and B, A.

I wonder, how to make it return only one record, because the relationship is bidirectional, A -[:FRIEND]-B and B-[:FRIEND]-A is considered same result.

Thanks.

like image 342
janetsmith Avatar asked Jan 15 '23 11:01

janetsmith


1 Answers

One trick is to add a where on the IDs, so you get them in a consistent order as well:

start n = node(*) 
match (n)-[r:FRIEND]-(b) 
where id(n) < id(b) 
return n.name, b.name;

http://console.neo4j.org/r/1ry0ga

If you have multiple relationships between them (in both directions, for example), you can add a distinct modifier to get the same results:

start n = node(*) 
match (n)-[r:FRIEND]-(b) 
where id(n) < id(b) 
return distinct n.name, b.name;
like image 105
Eve Freeman Avatar answered Feb 08 '23 12:02

Eve Freeman