考虑以下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
。