Cypher RANGE()函数无法产生正确的结果

时间:2016-02-16 18:40:41

标签: neo4j cypher

我有大约20m的节点,带有一个带有约束的标签:

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

我正在尝试有效地迭代所有节点以向所有节点添加属性,例如

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

根据MH的说明 (here,查询调优提示#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;

Neo 2.2.3社区,Ubuntu 64位

更新 这确实是一个错误。在进行了更多测试后,所有2.2.x版本(最高2.2.8)都存在问题,并且range()函数仅使用整数。 修复(RangeFunction应该使用long而不是int)只是merged into 2.2.9 yesterday

1 个答案:

答案 0 :(得分: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的问题。