2014-10-29 81 views
2

我正在neo4j中进行一个简单的演示,我想根据订单使用推荐以及如何购买。我在这里创建了一个图表:http://console.neo4j.org/?id=jvqr95如何在Neo4j中简单推荐

基本上我有很多关系,如:

(o:Order)-[:INCLUDES]->(p:Product) 

一个订单可以有多个产品。

给出了具体的产品ID,我想寻找其他的产品,在盛装产品与给定的产品ID的订单,我想通过订单的产品在数量来订购吧。

我试过以下内容:

MATCH (p:Product)--(o)-[:INCLUDES]->(p2:Product)--(o2) 
WHERE p.name = "chocolate" 
RETURN p2, COUNT(DISTINCT o2) 

但这并没有给我我想要的结果。对于查询我有望获得chips回来计数2,但我只得到1

计数而对于follwing查询:

MATCH (p:Product)--(o)-[:INCLUDES]->(p2:Product)--(o2) 
WHERE p.name = "chips" 
RETURN p2, COUNT(DISTINCT o2) 

我期望能获得chocolateball放回原处每个人都有1的计数,但我没有得到任何回报。我错过了什么?

回答

4

你在最初的MATCH中匹配了太多东西。

MATCH (o:Order)-[:INCLUDES]->(p:Product { name:'ball' }) 
MATCH (o)-[:INCLUDES]->(p2:Product) 
WHERE p2 <> p 
MATCH (o2:Order)-[:INCLUDES]->(p2) 
RETURN p2.name AS Product, COUNT(o2) AS Count 
ORDER BY Count DESC 

英文:。“匹配的订单,其中包括特定产品对于这些订单,取得不属于最初的产品都包含产品对于这些产品,配上它们包含在订单返回产品名称以及包含在其中的订单数“。

http://console.neo4j.org/?id=q49sx6

http://console.neo4j.org/?id=uy3t9e

+2

真棒!我使用'p.name =“chips”'的原因是因为后来我想做同样的查询但是有多个产品。也就是说,我已经把产品x,y,z按顺序排列,其他人买了什么,买了这些产品。所以我正在考虑使用类似于:'WHERE p.name IN [“x”,“y”,“z”] AND NOT(p2.name IN [“x”,“y”,“z”]) '。无论哪种方式,非常感谢。 – 2014-10-29 08:08:10

+0

听起来不错。我只是使用速记版。 :) – 2014-10-29 17:48:57