Cypher UNION-如何应用于收集的列表



考虑以下UNION密码命令的使用:

MATCH (user:User)-[]-(org:Organization)
WHERE org.size > 100
RETURN collect({
user.name,
user.age
}) AS userList
UNION
MATCH (user:User)-[]-(family:Family)
WHERE family.mood = "Happy"
RETURN collect({
user.name,
user.age
}) AS userList

UNION不起作用,此查询仅返回来自第一个MATCH的用户。我怀疑这是因为collect语句,但是项目的设计需要收集数据。有没有办法创建集合的并集,或者在并集之后收集

除了1(返回有效的字典格式和2(使用CALL(neo4j密码的子查询(外,您的查询将正常工作。

RETURN  {
name: user.name,
age:  user.age
} AS userList

见以下示例:

CALL {MATCH (user:user{id:"some_id"}) 
RETURN {
id: user.id, 
age: user.age
}  AS userList
UNION
MATCH (user:user{id:"some_id2"}) 
RETURN  {
id: user.id, 
age: user.age
}  AS userList
} 
RETURN collect(userList) as userList
Result:
╒══════════════════════════════════════════════════════════╕
│"userList"                                                │
╞══════════════════════════════════════════════════════════╡
│[{"id":"some_id","age":null},{"id":"some_id2","age":null}]│
└──────────────────────────────────────────────────────────┘

我使用的是neo4j 4.4.3版

您可以使用APOC库的apoc.coll.union来创建两个列表的并集,如下所示:

MATCH (user:User)-[]-(org:Organization)
WHERE org.size > 100
WITH collect({
user.name,
user.age
}) AS userList1
MATCH (user:User)-[]-(family:Family)
WHERE family.mood = "Happy"
WITH userList1, collect({
user.name,
user.age
}) AS userList2
RETURN apoc.coll.union(userList1, userList2) AS userList

函数apoc.coll.union将不包括重复项,如果要包括重复项请使用apoc.coll.unionAll

最新更新