【Neo4j查詢優化系列】如何快速統計節點的關係數

在圖數據庫中我們經常需要統計節點上的關係數目。一種常見的查詢寫法是這樣的:

MATCH (n:Person {name:‘Keanu Reeves’})-[]-() RETURN count(*);

上面的查詢會返回代表基諾-李維斯的節點(節點標籤爲Person)上所有關係的總數,包括進入的和流出的關係。如果用PROFILE來看一下查詢的執行步驟和成本,結果如下:

relcount1.jpg

我們看到在統計節點擁有的關係數目時,產生8次dbhits,以及執行count()產生的EagerAggregation操作。查詢結果告訴我們該節點有7個關係。

事實上,Neo4j數據庫在保存關係時會同時更新相關節點的關係計數器,該計數器保存在數據庫中並和節點相關聯。我們其實不需要真正讀出節點上的關係來統計它們的數量,而只要從關係計數器中讀取當前的數值即可。參見下面的查詢:

PROFILE MATCH (n:Person {name:‘Keanu Reeves’}) RETURN size((n)-[]-())

relcount2.jpg

從查詢計劃中可以看出,讀取關係計數器的操作是通過調用GetDegree(node, relationshiptype, direction)完成的,而且只有1次dbhit,無論實際關係的數量有多少。這裏,因爲我們沒有指定關係類型和方向,第二個參數是None,第三個參數是BOTH。可以試試下面的查詢來幫助理解GetDegree的用法:

PROFILE MATCH (n:Person {name:‘Keanu Reeves’}) RETURN size((n)-[:ACTED_IN]->())

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章