在neo4j中检索时如何避免最近更新的节点?

时间:2017-01-20 13:39:04

标签: performance sorting neo4j

这可能是一个与数据库核心功能相关的奇怪问题,但由于存在性能问题,我对此感到困惑。

考虑以下情况:

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

有没有其他方法可以实现它或者我错过了什么?

3 个答案:

答案 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()