【发布时间】:2015-09-10 16:41:10
【问题描述】:
我目前正在使用由 3 种类型的节点组成的 neo4j 数据库:“用户”、“商家”和“报价”。
用户点击优惠,然后从商家处购买。因此,存在以下关系:
(:User)-[:PURCHASED_FROM]->(:Merchant)
(:User)-[:CLICKED_ON]->(:Offer)
我想执行一个密码查询,该查询将根据有多少其他具有相似品味的用户从该商家购买过商品,向特定用户推荐商家。所以我相信这是一个非常标准的协同过滤查询。
查询如下所示:
MATCH(u:User{userId:1234)-[:PURCHASED_FROM]->(:Merchant)<-[:PURCHASED_FROM]-(:User)-[r:PURCHASED_FROM]->(newMerchants:Merchant)
WHERE NOT (u)-[:PURCHASED_FROM]->(newMerchants)
RETURN DISTINCT newMerchants.name, newMerchants.merchantId, count(r) AS rel_count
ORDER BY rel_count DESC
LIMIT 30
我的问题是这个查询需要很长时间才能运行。事实上,这需要很长时间,我还没有看到它完成。删除 count() 聚合函数会有所帮助,但我需要按此关系计数进行排序,以便用户看到与他们最相关的商家。
我认为问题是由于图中节点和关系的数量以及执行上述查询时发生的遍历次数造成的。
单个商家节点拥有 >1m :PURCHASED_FROM 关系的情况并不少见。
我认为这一定是一个在大图中经常出现的问题。有哪些建模方法可用于减少查询时所需的遍历次数?
【问题讨论】:
-
与您的数据模型无关,但您是否尝试过任何性能调整配置更改?这里有不同选项的概述:neo4j.com/developer/guide-performance-tuning
标签: neo4j