You're not doing anything wrong, you're just getting the performance exactly as you'd expect with the algorithm that you're using.
START article=node:article("article_id:*")
Let's start here - you're asking for all articles. That's probably O(n) in complexity (I don't know how Lucene works internally).
Then you do this:
MATCH article<-[r:read]-user
WHERE r.timestamp > {start_time} AND article.blacklist? = false
That's O(n) in complexity too - every article has to be checked to see if it matches these constraints.
Why is this slow? Because when you access nodes sequentially like this, it's unlikely that any of them will be in neo4j's cache meaning that you'll end up going to disk most of the time (and seek time on mechanical disk is really latent).
The way that you get performance with these kind of graph global algorithms (the same class as PageRank) is to keep your cache warm, and you do that by keeping Neo4j alive between analytical requests. Otherwise in Neo4j - as any other database - you're going to be IO bound.
There may also be things that can help in using Cypher, or its implementation, but I'll defer to Andres on that.
HTH.
Jim
#3 doing the aggregation pulls the whole dataset into memory.
#4 and ordering does this too (and sorts it in memory)
#5 then you state that you're only interested in the top 20.
what is the actual use-case for this query ??
You might be interested into adding additional in-graph indexes (and linking) inside of your graph to put things like an order or ranking directly into your graph (and update the graph when a measure changes).
An interesting discussion around this is the graphity approach by Rene Pickard:
http://www.rene-pickhardt.de/graphity-an-efficient-graph-model-for-retrieving-the-top-k-news-feeds-for-users-in-social-networks/
Obviously, there is a large amount of data here, and as such, it will take some work to make sure it's performant. I like Cypher a whole lot, but I also have heard that it might be worth it to try writing the query in Gremlin instead... is that something that you'd recommend?
I think on there is Stoff for a number of interesting topics, Michael :-)