【发布时间】:2017-08-08 07:18:40
【问题描述】:
我试图用以下两个查询来测试这个以模拟 Neo4j (v3.1) 中的分区:
Q1: MATCH (a:USER { UID:362})-[:FRIEND]->(b) WHERE b.PARTITION=1 RETURN COUNT(b)
Q2: MATCH (a:USER { UID:362})-[:FRIEND]->(b) WHERE b:P1 RETURN COUNT(b)
我希望(也讨论过here)Q2 会更快,因为它只会检索P1 标签,而Q1 需要在过滤之前检索所有节点。事实证明,Q1 的速度要快得多,当我更改查询以遍历更深的 [:FRIEND*1..5] 时,这一点变得更加明显。
编辑:UID 上有索引,PARTITION 上没有索引。
使用嵌入式 Neo4j 的查询计划如下(由于某种原因不显示 DBhits)。
Q1
+-------------------+----------------+------------------+-----------------------------+
| Operator | Estimated Rows | Variables | Other |
+-------------------+----------------+------------------+-----------------------------+
| +ProduceResults | 191 | COUNT(b) | COUNT(b) |
| | +----------------+------------------+-----------------------------+
| +EagerAggregation | 191 | COUNT(b) | |
| | +----------------+------------------+-----------------------------+
| +Filter | 36341 | anon[33], a, b | b.PARTITION == { AUTOINT1} |
| | +----------------+------------------+-----------------------------+
| +Expand(All) | 363412 | anon[33], b -- a | (a)-[:FRIEND]->(b) |
| | +----------------+------------------+-----------------------------+
| +Filter | 105719 | a | a.UID == { AUTOINT0} |
| | +----------------+------------------+-----------------------------+
| +NodeByLabelScan | 1057194 | a | :USER |
+-------------------+----------------+------------------+-----------------------------+
Total database accesses: ?
Q2
+-------------------+----------------+------------------+----------------------------------+
| Operator | Estimated Rows | Variables | Other |
+-------------------+----------------+------------------+----------------------------------+
| +ProduceResults | 214 | COUNT(b) | COUNT(b) |
| | +----------------+------------------+----------------------------------+
| +EagerAggregation | 214 | COUNT(b) | |
| | +----------------+------------------+----------------------------------+
| +Filter | 45909 | anon[33], a, b | a:USER AND a.UID == { AUTOINT0} |
| | +----------------+------------------+----------------------------------+
| +Expand(All) | 459085 | anon[33], a -- b | (b)<-[:FRIEND]-(a) |
| | +----------------+------------------+----------------------------------+
| +NodeByLabelScan | 134181 | b | :P1 |
+-------------------+----------------+------------------+----------------------------------+
Total database accesses: ?
对这背后的原因有什么想法吗?
【问题讨论】:
标签: java neo4j cypher profiling