2016-08-12 112 views
0

我的圖形數據庫中有大約10k個用戶節點。我知道它不是太多,但我正在尋找我的案例的最佳解決方案。哪種情況下性能更好

我需要標記一些用戶並在以後查詢。

我想出了兩個解決方案(至少現在),但我無法確定哪一個解決方案最適合性能,您如何看待我的可能解決方案?

1 - 我可以添加新屬性給我所有的用戶節點默認值爲false。

MATCH (u:User) SET u.marked = false 

之後,我會爲所有需要稍後查詢的用戶設置標記屬性爲true。可以說有50個。

後來,當我需要的那些標記的用戶,我會查詢,如:

MATCH (u:User) WHERE u.marked = true RETURN u 

2 - 我可以新屬性僅添加到這些用戶,我將在以後需要,不修改其他用戶節點。像下面這樣:

MATCH (u:User) WHERE u.id IN [...,123,456,789,...] SET u.marked = true 

後來,當我需要顯着的用戶,我會查詢,如:

MATCH (u:User) WHERE u.marked = true RETURN u 

MATCH (u:User) WHERE EXISTS(u.marked) AND u.marked = true RETURN u 

如果你知道解決我的問題的另一種方式,我是徵求意見。

在此先感謝。

+0

您可以將標記的用戶標識存儲在單獨的表中。當你需要再次標記它們時,你只需清除以前的結果並保存新的結果。如果需要,稍後可以輕鬆添加其他屬性。 – Edgar

+0

在查詢之前使用'PROFILE'會得到它的詳細信息。 like'PROFILE MATCH(u:User)WHERE u.marked = true RETURN u' –

+0

只要你知道,在描述的第二個選項中,u.marked = true的匹配就足夠了。這裏不需要存在檢查。 – InverseFalcon

回答

1

通常的方法是創建一個索引:

CREATE INDEX ON :User(marked); 

然後,你的查詢就能迅速得到了標記爲User節點,而不必掃描所有節點。

@ InverseFalcon的答案提出了另一種可能的方法,即創建一個標籤。

+0

這一個似乎最適合我的情況,非常感謝。 – agdelen

0

布爾字段應該正常工作。 Usman Maqbool提出的分析不同方法的建議是很好的......這樣做可以找到最適合您的方法。

另一種方法是爲此創建一個標籤,例如:MarkedUser。請記住,節點可以有多個標籤沒有問題。

您可以使用(對於用戶u)SET u:MarkedUser在您感興趣的一組用戶上設置標籤。

查找變得容易,因爲它是該標籤中的所有用戶。只要匹配,做你的處理,然後刪除標籤。如果你能做到這一切在一個查詢中,它看起來像:

MATCH (u:MarkedUser) 
// do your processing here 
REMOVE u:MarkedUser 
相關問題