返回与另一个节点关系最密切的节点

时间:2015-10-20 12:26:25

标签: neo4j cypher

首先,我是neo4j和cypher的新手,所以如果这很简单,我很抱歉:)

我面临一个我无法解决的问题,但我会尝试解释我必须做的事情。

我有一个包含一些客户的图表,这些客户已经发布了一些包含产品的订单。这意味着图表设置如下:

(c:Customer)-[r:PURCHASED]->(o:Order)-[f:ORDERS]->(p:Product)

以下是我必须处理的图表的表示(这只是一个示例,而不是实际图表): enter image description here

我必须找到客户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”的客户相同的产品。

显然我做错了,我似乎无法弄清楚如何获得正确的结果。我希望有人能够帮助我

2 个答案:

答案 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 BYLIMIT来执行您想要的操作:

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属性排序结果,并仅返回第一个,因此产品相关的产品最多。

如果这不是您所需要的(我不太了解您的问题)请在评论中说出来,我会更新我的答案。