Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NEO4J类似配方的慢速查询_Neo4j - Fatal编程技术网

NEO4J类似配方的慢速查询

NEO4J类似配方的慢速查询,neo4j,Neo4j,我是NEO4J的新手,但多年来一直在使用MySQL。现在,我已经创建了一个数据库,拥有70万用户、80万本食谱和160万份保存的食谱 节点的结构如下:User-[:CREATED]:Cookbook-[:SAVED]:Recipe。所有用户和食谱都是独一无二的,但一个用户可以拥有多个食谱,而每个食谱都可以拥有多个食谱 我试图通过查看同一本食谱中的巫婆食谱来找到类似的食谱。这是我的疑问: MATCH(r:Recipe {recipe_id:2987431})--()--(similar:Recip

我是NEO4J的新手,但多年来一直在使用MySQL。现在,我已经创建了一个数据库,拥有70万用户、80万本食谱和160万份保存的食谱

节点的结构如下: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秒的时间,这对于我们的站点来说是一种渴望。我目前正在亚马逊的EC2 m3.X2大型服务器上测试它


有什么方法可以加快查询速度,还是应该以完全不同的方式构造查询?

以下是一些加快查询速度的方法

在可能的情况下,通常更快地匹配,即定义方向和关系类型。 我认为您可以在一个步骤中匹配所有内容,而不需要分割相似食谱的匹配和相似食谱的所有食谱。 如果将一个配方与类似配方进行匹配,则不需要对相同或相似的配方进行筛选。查询将只返回至少找到一个类似结果的结果。 最后一件事是,将一个配方与所有相似的配方匹配,然后使用所有相似配方的数量。如果要按常用食谱的数量筛选类似食谱,则需要根据食谱或关系进行筛选。
非常感谢。我尝试了您的查询,修复了关系的方向,并在order by中添加了DESC。但不幸的是,速度更慢。查询耗时5秒,结果不一样。最受欢迎的类似食谱有29本普通食谱,但根据新的查询,最受欢迎的食谱有130本普通食谱。我认为问题在于countcommon_cb将对每个食谱食谱组合的每一行进行计数。我在计数函数中添加了DISTINCT。那么结果是正确的,但仍然很慢。匹配r:Recipe{Recipe_id:2987431}相似:Recipe 0.05返回相似,num_common_cb,num_common_cb的百分比顺序是否已分析查询?那是什么意思?查询的哪一部分需要时间?分析听起来完全合理。我也有过类似的经历,一场比赛速度更快。但这取决于图表,所以可能不是一个好答案。但也许要点有帮助。
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