2016-02-24 53 views
1

這是關於大型子圖分頁結果集原始問題的後續步驟。Neo4j/Cypher默認rel-type鏈排序問題

Neo4j/Cypher effective pagination with order by over large sub-graph

回顧一下節點-REL結構:

(:User)-[:FOLLOWS {timestamp}]->(:User)

如所建議的通過@邁克爾衣架爲了通過子句REL-型鏈已被除去應以連續的順序返回跟隨最新追隨者的時間戳。

MATCH (u:User {Id:{id}})<-[f:FOLLOWS]-(follower) 
WHERE f.timestamp <= {timestamp} 
RETURN follower 
LIMIT 100 

問題是,在一般情況下,這是行不通的。

我發現的是如果:User節點有50或更少:FOLLOWER關係一切工作正常。追隨者總是按時間戳順序排列,最近排在最前面。但是如果你有更多的50 :FOLLOWER關係,最後50個追隨者總是返回倒數,最老的倒數第一。

即如果:User有100個追隨者,並且您按照上面的方式查詢它們,您將得到列表,其中前50個從最新到最舊排序,最後50個從最舊到最新排列。一般來說,你在任何情況下,這種順序,其中的追隨者數量超過50

任何人都可以對這種行爲的建議。

回答

1

默認情況下,具有超過50個關係的任何節點都被視爲「密集節點」。正常節點將它們的關係組織在單個鏈中,而不管它們的類型和方向如何。

密集節點改爲管理每個關係類型和方向的單獨鏈。

你看到的是一個節點成爲一個密集的節點,因此內部結構的重組效果。此閾值(默認爲50)可以使用dense_node_treshold配置選項進行配置。

根據您的數據模型,您可以考慮增加該值。

另一種方法不依賴於實現細節:重新構建FOLLOWS關係到節點。 :Follow節點與跟隨者有一個關係,一個關注跟隨者,第三個關聯列表基於給予人的所有:Follow節點的時間戳。

+0

如果我將dense_node_treshod設置爲1並且圖中的密集節點很密集會產生什麼後果?我明白你的意圖是將rel-type重構爲節點,但它會產生其他不必要的複雜性。 – drgraduss

+0

很好的問題,從未嘗試'dense_node_treshold = 1'。由於遍歷首先需要查找正確的鏈,所以我認爲一切都會稍微慢一些。但請注意,您無法更改'dense_node_treshold'。請注意,'dense_node_treshold'僅在創建初始存儲時使用 - 您無法在現有的圖形數據庫中對其進行更改。 –