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,因为聚合后分组键将自动变得不同。
我是 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 | 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 | num_swaggy | |
---|---|---|
Gianvito | gianvito@email.com | 1820 |
我想将这两个结果合并为一个 table。 我正在做一个联合,但通过这种方式,我只能创建一个 table,其中包含两个不同的行,这些行具有重复的公共信息和“null”作为非现值。 想得到这样的table怎么办?
name | 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,因为聚合后分组键将自动变得不同。