Neo4J cypher:recommend 产品使用 NOT 子句或任何

Neo4J cypher:recommend products using NOT clause or any

我可以使用以下代码在 material 和购买它的最终用户之间建立关系 但现在我想找到 materials 不是最终用户使用 materials 共同购买的,并在图表中显示为推荐引擎。假设 A 购买了 1,2,3 件产品,B 购买了 1,3 件产品,c 有 5 件,在这里我想向 B 客户推荐产品 2,而 c 没有产品,因为 c 和其他产品没有共同推荐的产品

 MATCH(f:material),(t:enduser) WHERE NOT (f)-[:BOUGHT]->(t) return f,t

我尝试使用 Not 子句,但它显示了所有产品

下面是我将如何解决这个问题。

假设下图(基于您给出的场景):

为用户 b 推荐 materials:

MATCH (user:EndUser{name:'b'})-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material)
WHERE
    NOT((user)-[:BOUGHT]->(m))
    AND user <> someOtherUser
RETURN m

哪个会得到结果:

同样,如果我们尝试使用 USER-C,我们会得到:

MATCH (user:EndUser{name:'c'})-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material)
WHERE
    NOT((user)-[:BOUGHT]->(m))
    AND user <> someOtherUser
RETURN m

我们得到了预期的空结果:

关于密码的一些解释:

(user:EndUser{name:'b'})-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material) 部分首先匹配我们试图向其推荐 :Material 的用户以及 material 已购买 he/she 的用户,然后对于每个 material 我们正试图找到另一个 :EndUser 也有 :BOUGHT material。然后,对于他们每个人,我们 go-to 通过他们的 :BOUGHT 关系,并将这些 material 称为 m

然后 NOT((user)-[:BOUGHT]->(m)) 尝试确保用户(我们试图向其推荐)没有直接购买商品并且 user <> someOtherUser 部分检查用户和其他 :User 节点我们在处理过程中发现不是相同的节点(例如循环)。

如何在您的代码中使用它:

您通常会使用 parameters 作为所需的值(在此示例中为 name)。

python中的简单示例:

. . .

@staticmethod
def _create_recommendation_transaction(tx, name):
    result = tx.run(
    """
    MATCH (user:EndUser{name: $name })-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material)
    WHERE
       NOT((user)-[:BOUGHT]->(m))
       AND user <> someOtherUser
    RETURN m
    """, name=name)
 
. . .