neo4j 4.1.3 -> Where condition with count not working as expected

Skip to first unread message

Shanthi Viswanathan

Dec 7, 2020, 6:55:37 AM12/7/20
to Neo4j
I am using neo4j 4.1.3. I have 2 labels : Person and Rec. I need to create a relationship between these 2 only when there exists exactly one person with that last name. When I run the below, relationships are created for all persons with that last name. My code is below: 

MATCH (echk:REC {id: 'abcdef'}) OPTIONAL MATCH (p:Person) WHERE CONTAINS 'Shirley' WITH p, echk, count(p) as personcnt where personcnt=1 CALL apoc.merge.relationship(p, 'Test', {}, {}, echk, {}) YIELD rel RETURN p, echk, rel

I have 33 people with "Shirley' and 33 relationships are getting created with that REC. However, there should be no relationship because personcnt <> 1. When I just write 
OPTIONAL MATCH (p:Person) WHERE CONTAINS 'Shirley'  return count(p) -> I get 33 as the value. I am not sure why my where condition is not kicking in. 

Michael Hunger

Dec 7, 2020, 7:02:57 AM12/7/20
Best to send questions like this to

In general if you aggregate, you must not add the thing you want to count / aggregate on as an aggregation key, you can use collect on those.

MATCH (echk:REC {id: 'abcdef'})
WITH collect(p) as people, echk, count(p) as personcnt where personcnt=1 
UNWIND people as p
MERGE (p)-[:TEST]->(echk)

You don't need apoc.merge.relationship for your case you can just use cypher.

You received this message because you are subscribed to the Google Groups "Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email to
To view this discussion on the web visit

Shanthi Viswanathan

Dec 7, 2020, 9:40:28 AM12/7/20
Thanks much Michael - your explanation makes sense.

I am using dynamic relationship because this is part of a cypher where my role  (the "Test" I have in my example) is dynamic. 

Reply all
Reply to author
0 new messages