【问题标题】:neo4j count nodes performance on 200K nodes and 450K relationsneo4j 在 200K 节点和 450K 关系上计算节点性能
【发布时间】:2012-08-02 16:52:10
【问题描述】:

我们正在开发一个基于 的应用程序,其中包含大约 200k 个节点,每个节点都有一个类似 type='user'type='company' 的属性来表示一个特定的实体我们的应用程序。我们需要获取图中特定类型的所有节点的计数。

我们为每个实体创建了一个索引,例如 userscompanies,其中包含该属性的节点。所以在users 索引中存在130K 个节点,其余的在companies

使用 Cypher,我们可以像这样查询。

START u=node:users('id:*')
RETURN count(u)

结果是

Returned 1 row.Query took 4080ms

服务器配置为默认值,稍作调整,但 4 秒也满足我们的需要。认为数据库会在 1 个月内增长 20K,所以我们非常非常需要这个查询执行。

有没有其他方法可以做到这一点,也许使用 Gremlin,或者使用其他一些服务器插件? 我会缓存这些结果,但我想知道是否可以对此进行调整。

非常感谢,抱歉我的英语不好。

【问题讨论】:

  • Neo4j 1.8.M06,3GB 内存,SSD 120GB
  • 您是否尝试过 return count(*) 并测量了第一个或后续查询?
  • 我做到了,使用 * 或某些字段似乎不会改变响应时间。我的第一次跑步是 8.52 秒。当 lucene/neo 缓存查询时,响应时间下降到 4.08 秒

标签: neo4j php indexing neo4j gremlin cypher


【解决方案1】:

最后,使用 Gremlin 而不是 Cypher,我找到了解决方案。

g.getRawGraph().index().forNodes('NAME_OF_USERS_INDEX').query(
    new org.neo4j.index.lucene.QueryContext('*')
).size()

此方法使用 lucene 索引来获取“近似”行。

再次感谢大家。

【讨论】:

    【解决方案2】:

    嗯, 这实际上是关于 Lucene 索引的性能。如果您大部分时间只需要这个单一查询,为什么不使用某个节点上某个节点上的总数更新一个整数,并且可能与索引插入一起更新它,为了更好的措施,每晚使用上面的查询运行更新就可以了?

    【讨论】:

    • 我不知道Lucene索引是否是问题的根源。这就像一个方面查询的结果,或者得到q=*:*的总行数。
    【解决方案3】:

    您可以将特定节点上的属性与此类节点的数量保持同步,其中更新由写锁保护:

    交易 tx = db.beginTx(); 尝试 { ... ... tx.acquireWriteLock(countingNode); countNode.setProperty("user_count", ((整数)countingNode.getProperty("user_count"))+1); tx.成功(); } 最后 { tx.finish(); }

    【讨论】:

    • 谢谢,这是一个实现一些缓存的解决方案。我不相信这个查询如此复杂需要 4 秒
    • 你确定你运行了几次测试,如果不冷运行你能看到一些不同的性能吗?
    【解决方案4】:

    如果您想要获得最佳性能,请不要将您的实体类别建模为节点上的属性。相反,这样做:

    company1-[:IS_ENTITY]->companyentity

    或者如果您使用的是 2.0

    公司 1:公司

    顺便说一句,第二个还允许您在单独的后台线程中自动更新索引,这是 imo 2.0 的最佳新功能之一

    第一种方法也应该证明更有效,因为通常进行“跳跃”比从节点读取属性花费的时间更少。但是,它确实需要您为实体创建单独的索引。

    您的查询将如下所示:

    v2.0

    MATCH company:COMPANY
    RETURN count(company)
    

    v1.9

    START entity=node:entityindex(value='company')
    MATCH company-[:IS_ENTITIY]->entity
    RETURN count(company)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多