2015-04-07 89 views
3

在Neo4j的圖表學院(http://neo4j.com/graphacademy/online-course/)我在讀「(L2) - (聚合)」部分:Neo4j的查詢優化

通常情況下你感興趣的前N個結果,從該結果計數聚合。這是通過先計數並以DESCending方式對結果進行排序,然後將結果限制在最前面n來實現的。如果我們想要參與大多數電影中的前十名演員,則查詢將如下所示。

MATCH (a:Person)-[:ACTED_IN]->(m) 
RETURN a.name, count(m) 
ORDER BY count(m) DESC 
LIMIT 10; 

不過,我想知道如果它足夠聰明,不計算多次計數(M)存在,即如果類似如下的語法是更好:

MATCH (a:Person)-[:ACTED_IN]->(m) 
RETURN a.name, count(m) AS c 
ORDER BY c DESC 
LIMIT 10; 

回答

4

答案是查詢計劃完全相同,其中一個並不比另一個好。

在查詢之前使用PROFILE關鍵字,您可以詢問neo4j它將如何執行每個查詢。所以,不要聽我的話,分析兩個問題,看看計劃是否有任何不同。如果他們不是,那麼兩者的執行將是相同的。

下面是查詢輪廓看起來像:

Query execution plan

我認爲count()EagerAggregation發生,它的前top操作,不論你如何表達計數發生。

Cypher查詢優化最近正在取得進展。在2.2版本中,這裏有一個新的基於成本的計劃。我不知道這個特定的查詢是否牽涉到新的基於成本的規劃器代碼(實際可能不是),但這裏的重點在於,如果查詢語言的優化器運行良好,那麼真的不應該有任何區別這兩個查詢。請參閱,如果兩個查詢的語義上是等價,那麼優化器的工作總是將您的查詢重新編寫成語義上等效的最快執行版本。

這爲您提供一些靈活性來編寫少於完美的密碼,但仍然會獲得好的結果。一般來說,我不會過分複雜的查詢,以加速它們,直到你有一個真正的性能問題(「過早優化是萬惡之源」)。如果您想知道查詢的不同形式是否會有所幫助,請使用PROFILE

+0

謝謝,不知道PROFILE –

+0

順便說一句,在http://neo4j.com/docs/2.0/cypher-refcard/我看到他們使用「AS」模式進行類似的查詢與「計數」,但也許他們這樣做是爲了保持清潔 –

+1

就我而言,只要PROFILE是相同的,這是個人喜好的問題。使用'AS'子句很好重命名,因爲默認情況下該列將被命名爲'count(x)',這是一個糟糕的名字。所以我也喜歡'AS'的慣例。 – FrobberOfBits