Neo4j中的加权边缘查询非常慢

时间:2014-08-20 19:30:18

标签: neo4j

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

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。我能做些什么才能让它跑得更快?我考虑过使用启动声明,但这似乎没什么帮助。实际上,它似乎使情况变得更糟。

第3。我在这里不知道什么,我在哪里可以找到我不知道的?

谢谢,

克里斯

1 个答案:

答案 0 :(得分:1)

您在第一个语句中点击数据库6,245,164MATCH (n)-[r]->(x)

您尝试执行的操作似乎是图表全局查询 - 也就是说,您尝试在整个图表上运行查询。通过这样做,您不会利用减少数据库命中数量的索引。

为了在您需要的性能级别上执行此操作,可能需要非托管扩展。

http://docs.neo4j.org/chunked/stable/server-unmanaged-extensions.html

此外,还有一个很好的社区资源可以了解非托管扩展程序:http://www.maxdemarzi.com/

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

或者,您可以运行迭代Cypher查询,以更新[r](n)之间每个(x)的汇总计数。