Cypher 将来自不同表的信息连接到一个表中

Cypher join informations from different tables into a single one

我是 cypher 的新手,我正在为这个问题而苦恼:

我有这两个问题

MATCH (u:UserNode)-[:PROMOTER_OF*1..]->(c:UserNode)
WHERE u.promoterActualRole IN ["GOLD","RUBY","SAPPHIRE","BRONZE","EMERALD", "DIAMOND"]
    AND datetime(c.promoterStartActivity) >= datetime("2021-02-01T00:00:00Z") 
    AND datetime(c.promoterStartActivity)<= datetime("2021-05-31T23:59:59Z")
    AND c.promoterEnabled = true
    AND u.firstName="Gianvito"
WITH distinct u as user, count(c) as num_promoter
WHERE num_promoter >= 150
RETURN user.firstName as name, user.email as email, num_promoter

这将 return 我 table 这样的

name email num_promoter
Gianvito gianvito@email.com 1475

MATCH (u:UserNode)-[:PROMOTER_OF*1..]->(c:UserNode)
WHERE u.promoterActualRole IN ["GOLD","RUBY","SAPPHIRE","BRONZE","EMERALD", "DIAMOND"]
    AND datetime(c.subscriptionDate) >= datetime("2021-02-01T00:00:00Z") 
    AND datetime(c.subscriptionDate)<= datetime("2021-05-31T23:59:59Z")
    AND c.kycStatus = "OK"
    AND u.firstName="Gianvito"
WITH distinct u as user, count(c) as num_swaggy
WHERE num_swaggy >= 1
RETURN user.firstName as name, user.email as email , num_swaggy
name email num_swaggy
Gianvito gianvito@email.com 1820

我想将这两个结果合并为一个 table。 我正在做一个联合,但通过这种方式,我只能创建一个 table,其中包含两个不同的行,这些行具有重复的公共信息和“null”作为非现值。 想得到这样的table怎么办?

name email num_promoter num_swaggy
Gianvito gianvito@email.com 1475 1820

如果您使用的是 Neo4j 4.x 或更高版本,您可以在子查询中 UNION 查询结果,并在其外部执行 sum() 以将结果放入每个用户的一行中:

CALL {
 MATCH (u:UserNode)-[:PROMOTER_OF*1..]->(c:UserNode)
 WHERE u.promoterActualRole IN ["GOLD","RUBY","SAPPHIRE","BRONZE","EMERALD", "DIAMOND"]
    AND datetime(c.promoterStartActivity) >= datetime("2021-02-01T00:00:00Z") 
    AND datetime(c.promoterStartActivity)<= datetime("2021-05-31T23:59:59Z")
    AND c.promoterEnabled = true
    AND u.firstName="Gianvito"
 WITH u as user, count(c) as num_promoter
 WHERE num_promoter >= 150
 RETURN user, num_promoter, 0 as num_swaggy
 
 UNION
 
 MATCH (u:UserNode)-[:PROMOTER_OF*1..]->(c:UserNode)
 WHERE u.promoterActualRole IN ["GOLD","RUBY","SAPPHIRE","BRONZE","EMERALD", "DIAMOND"]
    AND datetime(c.subscriptionDate) >= datetime("2021-02-01T00:00:00Z") 
    AND datetime(c.subscriptionDate)<= datetime("2021-05-31T23:59:59Z")
    AND c.kycStatus = "OK"
    AND u.firstName="Gianvito"
 WITH u as user, count(c) as num_swaggy
 WHERE num_swaggy >= 1
 RETURN user, 0 as num_promoter, num_swaggy
}

WITH user, sum(num_promoter) as num_promoter, sum(num_swaggy) as num_swaggy
RETURN user.firstName as name, user.email as email , num_promoter, num_swaggy

此外,您在执行任何聚合时不需要使用 DISTINCT,因为聚合后分组键将自动变得不同。