Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Order nodes by relationship count --> ThisShouldNotHappenError

Tags:

neo4j

cypher

In a Neo4j database with a couple of nodes and relationships, I am trying to find out the most "popular" users (in this case: The nodes participating in most relationships):

START n=node:user('*:*')
MATCH (n)-[r]->(x)
RETURN n
ORDER BY COUNT(r) DESC
LIMIT 10

However, this query (Neo4j 1.9.2) results in the following error:

ThisShouldNotHappenError

Developer: Andres claims that: Aggregations should not be used like this.

StackTrace: org.neo4j.cypher.internal.commands.expressions.AggregationExpression.apply(AggregationExpression.scala:31) org.neo4j.cypher.internal.commands.expressions.AggregationExpression.apply(AggregationExpression.scala:29) org.neo4j.cypher.internal.pipes.ExtractPipe$$anonfun$internalCreateResults$1$$anonfun$apply$1.apply(ExtractPipe.scala:47) org.neo4j.cypher.internal.pipes.ExtractPipe$$anonfun$internalCreateResults$1$$anonfun$apply$1.apply(ExtractPipe.scala:45) scala.collection.immutable.Map$Map1.foreach(Map.scala:109) org.neo4j.cypher.internal.pipes.ExtractPipe$$anonfun$internalCreateResults$1.apply(ExtractPipe.scala:45) org.neo4j.cypher.internal.pipes.ExtractPipe$$anonfun$internalCreateResults$1.apply(ExtractPipe.scala:44) scala.collection.Iterator$$anon$11.next(Iterator.scala:328) org.neo4j.cypher.internal.pipes.TopPipe.internalCreateResults(TopPipe.scala:45) org.neo4j.cypher.internal.pipes.PipeWithSource.createResults(Pipe.scala:69) org.neo4j.cypher.internal.pipes.PipeWithSource.createResults(Pipe.scala:66) org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.org$neo4j$cypher$internal$executionplan$ExecutionPlanImpl$$prepareStateAndResult(ExecutionPlanImpl.scala:164) org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl$$anonfun$getLazyReadonlyQuery$1.apply(ExecutionPlanImpl.scala:139) org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl$$anonfun$getLazyReadonlyQuery$1.apply(ExecutionPlanImpl.scala:138) org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.execute(ExecutionPlanImpl.scala:38) org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:72) org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:76) org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:79) org.neo4j.server.rest.web.CypherService.cypher(CypherService.java:94) java.lang.reflect.Method.invoke(Method.java:611) org.neo4j.server.rest.security.SecurityFilter.doFilter(SecurityFilter.java:112)

Any ideas on how I can express this differntly?

like image 834
Matthias Avatar asked Aug 20 '13 08:08

Matthias


2 Answers

In terms of neo4j mannual, if you need to use an aggregration in your "Order by", you must include the aggregration in your "Return", so you just need to add the count(r) in your "Return" as shown below,

START n=node:user('*:*')
MATCH (n)-[r]->(x)
RETURN n, COUNT(r)
ORDER BY COUNT(r) DESC
LIMIT 10
like image 134
Lisa Li Avatar answered Sep 21 '22 16:09

Lisa Li


Introduce a WITH here:

START n=node:user('*:*')
MATCH (n)-[r]->()
WITH n, count(r) as c
RETURN n, c
ORDER BY c DESC
LIMIT 10
like image 33
Stefan Armbruster Avatar answered Sep 19 '22 16:09

Stefan Armbruster