似乎第二个条件toFloat(na) / (na + nb) * 100 < 90 在第一个条件之前进行了测试。查看此执行计划中的Filter(1) 运算符:
+--------------+---------------+------+--------+--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Operator | EstimatedRows | Rows | DbHits | Identifiers | Other |
+--------------+---------------+------+--------+--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Projection | 1 | 3 | 0 | anon[111], anon[138], n, toFloat(n.a)/(n.a + n.b)* 100 | anon[111]; anon[138] |
| Top | 1 | 3 | 0 | anon[111], anon[138] | { AUTOINT6}; |
| Distinct | 0 | 3 | 24 | anon[111], anon[138] | anon[111], anon[138] |
| Filter(0) | 0 | 3 | 6 | anon[29], n, t | t.x == { AUTOSTRING0} |
| Expand(All) | 1 | 3 | 6 | anon[29], n, t | ( n@7)-[t:x]->() |
| Filter(1) | 1 | 3 | 34 | n | (Ors(List(n@7.a > { AUTOINT1}, Multiply(Divide(ToFloatFunction( n@7.a),Add( n@7.a, n@7.b)),{ AUTOINT3}) < { AUTOINT4})) AND Ors(List( n@7.a > { AUTOINT1}, n.b > { AUTOINT2}))) |
| AllNodesScan | 4 | 4 | 5 | n | |
+--------------+---------------+------+--------+--------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
您可以通过强制将过滤器分成两个子句来解决此问题。
MATCH (n)-[t:x { x:"1a" }]->()
WHERE n.a > 1 OR n.b > 1
WITH n
WHERE toFloat(n.a) / (n.a + n.b) * 100 < 90
RETURN DISTINCT n, toFloat(n.a) / (n.a + n.b) * 100
ORDER BY toFloat(n.a) / (n.a + n.b) * 100 DESC
LIMIT 10
我发现这种行为令人惊讶,但当我想到它时,我认为执行引擎以这种方式重新排列过滤器并没有错。可能会假设条件会在第一个声明的条件失败时提前放弃,但 Cypher 正是这样:声明性的。所以我们表达的是“what”,而不是“how”,而就“what”而言A and B相当于B and A。
这是查询和示例图,您可以检查它是否转换为您的实际数据:
http://console.neo4j.org/r/f6kxi5