2015-05-25 147 views
2

我有一些性能問題使用特定的Cypher命令。Neo4j查詢性能問題

我尋找不直接連接到一組特定的式I(在此,在「79」和「4」用索引字段的節點)的節點的ř節點和我希望最大化字段「得分」:

MATCH (r:R), (i0:I { index:"79" }), (i1:I { index:"4" }) 
WHERE NOT r--i0 AND NOT r--i1 
RETURN r.index 
ORDER BY r.score DESC 
LIMIT 5 

查詢一般在1250ms內執行。 如果我刪除了ORDER BY子句,請求時間就下降到130ms。 order子句迭代近3300個元素。

任何想法如何加快這一要求?我相信有一種方法可以使用另一種語法來執行此搜索。

回答

3

我認爲這是正常的,通過刪除ORDER BY,他會返回5個他可以匹配的第一個節點。 通過添加ORDER BY,它強制加載所有可能的匹配節點,具體取決於時間將增加的「R」節點的數量。

現在:

你 「異形」 與PROFILE查詢

你有索引/制約我:指數?

你可以改變你的小幅查詢:

MATCH (r:R), (i0:I { index:"79" }), (i1:I { index:"4" }) 
WHERE NOT EXISTS((r)--(i0)) 
AND NOT EXISTS((r)--(i1)) 
RETURN r.index 
ORDER BY r.score DESC 
LIMIT 5 
+0

我對我和兩個索引字段作爲唯一約束R.我的請求速度與請求版本幾乎相同。然後我更新到2.3.0-M01,並且我有150ms的請求時間。這裏有你的個人資料數據:[l​​ink](http://pastebin.com/raw.php?i=tKrNQe0W) –

2

你使用哪個版本?嘗試更新到最新版本,也請用`PROFILE``其前綴查詢

變化,分享你的視覺查詢計劃:

MATCH (i0:I { index:"79" }), (i1:I { index:"4" }) 
MATCH (r:R) 
WHERE NOT r--i0 AND NOT r--i1 
WITH r 
ORDER BY r.score DESC 
LIMIT 5 
RETURN r.index