2016-02-16 51 views
0

我与约束某个标签20m左右节点:暗号RANGE()函数不会产生正确的结果

// the id is a long 
CREATE CONSTRAINT ON (n:LABEL) ASSERT n.id IS UNIQUE; 

我试图有效地遍历所有节点的属性添加到所有其中,例如

MATCH (n:LABEL) SET n.prop = <prop_value> 

MHhere,查询优化提示#1) 我曾尝试使用RANGE关键字的利用约束指数的,但我没有得到任何结果,例如

说明
//yields the correct result, but scans the whole label, unusable in practice 
MATCH (n:LABEL) WHERE n.id >= 10 AND n.id <= 30 RETURN COUNT(*); 

//scans the index, but yields 0 ! 
MATCH (n:LABEL) WHERE n.id IN RANGE(10, 30) RETURN COUNT(*); 


// this works 
MATCH (n:LABEL) WHERE n.id = 1125985806188545 RETURN n; 
// these don't work 
MATCH (n:LABEL) WHERE n.id IN RANGE(1125985806188544, 1125985806188546) RETURN n; 
MATCH (n:LABEL) WHERE TOINT(n.id) IN RANGE(1125985806188544, 1125985806188546) RETURN n; 

新2.2.3社区,Ubuntu的64位

更新: 这的确是一个错误。在做了更多的测试之后,所有的2.2.x版本(最高2.2.8)都存在这个问题,而range()函数只使用了整数。 修正(RangeFunction应使用longs代替ints)仅为merged into 2.2.9 yesterday

+0

你确定'id'属性是一个整数吗? –

+0

不,这是很长的 – Nikos

+0

看看'WHERE TOINT(n.id)IN RANGE(10,30)'是否有效。 –

回答

0

您可以强制使用索引。这两个查询应该做到这一点(在2.3版本测试):

MATCH (n:LABEL) 
USING INDEX n:LABEL(id) 
WHERE n.id >= 1125985806188544 AND n.id <= 1125985806188546 
RETURN COUNT(*); 

MATCH (n:LABEL) 
USING INDEX n:LABEL(id) 
WHERE n.id IN RANGE(1125985806188544, 1125985806188546) 
RETURN COUNT(*); 

如果仍然有问题,你应该考虑更新Neo4j的版本,因为这可能会成为2.2.3版本的问题。

相关问题