【问题标题】:Get total count and paginated result in one cypher query (neo4j)在一个密码查询中获取总计数和分页结果(neo4j)
【发布时间】:2019-01-17 10:03:41
【问题描述】:

我正在编写一个 api 来返回 neo4j 数据。就我而言,我得到所有节点匹配。 API 接受 userId、limit 和 offset 并返回匹配该条件的数据列表。

我找到了一个解决方案Cypher to return total node count as well as a limited set,但它已经很老了。不确定这是否仍然是最好的方法。

性能与触发 2 个单独的查询相同,至少其中一个会在几次运行后被 neo4j 缓存。

Match(u:WorkstationUser {id: "alw:44807"})-[:HAS_ACCESS_TO]->(p) return distinct(p) skip 0 limit 10 

Match(u:WorkstationUser {id: "alw:44807"})-[:HAS_ACCESS_TO]->(p) return count(distinct(p))

我希望结果类似于

{
  items: [ {},  {}], # query 1
  total: 100,   # query 2
  limit: 10,  # can get from input
  skip: 0    # can get from input
}

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    这在一定程度上取决于您需要从要计数的节点获得多少信息,以及是否需要获得不同的结果。

    如果不需要不同的结果,并且您不需要对另一端的关系或节点进行任何额外的过滤(不过滤节点的标签或属性),那么您可以使用 size( ) 的模式,它将使用节点上存在的关系的程度信息,这更有效,因为您不必实际扩展关系:

    MATCH (u:WorkstationUser {id: "alw:44807"})
    WITH u, size((u)-[:HAS_ACCESS_TO]->(p)) as total
    MATCH (u)-[:HAS_ACCESS_TO]->(p) 
    RETURN p, total
    SKIP 0 LIMIT 10 
    

    但是,如果需要不同的结果,或者您需要按标签或属性过滤节点,则必须展开所有结果以获得总数。如果没有太多结果(数百万或数十亿),那么您可以收集不同的节点,获取集合的大小,然后 UNWIND 结果和页面:

    MATCH (:WorkstationUser {id: "alw:44807"})-[:HAS_ACCESS_TO]->(p)
    WITH collect(DISTINCT p) as pList
    WITH pList, size(pList) as total
    UNWIND pList as p
    RETURN p, total
    SKIP 0 LIMIT 10 
    

    【讨论】:

    • 如果仅仅因为 SKIP 设置得太高而没有返回结果,则不返回“total”。有没有办法解决这个问题?
    • 我不知道。跳过可用行不会给您任何行,并且您丢失了沿途带来的任何变量(因为总数保留在行中)。
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2015-10-23
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2020-07-24
    • 2023-03-04
    • 2021-05-26
    相关资源
    最近更新 更多