如何使用Cypher查询推荐

时间:2013-11-29 08:02:38

标签: neo4j cypher

我正在尝试查询Book节点以获得Cypher的推荐 我想推荐A:Book和C:Book for A:User 对不起,我需要一些图表来解释这个问题,但由于我的功能缺乏上传功能,我无法提升图形图像。
我在下面写了一下查询。

match (u1:User{uid:'1003'})-->(o1:Order)-->(b1:Book)<--(o2:Order)
      <--(u2:User)-->(o3:Order)-->(b2:Book)
return b2

此查询返回所有书籍(A,B,C,D)的dispite cypher的唯一性 我希望只返回A:Book和C:Book 这种行为是Neo4j的规范吗? 我如何获得预期的回报?谢谢,大家。

环境: Neo4j ver.v2.0.0-RC1 将Neo4j服务器与REST API一起使用

1 个答案:

答案 0 :(得分:1)

如果没有样本图表,很难说出为什么当你期待别的东西时你会得到回报。您可以通过包含将生成所述图形的create语句,或通过在Neo4j控制台中创建它并将链接放在您的问题中来共享示例图形。以下是后者的示例:console.neo4j.org/r/fnnz6b

与此同时,您可能希望声明模式中关系的类型。如果:User具有多种类型的传出关系,您将根据另一端节点的标签排除其他路径,这比仅仅遍历正确的关系开始效率低得多。

在我看来,不清楚(u:User)-->(o:Order)-->(b:Book)是否意味着用户有一个或多个订单,每个订单包含一本或多本书;或者仅仅意味着用户订购了一本书。如果您可以共享样本,希望这也很清楚。

修改
很好,所以看图:你得到B和D回来因为买B的其他人也买了D,而买D的其他人也买了B,这是你的推荐标准。您可以在WHERE子句中添加过滤器,以排除用户已购买的图书,例如

WHERE NOT (u1)-[:BUY]->()-[:CONTAINS]->(b2)

这会给你A,C,C,因为有两个匹配的C路径。为C得到两个结果项可能并不重要,所以你可以限制返回只给出不同的值

RETURN DISTINCT(b2)

或通过将每个结果的匹配路径计算为“推荐得分”

来对返回值进行分组
RETURN b2, COUNT(b2) as score

此外,如果每个订单只有[CONTAINS]本书,您可以尝试无订单建模,只需(:User)-[:BOUGHT]->(:Book)