【问题标题】:Recommendation based on similartiy of relationship基于关系相似性的推荐
【发布时间】:2017-12-27 11:01:39
【问题描述】:

我想创建一个基于当前购物车内容与其他(已放置的)订单相比的推荐引擎,并考虑使用如下图表:

(u:User)-[po:PUT_ORDER]->(o:Order)-[cp:CONTAINS_PRODUCT]->(p:Product)

我是 Neo4j/Cypher 的新手,如果有人能就以下问题指出正确的方向,我将不胜感激:

  1. 是否可以根据我当前的购物车获取其他已经下的具有最相似产品的订单(至少是我当前购物车中的产品)并推荐 delta 产品,即减去我们共同的产品并推荐其他的……这可能吗?

  2. 假设没有其他订单包含我的购物车中的所有产品。有没有办法根据他们共有的产品数量降序对已经下达的订单进行分组,并为每个订单(比如前 10 个订单)获取“增量产品”?

【问题讨论】:

    标签: neo4j cypher recommendation-engine


    【解决方案1】:

    问题不是很清楚,但我会尽力提供答案:

    是否可以根据我当前的购物车获取其他已经下的具有最相似产品的订单(至少是我当前购物车中的产品)并推荐 delta 产品,即减去我们共同的产品并推荐其他的……这可能吗?

    是的,这是可能的。减法可能非常棘手(因为 Cypher 目前缺少 MINUS 子句),但您可以使用列表推导来计算它:

    WITH [1, 2, 3, 4] AS xs, [3, 4, 5] AS ys
    RETURN [x IN xs WHERE NOT x IN ys | x]
    

    此外,如果您沿关系相减,您可能需要使用否定模式条件 (WHERE NOT <pattern>):

    MATCH (p:Product) ...
    WHERE NOT (p)-[:SOME_REL_TYPE]->(:SomeNodeLabel)
    RETURN p
    

    假设没有其他订单包含我购物车中的所有产品。有没有办法根据他们共有的产品数量降序对已经下达的订单进行分组,并为每个订单(比如前 10 个订单)获取“增量产品”?

    要计算常见产品的数量,请使用指向同一 p 节点的 MATCH 子句。

    MATCH
      (u1:User {id: $currentUser})-[:PUT_ORDER]->(:Order)-[:CONTAINS_PRODUCT]->(p:Product),
      (u2:User)-[:PUT_ORDER]->(:Order)-[:CONTAINS_PRODUCT]->(p)
    WITH u1, u2, count(p) AS commonProducts
    ORDER BY commonProducts DESC
    LIMIT 10
    // continue calculation with u1, u2
    

    【讨论】:

    • 感谢您的示例。什么是 [1,2,3,4] (=A) 和 [5,6,7] (=B) 是 A 我的购物车中的产品和 B = 特定订单的其他产品还是?我是否必须为每个具有类似产品的订单执行此操作,还是我可以巧妙地总结一下?
    • 对于 A 和 B,我并没有什么特别的想法——我只是想提供一个为列表做减法的例子。
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2017-11-14
    • 2015-06-07
    • 2011-11-23
    相关资源
    最近更新 更多