我有一个大约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。我在这里不知道什么,我在哪里可以找到我不知道的?
谢谢,
克里斯
答案 0 :(得分:1)
您在第一个语句中点击数据库6,245,164
:MATCH (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)
的汇总计数。