Jeremy G.
Jeremy G.

Reputation: 101

Including vars in Neo4j WITH statement changes query output

I'm trying to find the number of nodes of a certain kind in my database that are connected to more than one other node of another kind. In my case, it's place nodes connected to several name nodes. I have a query that works:

MATCH rels=(p:Place)-[c:Called]->(n:Name) 
WITH p,count(n) as counts 
WHERE counts > 1 
RETURN p;`

However, that only returns the place nodes, and ideally I'd like it to return all the nodes and edges involved. I've found a question on returning variables from before the WITH, but if I include any of the other variables I've defined, the query returns no responses, i.e. this query returns nothing:

MATCH rels=(p:Place)-[c:Called]->(n:Name) 
WITH p, count(n) as counts, rels
WHERE counts > 1 
RETURN p;

I don't know how to return the information that I want without changing the results of the query. Any help would be much appreciated

Upvotes: 0

Views: 98

Answers (2)

cybersam
cybersam

Reputation: 67044

The reason your second query returns nothing is because its WITH clause specifies as aggregation "grouping keys" both p and rels. Since each rels path has only a single n value, counts would always be 1.

Something like this might work for you:

MATCH path=(p:Place)-[:Called]->(:Name) 
WITH p, COLLECT(path) as paths 
WHERE SIZE(paths) > 1 
RETURN p, paths;

This returns each matching Place node and all its paths.

Upvotes: 0

William Lyon
William Lyon

Reputation: 8556

Try this:

MATCH (p:Place)-[c:Called]->(n:Name)
WHERE size((p)-[:Called]->(:Name)) > 1
WITH p,count(n) as counts, collect(n) AS names, collect(c) AS calls
RETURN p, names, calls, counts ORDER BY counts DESC;

This query makes use of Cypher's collect() function to create lists of the names and called relationships for each place that has more than Called relationship with a Name node.

Upvotes: 0

Related Questions