2013-09-30 31 views
1

我有一些非常高的查詢時間,我無法找出問題。令人難以置信的高查詢時間

我有一個包含6685個節點,26407個屬性和22921個關係的圖形數據庫,運行在具有1.7GB RAM的Amazon EC2實例上。

我的用例是將人們映射到他們的各種興趣點,並找到給定的用戶,誰是與他有共同興趣的人。

我的數據庫中有大約500人的數據,每個人平均有超過100個與他有關的不同興趣點。

1)當運行此暗號查詢:

START u=node(5) MATCH (u)-[:interests]->(i)<-[:interests]-(o) RETURN o; 

這裏節點(5)是一個用戶節點。所以,我試圖找到與用戶(u)具有相同「:興趣」關係的所有用戶。

該查詢返回2557行,大約需要350ms。

2)當我在一些額外的MATCH條件下撒播時,查詢時間呈指數下降。

對於例如,如果我想找到誰擁有用戶的共同利益,所有用戶(U)=節點(5),並且也有着相同的家鄉,我寫道:

START u=node(5) 
MATCH (u)-[:interests]->(i)<-[:interests]-(o) 

WITH u,o,i 
MATCH (u)-[:hometown]->(h)<-[:hometown]-(o) 
RETURN u, o, i, h; 

該查詢返回755行,大約需要2500ms! 3)如果我向MATCH添加更多的約束條件,如同性別,相同的母校等,查詢時間會逐漸惡化到> 10,000毫秒。

我在這裏做錯了什麼?

回答

2

您可以嘗試在您的第一個MATCH條款中說明整個模式,即MATCH (u)-[:interests]->(i)<-[:interests]-(o)-[:hometown]->(h)<-[:hometown]-(o)

+0

也許'WHERE(u) - [:hometown] - >(h)< - [:hometown] - (o)'而不是WITH ... MATCH ...也會幫助 – PhilBa

+0

我認爲問題是通過使用WITH和MATCH密碼先分別執行每個MATCH子句,然後建立笛卡爾積,然後再由U,I,O進行加入。但這比任何事情都更值得猜測。 – PhilBa

+0

由於兩種模式可以組合並表達爲一種,所以根本不需要「WITH」或「WHERE」,或者那是我的想法。 OP確實提到了進一步的約束,可能一組擴展的約束不能以單一模式一起表達。我不知道最好是什麼,我的意思是將約束放在WHERE子句中,如果它們只是模式的擴展,只有在寫入操作,聚集或其他操作時才用WITH來分割查詢參與其中。我不知道Cypher的內部,所以我的0.02美元是謙虛的。你怎麼看? – jjaderberg

相關問題