首先,我是neo4j和cypher的新手,所以如果这很简单,我很抱歉:)
我面临一个我无法解决的问题,但我会尝试解释我必须做的事情。
我有一个包含一些客户的图表,这些客户已经发布了一些包含产品的订单。这意味着图表设置如下:
(c:Customer)-[r:PURCHASED]->(o:Order)-[f:ORDERS]->(p:Product)
以下是我必须处理的图表的表示(这只是一个示例,而不是实际图表):
我必须找到客户C,以及他订购的所有产品(p1-p6),这不是问题。 我需要做的是找到订购了大部分相同产品的客户,并输出该客户和产品。 这意味着客户c2已经订购了3个与客户c相同的产品,而c3只订购了2个相同的产品。那我想要c2。
这是我到目前为止所拥有的
MATCH (c:Customer {customerID: "C"})-[r:PURCHASED]->(o:Order)-
[f:ORDERS]->(p:Product),
(p)<-[f1:ORDERS]-(o1:Order)<-[r1:PURCHASED]-(c1:Customer)
WITH c1 AS c1, count(p) AS count, p AS p
WHERE count > 4
RETURN c1,p
这并没有真正给我我想要的东西。从我把数量&gt; 4,我得到1个客户和1个产品。该产品与客户有3个f1:ORDERS关系。我想要一个客户(或更多客户)购买了超过4个与ID为“C”的客户相同的产品。
显然我做错了,我似乎无法弄清楚如何获得正确的结果。我希望有人能够帮助我
答案 0 :(得分:1)
这应该适合你:
MATCH
(c:Customer { customerID: "C" })-[r:PURCHASED]->(o:Order)-[f:ORDERS]->(p:Product),
(p)<-[f1:ORDERS]-(o1:Order)<-[r1:PURCHASED]-(c1:Customer)
WITH c1, COLLECT(DISTINCT p) AS ps
RETURN c1, ps
ORDER BY LENGTH(ps) DESC
LIMIT 1;
此查询为每个c1
客户汇总该客户购买的与c
购买的产品相同的不同产品。然后,它按照多少产品的共同点对这些客户进行排序(按降序排列);并返回顶级客户,以及他的共享产品集合。
Here is a console显示样本数据的结果。
答案 1 :(得分:0)
您可以使用ORDER BY
和LIMIT
来执行您想要的操作:
MATCH (c:Customer {customerID: "C"})-[r:PURCHASED]->(o:Order)-
[f:ORDERS]->(p:Product),
(p)<-[f1:ORDERS]-(o1:Order)<-[r1:PURCHASED]-(c1:Customer)
WITH c1, count(p) AS count, p
ORDER BY count
RETURN c1, p LIMIT 1
这将按count属性排序结果,并仅返回第一个,因此产品相关的产品最多。
如果这不是您所需要的(我不太了解您的问题)请在评论中说出来,我会更新我的答案。