NEO4J慢慢查询类似的食谱

时间:2015-10-23 12:53:15

标签: neo4j

我是NEO4J的新手,但多年来一直与MySQL合作。现在我创建了一个拥有70万用户,80万个食谱和1,6M保存食谱的数据库,我NEO4J。

节点的结构如下(:User) - [:CREATED] - (:Cookbook) - [:SAVED] - (:Recipe)。所有用户和食谱都是独一无二的,但是一个用户可以拥有多功能烹饪书,每个食谱都可以有多种食谱。

我试图通过查看巫婆食谱找到相似的食谱是在同一本食谱中。这是我的问题:

MATCH(r:Recipe {recipe_id:2987431})--()--(similar:Recipe)
USING INDEX r:Recipe(recipe_id)
WITH similar,toFloat(count(similar)) as same
MATCH (similar)-[rel]-()
WITH similar, same, toFloat(count(rel)) as total
WHERE (same/total) > 0.05 AND same > 1
RETURN similar, same, total, (same/total) as percent
ORDER BY same DESC
LIMIT 20

我首先通过最常见食谱的食谱来订购结果。我还过滤掉了所有食谱,其中不到5%的食谱与第一个食谱相同。他们还需要有超过1种常见食谱。

问题是查询需要大约1秒才能执行,这是在我们的网站上使用的方法。我目前正在亚马逊的EC2 m3.x2large服务器上进行测试。

有没有办法加快查询速度,还是以完全不同的方式构建?

1 个答案:

答案 0 :(得分:0)

以下是一些如何加快速度的想法。

  • MATCH在可能的情况下明显更快(即定义方向和关系类型)。
  • 我认为你可以一步到位MATCH一切,不需要为相似的食谱分配相似食谱和所有食谱的匹配。
  • 如果您MATCH从一个配方到相似,则无需在count(similar)same上进行过滤。查询将仅返回至少找到一个相似内容的结果。
  • 最后一件事是MATCH 所有类似食谱的一个食谱,然后使用所有类似食谱的数量same。如果您想按照普通食谱的数量过滤类似的食谱,您需要过滤食谱或关系。
MATCH (r:Recipe {recipe_id:2987431})-[:SAVED]->(common_cb:Cookbook)<-[:SAVED]-(similar:Recipe)-[similar_total:SAVED]->(:Cookbook)
WITH similar, count(common_cb) as num_common_cb, toFloat(count(similar))/toFloat(count(similar_total)) as percent
WHERE percent > 0.05
RETURN similar, num_common_cb, percent
ORDER BY num_common_cb