【问题标题】:Neo4j Get nodes and node count simultaneouslyNeo4j 同时获取节点和节点数
【发布时间】:2016-06-25 16:53:39
【问题描述】:

我对 Neo4j 比较陌生,所以如果这个问题有明显的答案,我深表歉意。我有一个数据库,其中包含用户节点、帐户节点和它们之间的 ASSIGNED_TO 关系。我有一个查询(如下)来获取用户和分配的帐户,但我也想获取在同一查询中找到的用户的计数,而不管 LIMIT/SKIP 结果如何。似乎正在发生的事情是用户计数基于 OPTIONAL MATCH 结果,而不是 MATCH 查询的结果。

我在数据库中有 3 个用户和 3 个帐户,其中 2 个用户分配给 2 个帐户,而一个用户只分配给一个帐户。

这是查询:

匹配(用户:用户) 与用户 可选匹配(用户)-[分配:ASSIGNED_TO]-(帐户:帐户) RETURN user, count(user) as userCount, collect(account) as accounts 跳过 0 限制 25

这是结果:

用户 userCount 帐户 {id: 2} 1 [{id: 2}] {id: 1} 2 [{id: 2}, {id: 1}] {id: 3} 2 [{id: 1}, {id: 3}]

我希望所有行的 userCount 值为 3。如果我将 'count(user)' 更改为 'count(DISTINCT user)' 我会得到 1 的 userCount。如果可能,我想避免运行 2 个单独的查询。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    收集-展开对应该可以解决问题

    MATCH (user:User)
    WITH collect(user) as users, count(DISTINCT user) as userCount
    UNWIND users as user
    OPTIONAL MATCH (user)-[assigned:ASSIGNED_TO]-(account:Account)
    RETURN user, userCount, collect(account) as accounts
    SKIP 0 LIMIT 25
    

    【讨论】:

    • 完美!正是我需要的。谢谢。
    【解决方案2】:
    // Get user count
    MATCH (user:User) WITH count(user) as userCount
    // Get user
    MATCH (user:User)
    // To optimize a query, first apply the pagination
    WITH user, userCount SKIP 0 LIMIT 25
    // The other part of query
    OPTIONAL MATCH (user)-[assigned:assigned_to]-(account:Account)
    RETURN user, 
           userCount, 
           collect(distinct account) as accounts
    

    【讨论】:

    • 那是我的愚蠢。在这种情况下,将其分解为两个查询显然更好。不错的答案!
    • 这似乎具有相同数量的数据库命中和执行时间。它如何更有效?我只用了几个星期 neo4j,所以请原谅我的无知。
    • 3.0.如果我要使用这个答案,我是否不必为每个 MATCH 查询重现 WHERE 子句?
    • 在哪里应用分页会有所不同
    • 我似乎找不到使用 WHERE 子句获得相同结果的方法,除非我将 WHERE 放在两个 MATCH 语句之后。如果需要,这与运行两个单独的查询对数据库的影响不同吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多