Neo4j 愿望列表和库存匹配与图形数据库是否可行?
你好 这是我的用例:每个用户都有一个愿望清单和他们提供的物品清单。项目的数量是一个确定的数字,而用户可以是任何数字 我的目标是根据一个算法为登录用户提供一个推荐或一个用户列表,这些用户的清单与他的愿望列表相匹配。需要注意的是,我需要能够以这样一种方式对结果进行排序,即根据其愿望列表拥有最完整的产品的用户出现在顶部,并以降序方式对其进行排序。我需要能够在一个分页的方式,所以我希望查询可以在3秒内完成使用商品虚拟服务器规格 现在来看我的数据,为了简单起见,我只会将每个用户的愿望列表中的35个独特项目和库存中的250个独特项目限制在一起。对于我的测试数据,我输入了50k个用户,每个用户都有基于限制的随机愿望列表/库存计数。我用MySQL中的一个连接映射了它,在这个测试数据上我得到了大约700万个关系。出于好奇,我尝试通过使用在愿望列表中有35项的用户的ID连接愿望列表和库存表来查询数据库。即使在所有涉及的列中使用了最优化的查询模式和索引,也需要一个空的机架空间虚拟服务器(2GB RAM,1vCPU)21秒才能完成查询。为了知道硬件不是瓶颈,我还尝试了在我的家用计算机上进行查询,这比普通服务器快得多,内存也更多,查询耗时8秒,距离我预期的不到3秒的目标还有一点距离 为了确保我在决定使用图形数据库之前尝试了所有方法,我在MongoDB上做了相同的测试,唯一可以应用匹配算法的方法是通过MapReduce。结果是在远程服务器上进行了9秒的查询,而在我的家庭计算机上进行了3秒的查询。对于我的用例来说,这仍然是不可行的,因为MapReduce对服务器来说非常繁重,想象一下500个用户同时进行查询 现在谈谈我所说的算法:Neo4j 愿望列表和库存匹配与图形数据库是否可行?,neo4j,graph-databases,orientdb,Neo4j,Graph Databases,Orientdb,你好 这是我的用例:每个用户都有一个愿望清单和他们提供的物品清单。项目的数量是一个确定的数字,而用户可以是任何数字 我的目标是根据一个算法为登录用户提供一个推荐或一个用户列表,这些用户的清单与他的愿望列表相匹配。需要注意的是,我需要能够以这样一种方式对结果进行排序,即根据其愿望列表拥有最完整的产品的用户出现在顶部,并以降序方式对其进行排序。我需要能够在一个分页的方式,所以我希望查询可以在3秒内完成使用商品虚拟服务器规格 现在来看我的数据,为了简单起见,我只会将每个用户的愿望列表中的35个独特项目
# users
------------
uid | name
------------
1 | Ramon
2 | Mark
3 | Ralph
------------
# wishlist
--------------------------
pkid | uid | item_id | qty
--------------------------
1 | 1 | 1 | 2
2 | 1 | 2 | 5
3 | 1 | 3 | 1
--------------------------
# offers
--------------------------
pkid | uid | item_id | qty
--------------------------
1 | 2 | 1 | 1
2 | 3 | 2 | 2
2 | 2 | 3 | 7
这让我以这种方式设计图表:
因此,从节点Ramon
开始,遍历该图以获得其他为我提供服务的用户。以下为汇总前的初步结果:
uid | item_id | wishlist_qty | offer_qty
----------------------------------------
2 | 1 | 2 | 1
2 | 3 | 1 | 1 # this should be 7 but we only need 1
3 | 2 | 5 | 2
----------------------------------------
根据以上数据,我们现在可以通过以下操作确定哪个用户拥有最多的用户愿望列表:
sum(offer\u qty)/sum(wishlist\u qty)
然后根据此结果对用户进行降序排序,这将给我们提供如下信息:
uid | percentage
----------------
2 | 0.67
3 | 0.4
----------------
这就是我想要实现的推荐算法。我不熟悉图形数据库,所以如果这是可以实现的,并且在我想要的环境和用户数量中表现良好,我需要朝着正确的方向轻推。如果您有其他建议,可以使用其他类型的数据库(如column store)或更改我的数据模型以使其适用于此用例和预期环境,请随意提出建议,但请包括我如何使其适用于我的场景
我希望我已经完整地说明了我的编程问题。提前感谢您的回答
Ramon如果你的问题是图形数据库是否会表现得更好,以及它是否会表现得足够好,那么答案肯定是肯定的,也可能是肯定的。它肯定会比您迄今为止所尝试的性能更好,如果您对数据进行了良好的建模,并且您似乎已经做到了这一点,那么它的性能将足够好(在您的需求范围内)。我推荐Neo4j,它是像您这样的推荐引擎的最佳选择。我尝试过在中代表您的模型,可以随意使用它。你不会从中得到任何基准,但它会让你感觉到它将如何工作。如果你的问题是图形数据库是否会表现得更好,以及它是否会表现得足够好,答案肯定是肯定的,也可能是肯定的。它肯定会比您迄今为止所尝试的性能更好,如果您对数据进行了良好的建模,并且您似乎已经做到了这一点,那么它的性能将足够好(在您的需求范围内)。我推荐Neo4j,它是像您这样的推荐引擎的最佳选择。我尝试过在中代表您的模型,可以随意使用它。您不会从中获得任何基准测试,但它会让您感觉到它将与什么一起工作。很棒的用例描述!您的问题是,您是否可以在图形数据库中实现更好(并且足够好)的性能建模?答案是肯定的,但我认为您可能希望的不仅仅是:)伟大的用例描述!您的问题是,您是否可以在图形数据库中实现更好(并且足够好)的性能建模?答案是肯定的,但我想你可能希望得到的不止这些:)回答得很好,我想你可能一针见血。我将尝试在neo4j中设置我的测试数据,并报告我的发现。我认为我看到的一个问题是,如果一个用户希望其他用户提供90%的服务。那将是一个非常大的结果集。neo4j在遍历它时会将所有这些内容加载到内存中吗?还是我能够返回一个游标,一次遍历15个游标(想想分页)?光标必须已经对结果进行了聚合和排序。我希望我没有要求太多最后加载了所有