Neo4j查询2个关系,并计算2个关系的聚合函数

enyaitl3  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(359)

我有这样的数据模型:

带节点:

  • 委托方
  • 供应商
  • 产品名称

而关系:

  • 客户-推荐{资格认证} -〉产品
  • 客户-购买-〉产品
  • 供应商-销售-〉产品

而我正试图得到最畅销的产品与平均资格,我实际上尝试这个查询:

MATCH (p:Product)<-[b:Buy]-(c:Client)
CALL{
    WITH c, p
    MATCH (c)-[r:Recommend]->(p)
    RETURN avg(r.qualification) as average_qualification
} 
RETURN p, c, count(b) as qty, average_qualification 
ORDER BY qty DESC

但是,查询会针对每个客户端的每个average_qualification返回一行(类似于以下内容):

但我希望按产品分组,因此需要合并产品相同的行,例如,行1和4将合并,平均资格将是产品的平均资格(不除以客户资格)。

kokeuurv

kokeuurv1#

您可以执行以下操作:

MATCH (p:Product)<-[b:Buy]-(:Client)
WITH p, count(b) AS qty
MATCH (:Client)-[r:Recommend]->(p)
RETURN p, qty, avg(r.qualification) AS average_qualification
ORDER BY qty DESC

哪用这个样本数据:

MERGE (a:Client{name: 'A'})
MERGE (b:Client{name: 'B'})
MERGE (c:Client{name: 'C'})
MERGE (d:Client{name: 'D'})
MERGE (e:Client{name: 'E'})
MERGE (f:Vendor{key: 2})
MERGE (g:Vendor{key: 3})
MERGE (h:Vendor{key: 4})
MERGE (j:Product{key: 5})
MERGE (i:Product{key: 6})
MERGE (k:Product{key: 7})
MERGE (l:Product{key: 8})
MERGE (m:Product{key: 9})

MERGE (a)-[:Recommend{qualification: 4}]-(j)
MERGE (a)-[:Recommend{qualification: 4}]-(k)
MERGE (c)-[:Recommend{qualification: 3}]-(i)
MERGE (e)-[:Recommend{qualification: 3}]-(j)
MERGE (a)-[:Buy]-(k)
MERGE (a)-[:Buy]-(j)
MERGE (b)-[:Buy]-(l)
MERGE (d)-[:Buy]-(m)
MERGE (c)-[:Buy]-(i)
MERGE (d)-[:Buy]-(i)
MERGE (e)-[:Buy]-(i)
MERGE (e)-[:Buy]-(j)
MERGE (f)-[:Sell]-(i)
MERGE (f)-[:Sell]-(j)
MERGE (g)-[:Sell]-(k)
MERGE (h)-[:Sell]-(l)
MERGE (h)-[:Sell]-(m)

将返回:

╒═════════╤═════╤═══════════════════════╕
│"p"      │"qty"│"average_qualification"│
╞═════════╪═════╪═══════════════════════╡
│{"key":6}│3    │3.0                    │
├─────────┼─────┼───────────────────────┤
│{"key":5}│2    │3.5                    │
├─────────┼─────┼───────────────────────┤
│{"key":7}│1    │4.0                    │
└─────────┴─────┴───────────────────────┘

为了理解这个解决方案,以及为什么它与您的解决方案不同,我建议您阅读有关cardinality的概念。
没有必要同时计算[:buy]和(:Client),只保留其中一个,并使用count,这样我们就可以在完成第一个MATCH时得到一个产品列表,而不是客户列表;第二个MATCH也是如此,我们在r.qualification上使用avg,这样我们就可以维护产品列表,而不是推荐列表。

相关问题