我有大约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
答案 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的问题。