Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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_Graph Databases_Orientdb - Fatal编程技术网

Neo4j 愿望列表和库存匹配与图形数据库是否可行?

Neo4j 愿望列表和库存匹配与图形数据库是否可行?,neo4j,graph-databases,orientdb,Neo4j,Graph Databases,Orientdb,你好 这是我的用例:每个用户都有一个愿望清单和他们提供的物品清单。项目的数量是一个确定的数字,而用户可以是任何数字 我的目标是根据一个算法为登录用户提供一个推荐或一个用户列表,这些用户的清单与他的愿望列表相匹配。需要注意的是,我需要能够以这样一种方式对结果进行排序,即根据其愿望列表拥有最完整的产品的用户出现在顶部,并以降序方式对其进行排序。我需要能够在一个分页的方式,所以我希望查询可以在3秒内完成使用商品虚拟服务器规格 现在来看我的数据,为了简单起见,我只会将每个用户的愿望列表中的35个独特项目

你好

这是我的用例:每个用户都有一个愿望清单和他们提供的物品清单。项目的数量是一个确定的数字,而用户可以是任何数字

我的目标是根据一个算法为登录用户提供一个推荐或一个用户列表,这些用户的清单与他的愿望列表相匹配。需要注意的是,我需要能够以这样一种方式对结果进行排序,即根据其愿望列表拥有最完整的产品的用户出现在顶部,并以降序方式对其进行排序。我需要能够在一个分页的方式,所以我希望查询可以在3秒内完成使用商品虚拟服务器规格

现在来看我的数据,为了简单起见,我只会将每个用户的愿望列表中的35个独特项目和库存中的250个独特项目限制在一起。对于我的测试数据,我输入了50k个用户,每个用户都有基于限制的随机愿望列表/库存计数。我用MySQL中的一个连接映射了它,在这个测试数据上我得到了大约700万个关系。出于好奇,我尝试通过使用在愿望列表中有35项的用户的ID连接愿望列表和库存表来查询数据库。即使在所有涉及的列中使用了最优化的查询模式和索引,也需要一个空的机架空间虚拟服务器(2GB RAM,1vCPU)21秒才能完成查询。为了知道硬件不是瓶颈,我还尝试了在我的家用计算机上进行查询,这比普通服务器快得多,内存也更多,查询耗时8秒,距离我预期的不到3秒的目标还有一点距离

为了确保我在决定使用图形数据库之前尝试了所有方法,我在MongoDB上做了相同的测试,唯一可以应用匹配算法的方法是通过MapReduce。结果是在远程服务器上进行了9秒的查询,而在我的家庭计算机上进行了3秒的查询。对于我的用例来说,这仍然是不可行的,因为MapReduce对服务器来说非常繁重,想象一下500个用户同时进行查询

现在谈谈我所说的算法:

  • 获取用户愿望列表上的所有内容,并获得提供这些项目的用户列表
  • 对于每个用户,获取与愿望列表中的项目相匹配的所有项目,如果他们提供的比要求的多,则只使用希望的数量
  • 合计这些计数,并获得愿望列表的最终匹配百分比
  • 让我们来看一些示例数据:

    # 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个游标(想想分页)?光标必须已经对结果进行了聚合和排序。我希望我没有要求太多最后加载了所有