繁体   English   中英

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

[英]Return nodes with most relationship to another node

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

我面临一个我无法解决的问题,但是我将尽力解释我必须做的事情。

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

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

这是我必须处理的图形的表示(这只是一个示例,而不是实际的图形): 在此处输入图片说明

我必须找到客户C及其订购的所有产品(p1-p6),这不是问题。 我需要做的是找到已订购大多数相同产品的客户,然后输出该客户和产品。 这意味着与仅订购2个相同商品的c3相比,顾客c2已订购了3个与顾客c相同的产品。 那我要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

这并没有真正给我我想要的东西。 自从我输入count> 4以来,我得到了1个客户和1个产品。 该产品与客户具有3 f1:ORDERS关系。 我想要一个(或多个)与ID为“ C”的客户购买了4种以上相同产品的客户。

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

这应该为您工作:

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购买产品相同的独特产品。 然后,按共有多少个产品(按降序排列)对这些客户进行排序; 并返回顶级客户以及他的共享产品集合。

这是一个控制台 ,显示带有示例数据的结果。

您可以使用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属性对结果进行排序,并且仅返回第一个,因此与大多数产品相关的那个。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM