Cypher - 返回聚合(计数或总和)大于 1 的行

问题描述 投票:0回答:1

新手和我有一张图表,其中“员工”在“零售商”工作,“客户”在“零售商”购物。客户进行的某些交易存在“争议”。我正在尝试找出与超过 1 家零售商合作的员工名单,其中交易已被标记为“有争议”

  • 版本 1 - 给出正确的结果(计数),但需要过滤

这是我写的内容,它给了我很好的结果,但也包含在 1 家商店工作的所有员工。 我想过滤掉在 1 家商店工作的员工。

MATCH (employees:Employee)-[worklocation:WORKS_AT]->(retailer:Retailer)
WITH employees, retailer,  COUNT(DISTINCT worklocation) AS Count_Worklocations  
  WHERE  (retailer)<-[:SHOPPED_AT {status : "Disputed"}]-(:Customer) 
RETURN employees.name, sum(Count_Worklocations) AS WORKPLACES
order by WORKPLACES DESC

结果:

╒═════════════════╤══════════╕
│employees.name   │WORKPLACES│
╞═════════════════╪══════════╡
│"Irvin Clayton"  │3         │
├─────────────────┼──────────┤
│"Ricky Bond"     │2         │
├─────────────────┼──────────┤
│"Carmen Dixon"   │2         │
├─────────────────┼──────────┤
│"Bryon Ramos"    │2         │
├─────────────────┼──────────┤
│"Seth Snow"      │1         │
├─────────────────┼──────────┤
│"Donny Pollard"  │1         │
├─────────────────┼──────────┤
│"Isaac Mendez"   │1         │
├─────────────────┼──────────┤
│"Sonny Horn"     │1         │
├─────────────────┼──────────┤
│"Roxie Aguilar"  │1         │
├─────────────────┼──────────┤
│"Letha Hardy"    │1         │
├─────────────────┼──────────┤
│"Don Howe"       │1         │
├─────────────────┼──────────┤
│"Kelvin Haney"   │1         │
├─────────────────┼──────────┤
│"Denver Glover"  │1         │
├─────────────────┼──────────┤
│"Steven Carney"  │1         │
├─────────────────┼──────────┤
│"Kraig Hensley"  │1         │
├─────────────────┼──────────┤
│"Andrea Gallegos"│1         │
├─────────────────┼──────────┤
│"Lina Rivers"    │1         │
├─────────────────┼──────────┤
│"Deidre Duke"    │1         │
├─────────────────┼──────────┤
│"Jerold Mccarthy"│1         │
├─────────────────┼──────────┤
│"Malik Copeland" │1         │
└─────────────────┴──────────┘
  • 版本#2 - 使用集合但给出错误的计数

MATCH(员工:员工)-[员工:WORKS_AT]->(零售商) 使用员工.name AS

Employee Name
,收集(不同的零售商.名称)AS
Retailer Name
,计数(零售商.名称)作为cnt 其中cnt>1 MATCH (员工:员工)-[员工:WORKS_AT]->(零售商),(客户:客户)- [交易:SHOPPED_AT]->(零售商) WHERE transaction.status =“有争议” 返回不同
Employee Name
Retailer Name

这给了我 -

╒═══════════════╤════════════════════╕
│Employee Name  │Retailer Name       │
╞═══════════════╪════════════════════╡
│"Seth Snow"    │["Gap", "Target"]   │
├───────────────┼────────────────────┤
│"Roxie Aguilar"│["Gap", "BestBuy"]  │
├───────────────┼────────────────────┤
│"Ricky Bond"   │["BestBuy", "Nordstr│
│               │om"]                │
├───────────────┼────────────────────┤
│"Carmen Dixon" │["Coach", "Nordstrom│
│               │"]                  │
├───────────────┼────────────────────┤
│"Bryon Ramos"  │["Coach", "Foot Lock│
│               │er"]                │
├───────────────┼────────────────────┤
│"Irvin Clayton"│["Express", "Kohls",│
│               │ "Nordstrom"]       │
└───────────────┴────────────────────┘

但是,这是错误的,因为零售商“Gap”没有报告有争议的交易,因此 Roxie Aguilar 和 Seth Snow 只在 1 家报告了“争议”交易的商店工作过,而且他们的名字不应该出现在那里。

cypher aggregation
1个回答
0
投票

您可以通过在第一个

EXISTS
中使用
MATCH
子查询来获取您需要的内容,并且仅包括有争议的零售商:

MATCH (employee:Employee)-[:WORKS_AT]->(retailer:Retailer)
WHERE EXISTS { (retailer)<-[:SHOPPED_AT {status: "Disputed"}]-(:Customer) } 
WITH employee, collect(retailer) AS retailers, count(*) AS count WHERE count > 1
RETURN employee.name AS `Employee Name`, 
      [retailer IN retailers | retailer.name] AS `Retailer Names`

此返回结果列如第二个示例中所示。

© www.soinside.com 2019 - 2024. All rights reserved.