我能够创建材料与使用下面代码购买它的最终用户之间的关系,但现在我想找到非enduser购买的材料,使用共同的材料,并在图中显示为推荐引擎。假设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子句,但它显示了所有的产品。
发布于 2020-09-14 12:38:21
以下是我如何处理这个问题的方法。
假设下面的图表(基于您给出的场景):

向用户b推荐材料:
MATCH (user:EndUser{name:'b'})-[:BOUGHT]->(:Material)<-[:BOUGHT]-(someOtherUser:EndUser)-[:BOUGHT]->(m:Material)
WHERE
NOT((user)-[:BOUGHT]->(m))
AND user <> someOtherUser
RETURN m结果是:

同样,如果我们尝试使用用户-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给的用户和他/她购买的goto材料,然后对于每一个材料,我们都试图找到另一个同时拥有:BOUGHT材料的:EndUser。然后,对于他们中的每一个人,我们也会通过他们的:BOUGHT关系,把我们找到的这些材料称为m。
然后,NOT((user)-[:BOUGHT]->(m))试图确保用户(我们试图推荐)没有直接购买该项目,并且user <> someOtherUser部分检查用户和我们在处理过程中找到的其他:User节点不是相同的节点(例如循环)。
如何在代码中使用它:
您通常会将参数用于所需的值(在本例中为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)
. . .https://stackoverflow.com/questions/63883504
复制相似问题