这可能是一个与数据库核心功能相关的奇怪问题,但由于存在性能问题,我对此感到困惑。
考虑以下情况:
PROFILE
MATCH (n:Label1)
WHERE n.prop1<1484850600
OR (n.prop1=1484850600 AND n.prop2<2)
WITH n
LIMIT 10
RETURN n
情况就像我在执行上述查询后更新prop1和prop2 (如果n.prop1&lt; 1484850600则[prop1 = 1484850600,prop2 = 1]且n.prop1 = 1484850600 AND n.prop2 <2则[prop2 = prop2 + 1])
但是当我再次执行上述查询时,我会首先得到(prop1 = 1484850600)的记录,这对我来说并不是必需的(我需要其他未更新的节点)。
我可以通过排序id(这是该节点的自动递增值)来实现它,但是因为我有巨大的数据集(节点的1cr,1cr属性值的排序),cypher查询正在生成,它是花费比平时更多的时间,所以我坚持到这里。
PROFILE
MATCH (n:Label1)
WHERE n.prop1<1484850600
OR (n.prop1=1484850600 AND n.prop2<2)
WITH n
ORDER BY n.id
LIMIT 10
RETURN n
有没有其他方法可以实现它或者我错过了什么?
答案 0 :(得分:1)
将查询拆分为两个。处理具有prop1 = 1484850600和prop2
答案 1 :(得分:0)
我认为你需要一个存储标志has been updated
的属性。像这样:
MATCH (n:Label1)
WHERE n.hasUpdated = FALSE AND
(n.prop1<1484850600 OR (n.prop1=1484850600 AND n.prop2<2))
WITH n LIMIT 10
SET n.hasUpdated=TRUE,
n.prop1=1484850600,
n.prop2=n.prop2+1
RETURN n
答案 2 :(得分:0)
stdob的一个变种 - 想法,也许你可以在这里使用另一个标签。
您可以运行单独的查询,将:未处理的标签添加到要处理的所有节点,包括检查:处理的节点上匹配的未处理标签,并在处理时删除标签。
您可以使用反向方法,在没有任何新标签的情况下启动,匹配节点没有:已处理标签的位置,并在处理节点时设置:已处理标签。
使用APOC程序批处理您的处理也很有用。请参阅apoc.periodic.iterate()和apoc.periodic.commit()。