這是基於從Neo4j的文檔樣本的Cypher:如何加速Neo4j Cypher中的協作過濾?
MATCH (user:User)-[:ORDERS]->(:Product)<-[:ORDERS]-(otherUser:User)-[:ORDERS]->(recommended:Product)
WHERE NOT (user)-[:ORDERS]->(recommended)
AND user.id = 171
RETURN distinct recommended.id, count(distinct otherUser.id) as frequency
ORDER BY frequency DESC
LIMIT 200
而下面是我所作的改進:
MATCH (user:User)-[:ORDERS]->(p:Product)
WHERE user.id = 171
WITH DISTINCT p, user
MATCH (p)<-[:ORDERS]-(otherUser:User)
WITH DISTINCT otherUser, user
MATCH (otherUser)-[:ORDERS]->(recommended:Product)
WHERE NOT (user)-[:ORDERS]->(recommended)
RETURN distinct recommended.id, count(distinct otherUser.id) as frequency
ORDER BY frequency DESC
LIMIT 200
兩者返回相同的結果,但第二個運行快6倍。 (但仍然3我的Macbook花了幾秒鐘)
- 爲什麼第二個運行更快?
- 如何進一步提高速度?
太好了,它跑得快得多!一點校正:'返回DISTINCT recommended.id,計數(DISTINCT其他)作爲頻率' –
我想知道爲什麼你需要在那裏使用'UNWIND'?與以下有什麼不同? 'MATCH(user:User) - [:ORDERS] - >(p:Product)< - [:ORDERS] - (otherUser:User) WHERE user.id = 171 WITH distinct otherUser,COLLECT(DISTINCT p) AS sharedProds MATCH(otherUser) - [:訂單] - >(推薦:產品) WHERE不推薦sharedProds 具有鮮明的推薦,COUNT(DISTINCT otherUser)AS頻率 RETURN DISTINCT recommended.id,頻率 ORDER BY頻率DESC LIMIT 200' –
如果你想以一個別名得到整個獨特的'products'集合,你必須也聚合'other'。爲了每行保留一個'otherUser',你只需執行'COLLECT'和'UNWIND',然後每行都有一個'otherUser'和'Products'的完整列表。但是,對於您的查詢,我相信這是不必要的,因此您的編輯也應該可以正常工作(但當然也可以查看其中哪一個更好) –