产品推荐密码

问题描述

我有以下简单的图表 -

product graph

我希望基于以下示例构建一个简单的推荐系统:

  1. 考虑到我们的发票 1 上有一篇文章“Apple”。
  2. 我们还有发票 2,其中包含“Apple”和“Oranges”。
  3. 应向发票 1 的客户推荐“Oranges”。

基本上,当客户将商品添加到发票时,我们需要推荐添加到另一张发票的商品,并且当前发票中至少有该商品的一篇。以及当前发票中没有的推荐商品。

另一种说法 -

如果发票 1 中存在物品 A 且发票 2 也包含物品 A,则列出发票 2 中的所有其他物品,前提是它们不存在于发票 1 中。

但是,作为一个完整的初学者,我无法弄清楚如何编写密码查询。有关如何编写此类查询的任何帮助?

解决方法

应该从以下内容开始:

MATCH (i:Invoice)-[]-(a:Article)-[]-(:Invoice)-[]-(b:Article) 
WHERE i.invoiceNumber = 123
RETURN b;

它的作用是 - 从发票开始,然后浏览与该发票相关的文章,浏览到其他发票(共享本文的所有其他发票)。从那里它收集与这些发票相关的所有物品。 (这假设您使用唯一的Article节点并将发票连接到它们)

,

您可以对给定的客户(假设为 Customer1)使用以下查询,根据 Customer1 订购的任何食物以及其他客户常见的食物为我提供其他客户和推荐食物。

MATCH (c1:Customer {name: 'Customer1'})<-[:GENERATED_FOR]-(:Invoice)<-[:ITEMIZED_IN]-(:Article)-[:TYPE]->(f:FoodArticle)
WITH c1,collect(f) as food 
MATCH (c2:Customer)<-[:GENERATED_FOR]-(:Invoice)<-[:ITEMIZED_IN]-(:Article)-[:TYPE]->(f2:FoodArticle) 
   WHERE c1 <> c2 AND f2 in food
WITH c2,food,collect(f2) as food2
WITH c2,[fd IN food WHERE NOT fd IN food2] as recommendations 
   WHERE size(recommendations) > 0
RETURN c2.name,recommendations
  1. 首先,获取客户 1 订购的所有食物
  2. 接下来,查找在 Customer1 的食物中至少包含一种食物的所有客户
  3. 列出 customer2 并收集该 customer2 的所有食物
  4. 根据在 customer1 食物列表中找到但在 customer2 食物列表中找不到的食物创建推荐食物列表
  5. 返回 customer2 名称和推荐的食物,但确保 Customer1 列表中至少有一种在 customer2 列表 (food2) 中找不到的食物