我目前正在研究一个产品推荐查询,该查询应该返回产品以推荐给当前客户,基于查看相似产品找到相似客户,然后建议这些相似客户查看过的其他产品。我们的业务是寄售的,所以我们只有每种产品的1个,所以我在类似视图中使用更大的数据集,而不仅仅是购买。我期望这个查询应该能够在一秒钟内运行,因为它目前只针对我们开发环境中略多于10k的产品和10k用户运行。我不确定是否需要调整我的查询,linux/java/neo4j配置或两者兼而有之。有人有这方面的经验吗?
MATCH (currentUser:websiteUser{uuid: 'ea1d35e7-73e6-4990-b7b5-
2db24121da9b'})-[:VIEWED]->(i:websiteItem)<-[:VIEWED]-
(similarUser:websiteUser)-[r:VIEWED]->(similarItem:websiteItem
{active: true})
RETURN similarItem.designer, similarItem.title,
similarItem.brandSize, similarItem.sku, similarItem.shopifyProductId,
similarItem.url, similarItem.price, COUNT(distinct r) AS score
ORDER BY score DESC LIMIT 15
配置文件输出:
查询画像输出
在做了一些进一步的研究,并尝试了互联网上与机器性能调整和查询相关的其他帖子中的许多不同建议后,我发现了以下查询重写,以提供基于分步重写查询的最佳速度,并使用不同来限制结果从查询的一个部分膨胀到下一个部分。
MATCH (u:websiteUser{uuid: 'ea1d35e7-73e6-4990-b7b5-2db24121da9b'})
MATCH (u)-[:VIEWED]->(i:websiteItem)
WITH distinct i
MATCH (i)<-[:VIEWED]-(su:websiteUser)
WITH distinct su
MATCH (su)-[r:VIEWED]->(si:websiteItem {active: true})
RETURN si.designer, si.title, si.brandSize, si.sku, si.shopifyProductId,
si.url, si.price, COUNT(distinct r) AS score
ORDER BY score DESC
LIMIT 15