Neo4j中极慢的加权边缘查询

Neo4j中极慢的加权边缘查询,neo4j,Neo4j,我有一个大约120万个节点的图,它们之间大约有385万个关系。我需要找到顶部x加权边-也就是说,a,b,n的顶部x元组,其中a和b是唯一的顶点对,n是它们之间的连接数。我目前通过以下密码查询获取此数据: MATCH (n)-[r]->(x) WITH n, x, count(r) as weight ORDER BY weight DESC LIMIT 50 RETURN n.screen_name, r.screen_name, weight; 这个查询运行大约需要25秒,这对于我

我有一个大约120万个节点的图,它们之间大约有385万个关系。我需要找到顶部x加权边-也就是说,a,b,n的顶部x元组,其中a和b是唯一的顶点对,n是它们之间的连接数。我目前通过以下密码查询获取此数据:

MATCH (n)-[r]->(x)
WITH n, x, count(r) as weight 
ORDER BY weight DESC 
LIMIT 50
RETURN n.screen_name, r.screen_name, weight;
这个查询运行大约需要25秒,这对于我的需要来说太慢了。我使用探查器运行了查询,它返回以下内容:

ColumnFilter(0)
  |
  +Extract
    |
    +ColumnFilter(1)
      |
      +Top
        |
        +EagerAggregation
          |
          +TraversalMatcher

+------------------+---------+---------+-------------+------------------------------------------------------------------------------------------------+
|         Operator |    Rows |  DbHits | Identifiers |                                                                                          Other |
+------------------+---------+---------+-------------+------------------------------------------------------------------------------------------------+
|  ColumnFilter(0) |      50 |       0 |             |                                                      keep columns n.twitter, x.twitter, weight |
|          Extract |      50 |     200 |             |                                                                           n.twitter, x.twitter |
|  ColumnFilter(1) |      50 |       0 |             |                                                                      keep columns n, x, weight |
|              Top |      50 |       0 |             | {  AUTOINT0}; Cached(  INTERNAL_AGGREGATE01a74d75-74df-42f8-adc9-9a58163257d4 of type Integer) |
| EagerAggregation | 3292734 |       0 |             |                                                                                           n, x |
| TraversalMatcher | 3843717 | 6245164 |             |                                                                                        x, r, x |
+------------------+---------+---------+-------------+------------------------------------------------------------------------------------------------+
那么,我的问题是:

1。我的期望值是否偏离了,这是不是会很慢?这在功能上是一个映射/减少问题,但这不是一个很大的数据集,只是测试数据。真实的东西会有更多(但可以通过关系属性进行过滤;我正在处理一个具有代表性的示例)

2。我该怎么做才能让它运行得更快呢?我曾考虑过使用start语句,但似乎没有帮助。事实上,这似乎让事情变得更糟

3。我在这里不知道什么,我到哪里去发现我不知道呢?

谢谢


Chris

您在第一条语句中点击了数据库
6245164
MATCH(n)-[r]>(x)

看起来您试图做的是一个图形全局查询——也就是说,您试图在整个图形上运行查询。这样做并没有利用索引来减少对数据库的点击次数

为了在您需要的性能级别上实现这一点,可能需要一个非托管扩展

此外,这也是了解非托管扩展的一个很好的社区资源:

这里的方法是创建一个restapi方法来扩展Neo4j服务器。这需要一些使用Java编程的经验


或者,您可以运行一个迭代密码查询,更新
(n)
(x)
之间的每个
[r]
的聚合计数。您是对的,在这个场景中,我试图映射图中的所有关系;这就是我面临的问题的核心用例。在未来,数据集将是整个数据集中较小的一部分,因此可能能够利用索引-但如果我无法将此查询达到可管理的性能水平,我将永远无法达到那个(希望更好)位置。给我大约一天的时间来整理一篇关于此主题的博客文章和示例项目。与此同时,您还可以开始构建和安装Neo4j非托管扩展。有些过时的博客文章,但最新版本的Neo4j的过程是相同的:您是在缓存完全加载的情况下还是从冷启动开始?如果您正在访问磁盘,这可以解释为什么它要慢得多,因为访问缓存将从RAM获取信息,而磁盘的速度可能要慢好几倍。