2013-08-20 11 views
7

In un database Neo4j con un paio di nodi e relazioni, sto cercando di individuare gli utenti più "popolari" (in questo caso: i nodi che partecipano alla maggior parte delle relazioni):Ordinare i nodi per numero di relazioni -> ThisShouldNotHappenError

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

Tuttavia, questa query (Neo4j 1.9.2) provoca il seguente errore:

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)

Tutte le idee su come posso esprimere questo differntly?

risposta

15

In termini di Neo4j mannual, se è necessario utilizzare un aggregration nel vostro "Ordina per", è necessario includere l'aggregration nel "Return", quindi basta è necessario aggiungere il conteggio (r) nel "Ritorno" come mostrato di seguito,

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

Introdurre un WITH qui:

START n=node:user('*:*') 
MATCH (n)-[r]->() 
WITH n, count(r) as c 
RETURN n, c 
ORDER BY c DESC 
LIMIT 10 
+3

+1 In realtà è sufficiente aggiungerlo al ritorno: 'return n, count (r) as c order by c', 'WITH' non è necessario. –

Problemi correlati