你將不得不清理你的查詢,現在你不使用索引(所以用特定名稱初始匹配是慢),然後執行笛卡爾針對所有產品:用戶節點,然後爲每一行創建字符串。因此,首先在USER(name)上創建一個索引,以便快速找到您的開始節點。我們將不得不清理比賽的其餘部分。
嘗試這樣代替:
MATCH (n:USER) WHERE n.name = "name"
WITH n, "2000" as number
MATCH (n)<-[:CREATED_BY]-(:COMMENT)-[:HAS]->(l:LIKE)-[:CREATED_BY]->(o:User)
RETURN n, o, number, count(l)
你應該在查詢看到一個類似的計劃與此查詢爲沒有「2000」。
這樣做的原因是,雖然你的計劃與您匹配o
笛卡爾積,規劃是足夠的智能,實現有一個附加的限制爲o
,它曾在圖案出現在你的最後一場比賽,並且針對這種情況進行優化可以避免執行笛卡爾產品。
然而,一個新變量number
的介紹阻止了規劃人員認識到這基本上是相同的情況,因此規劃人員沒有優化笛卡爾產品。
現在,嘗試明確您希望執行查詢的方式,並儘量避免在查詢中使用笛卡爾積。
在這種特殊情況下,意識到當你在第三行有MATCH (o:User)
時,這並不是說o
的類型是a:用戶在後面的匹配中,而是說你的結果中的每一行到目前爲止,針對所有用戶節點執行笛卡爾乘積,然後針對每個用戶節點,查看提供的模式中存在哪些節點。與簡單地擴展提供的模式並獲取任何內容相比,這是很多不必要的工作:您在模式的另一端找到的用戶節點。
編輯
至於獲得兩項:LIKE和:厭惡節點數,也許嘗試這樣的事:
MATCH (n:USER) WHERE n.name = "name"
WITH n, "2000" as number
MATCH (n)<-[:CREATED_BY]-(:COMMENT)-[:HAS]->(likeDislike)-[:CREATED_BY]->(o:User)
WITH n, o, number, head(labels(likeDislike)) as type, count(likeDislike) as cnt
WITH n, o, number, CASE WHEN type = "LIKE" THEN cnt END as likeCount, CASE WHEN type = "DISLIKE" THEN cnt END as dislikeCount
RETURN n, o, number, sum(likeCount) as likeCount, sum(dislikeCount) as dislikeCount
假設你仍然需要number
變量在那裏。
我的假設是你/ cypher創建32969個新的字符串。你是否在JVM中執行gc暫停?使用數字2000時您是否遇到同樣的情況? – manonthemat