janetsmith
janetsmith

Reputation: 8732

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

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.

Upvotes: 4

Views: 905

Answers (1)

Eve Freeman
Eve Freeman

Reputation: 33165

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;

Upvotes: 10

Related Questions