2014-02-07 49 views
2

我有他們所屬的usersgroups。 我有一個指數n:集團(名稱)密碼2.0:使用基於標籤的索引來搜索一組節點

我想搜索所有用戶都屬於一套班子:「GR1」,「GR2」,「GR3」]

哪些其他羣體,他們屬於。

所以我有以下查詢: 查詢:

MATCH (gr:Group) <--(us:User)--(gr2:Group) 
WHERE gr.name in ["gr1","gr2"] 
return distinct gr2 

這裏的事情,是我認爲因爲查詢是減緩暗號不使用索引。

我有2k節點,50k的關係。 以下查詢花費700毫秒之間200到(取決於高速緩存):

MATCH (gr:Group) <--(us:User)--(gr2:Group) 
WHERE gr.name = "gr1" 
return distinct gr2 

然而,以下查詢,2至6秒之間取!

MATCH (gr:Group) <--(us:User)--(gr2:Group) 
WHERE gr.name in ["gr1"] 
return distinct gr2 

當我試圖做的事:

MATCH (gr:Group) <--(us:User)--(gr2:Group) 
using index gr:Group(name) 
WHERE gr.name in ["gr1"] 
return distinct gr2 

我得到以下錯誤:

Cannot use index hint in this context. The label and property comparison must be specified on a non-optional node 
Label: `Group` 
Property name: `name` 

(以 「=」,而不是 「中」 我沒有得到任何錯誤)

我正在使用neo4j enterprise 2.0.1。測試結果來自neo4j瀏覽器。

+0

'IN'尚不支持索引查找上一個標籤,遺憾的是性能。 –

回答

3

當您在(gr:Group {name: "gr1"})中指定模式中的attribs或您致電WHERE gr.name = "gr1"時,將引用索引。在您的情況下,您可以使用OR子句。

MATCH (gr:Group) <--(us:User)--(gr2:Group) 
WHERE gr.name="gr1" OR gr.name="gr2" 
return distinct gr2 
+0

我需要查詢參數,這意味着我想將一組組名稱傳遞給查詢。在neo 1.9中,我至少可以從一組節點(由參數給定)開始。 2.0中沒有辦法做到這一點? (我可以創建一個字符串,就像你之前提到的那樣動態添加更多可能的值給or語句,但是這有點不重要..) – skme

+0

不幸的是,目前還不可能。您可以使用'gr.name IN {names}',但不會使用索引,只有在只有少數幾個組時纔有意義。 –