限制union cypher查询的结果

时间:2015-06-12 16:05:34

标签: neo4j cypher

我们假设我们有来自文档的示例查询:

MATCH (n:Actor)
RETURN n.name AS name
UNION
MATCH (n:Movie)
RETURN n.title AS name

我知道如果我这样做:

MATCH (n:Actor)
RETURN n.name AS name
LIMIT 5
UNION
MATCH (n:Movie)
RETURN n.title AS name
LIMIT 5

我可以将每个子查询的返回结果减少到5.如何限制联合查询的总结果?

3 个答案:

答案 0 :(得分:2)

这还不可能,但已经有open neo4j issue请求能够进行后UNION处理,其中包括您所询问的内容。如果您支持解决该问题,可以对该neo4j问题添加评论。

答案 1 :(得分:0)

这可以使用UNION后处理来完成,方法是使用COLLECT函数和UNWIND子句重写查询。

首先,我们将结果的列转换为映射(结构,哈希,字典),以保留其结构。对于每个部分查询,我们使用COLLECT将这些映射聚合到一个列表中,这也将我们的行计数(基数)减少为以下MATCH的一(1)。列表的组合是一个简单的列表,用“ +”运算符进行连接。

一旦有了完整的列表,我们将使用UNWIND将其转换回地图行。之后,我们使用WITH子句再次将地图解构为列,并执行诸如排序,分页,过滤或任何其他聚合或操作之类的操作。

重写后的查询如下:

MATCH (n:Actor)
with collect ({name: n.title}) as row

MATCH (n:Movie)
with row + collect({name: n.title}) as rows

unwind rows as row
with row.name as name
return name LIMIT 5

答案 2 :(得分:0)

这在 4.0.0 中是可能的

CALL {
  MATCH (p:Person) RETURN p 
  UNION
  MATCH (p:Person) RETURN p 
}
RETURN p.name, p.age ORDER BY p.name

在此处详细了解联合后处理https://neo4j.com/docs/cypher-manual/4.0/clauses/call-subquery/