我有一些非常高的查詢時間,我無法找出問題。令人難以置信的高查詢時間
我有一個包含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毫秒。
我在這裏做錯了什麼?
也許'WHERE(u) - [:hometown] - >(h)< - [:hometown] - (o)'而不是WITH ... MATCH ...也會幫助 – PhilBa
我認爲問題是通過使用WITH和MATCH密碼先分別執行每個MATCH子句,然後建立笛卡爾積,然後再由U,I,O進行加入。但這比任何事情都更值得猜測。 – PhilBa
由於兩種模式可以組合並表達爲一種,所以根本不需要「WITH」或「WHERE」,或者那是我的想法。 OP確實提到了進一步的約束,可能一組擴展的約束不能以單一模式一起表達。我不知道最好是什麼,我的意思是將約束放在WHERE子句中,如果它們只是模式的擴展,只有在寫入操作,聚集或其他操作時才用WITH來分割查詢參與其中。我不知道Cypher的內部,所以我的0.02美元是謙虛的。你怎麼看? – jjaderberg