Neo4j 如何使用Cypher查询推荐

Neo4j 如何使用Cypher查询推荐,neo4j,cypher,Neo4j,Cypher,我正试图通过Cypher查询书籍节点以获得推荐。 我想为A:User推荐A:Book和C:Book。 很抱歉,我需要一些图表来解释这个问题,但我无法上传图表图像,因为我的lepletion缺少上传功能。 我在下面写下了这个问题 match (u1:User{uid:'1003'})-->(o1:Order)-->(b1:Book)<--(o2:Order) <--(u2:User)-->(o3:Order)-->(b2:Book) return b

我正试图通过Cypher查询书籍节点以获得推荐。
我想为A:User推荐A:Book和C:Book。
很抱歉,我需要一些图表来解释这个问题,但我无法上传图表图像,因为我的lepletion缺少上传功能。
我在下面写下了这个问题

match (u1:User{uid:'1003'})-->(o1:Order)-->(b1:Book)<--(o2:Order)
      <--(u2:User)-->(o3:Order)-->(b2:Book)
return b2
match(u1:User{uid:'1003})-->(o1:Order)-->(b1:Book)(b2:Book)
返回b2
此查询返回所有图书(A、B、C、D)的唯一性。
我希望只返回A:Book和C:Book。
这是4J的规范吗?
如何获得预期回报?谢谢大家

环境: Neo4j版本v2.0.0-RC1
使用带有RESTAPI的Neo4j服务器时,如果没有示例图,很难说为什么您在期望其他东西时得到了一些东西。您可以通过包含一个生成所述图形的create语句,或者通过在Neo4j控制台中创建并将链接放入问题中,来共享示例图形。下面是后者的一个示例:console.neo4j.org/r/fnnz6b

同时,您可能需要声明模式中关系的类型。如果一个
:用户
有多种类型的传出关系,那么您将根据另一端节点的标签排除这些其他路径,这比只遍历正确的关系要低得多

在我看来,
(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

此外,如果每个订单只包含一本书,那么您可以尝试不带订单的建模,只需
(:User)-[:buyed]->(:book)

如果没有示例图,很难说为什么您在期望其他东西的时候得到了一些东西。您可以通过包含一个生成所述图形的create语句,或者通过在Neo4j控制台中创建并将链接放入问题中,来共享示例图形。下面是后者的一个示例:console.neo4j.org/r/fnnz6b

同时,您可能需要声明模式中关系的类型。如果一个
:用户
有多种类型的传出关系,那么您将根据另一端节点的标签排除这些其他路径,这比只遍历正确的关系要低得多

在我看来,
(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

此外,如果每个订单只包含一本书,您可以尝试无订单建模,只需
(:User)-[:buyed]>(:book)

您可以通过包含生成所述图的create语句,或者通过在Neo4j控制台中创建它并将链接放入问题中,来共享示例图。下面是后者的一个例子:感谢您立即回复。我不知道这个方便的网站。我将很快尝试共享一些图表。我的图表就是这个链接。用户可以一次性购买一本书。这意味着order只能包含一本书。您可以通过包含生成所述图的create语句,或者通过在Neo4j控制台中创建示例图并将链接放入问题中,来共享示例图。下面是后者的一个例子:感谢您立即回复。我不知道这个方便的网站。我将很快尝试共享一些图表。我的图表就是这个链接。用户可以一次性购买一本书。这意味着订单只能包含一本书。谢谢您的回复。我不知道这个方便的网站。我的图表就是这个链接。用户可以一次性购买一本书。这意味着订单只能包含一本书。谢谢你教我一些技巧。我已经正确地得到了预期的结果,并且我理解为什么我的第一个查询返回了预期的其他结果。在这种情况下,我很难想象cypher的行为,所以我需要更多地了解cypher。谢谢你的回复。我不知道这个方便的网站。我的图表就是这个链接。用户可以一次性购买一本书。这意味着订单只能包含一本书。谢谢你教我一些技巧。我已经正确地得到了预期的结果,并且我理解为什么我的第一个查询返回了预期的其他结果。在这种情况下,我很难想象cypher的行为,所以我需要更多地了解cypher。谢谢