我正在尝试使用以下 Cypher Query 计算 Neo4j 中无向图的传递闭包(“E”是图的每条边都具有的标签):
MATCH (a) -[:E*]- (b) WHERE ID(a) < ID(b) RETURN DISTINCT a, b
我试图在一个有 10k 节点和大约 150k 边的图上执行这个查询,但即使在 8 小时后它也没有完成。我觉得这很令人惊讶,因为即使是最简单的 SQL 解决方案也快得多,而且我预计 Neo4j 对这类标准图形查询的效率会更高。那么我是否缺少一些东西,也许是对 Neo4j 服务器的一些调整或编写查询的更好方法?
编辑
以下是EXPLAIN
上述查询的结果:
+--------------------------------------------+
| No data returned, and nothing was changed. |
+--------------------------------------------+
908 ms
Compiler CYPHER 3.3
Planner COST
Runtime INTERPRETED
+-----------------------+----------------+------------------+--------------------------------+
| Operator | Estimated Rows | Variables | Other |
+-----------------------+----------------+------------------+--------------------------------+
| +ProduceResults | 14069 | a, b | |
| | +----------------+------------------+--------------------------------+
| +Distinct | 14069 | a, b | a, b |
| | +----------------+------------------+--------------------------------+
| +Filter | 14809 | anon[11], a, b | ID(a) < ID(b) |
| | +----------------+------------------+--------------------------------+
| +VarLengthExpand(All) | 49364 | anon[11], b -- a | (a)-[:E*]-(b) |
| | +----------------+------------------+--------------------------------+
| +AllNodesScan | 40012 | a | |
+-----------------------+----------------+------------------+--------------------------------+
Total database accesses: ?