2016-03-06 70 views
0

我有不同類型的節點和邊的圖。我想獲取兩個節點(索引WORD)之間的所有路徑,這些節點通過edge(relation NEXT_WORD)與屬性edgeLevel = 1相連。我不想在「edgeLevel!= 1」處獲得連接。我寫了一個查詢非常重的密碼匹配查詢

MATCH p=(a:WORD{wholeWord:"are"})-[r:NEXT_WORD*1..3{edgeLevel:1}]->(b:WORD{wholeWord: "you"}) RETURN length(p); 

但它很重。我試圖找出如何優化這個密碼查詢,但我不知道。有沒有更快,更不重要的方式來做到這一點?該查詢在7931毫秒內返回了32行。

Cypher PROFILE query

回答

1

您似乎已經有:WORD(wholeWord)的索引。但是,您的查詢不使用索引來查找ab。該查詢應該會更快:

MATCH p=(a:WORD { wholeWord:"are" })-[r:NEXT_WORD*..3 {edgeLevel:1}]->(b:WORD { wholeWord: "you" }) 
USING INDEX a:WORD(wholeWord) 
USING INDEX b:WORD(wholeWord) 
RETURN length(p); 

但是,如果你不要求你的(因爲較少的DB命中)關係的特定屬性值,特別是因爲沒有方法來創建一個索引的查詢可以更快爲了關係。所以,如果你可以使用一個[:NEXT_WORD_1]關係,而不是[:NEXT_WORD {edgeLevel:1}]關係,這將是最快的:

MATCH p=(a:WORD { wholeWord:"are" })-[r:NEXT_WORD_1*..3]->(b:WORD { wholeWord: "you" }) 
USING INDEX a:WORD(wholeWord) 
USING INDEX b:WORD(wholeWord) 
RETURN length(p); 
+0

感謝您的答覆。但是添加USING INDEX b:WORD(wholeWord)並沒有加快查詢速度。以前的查詢成本:378082總分貝命中,你的第一個命題:規劃師:規則。 10984317總分貝命中。添加新的關係NEXT_WORD_1相當適合這種情況,但我認爲這是剩下的唯一選擇。我會嘗試重新實現這個圖結構,我會在下一個評論中給你答案。 – Piotr0123456

+0

我已經實現了新類型的關係,現在它的工作速度更快。我用新類型的關係'NEXT_WORD_1' planner查詢:COST。 61194總分貝命中188毫秒。你的第一個解決方案(使用兩個索引和'NEXT_WORD_1')規劃器:RULE。 19993總分貝命中172毫秒。 – Piotr0123456