OrientDB 查询以接收给定日期之前的最后一个顶点

OrientDB query to receive last vertex before a given date

假设我在东方数据库中有以下顶点列表(由边连接):

 [t=1] --> [t=2] --> [t=3] --> [t=4] --> [t=5] --> [t=6] --> [t=7]

每个顶点都有一个时间戳t。我现在想在给定日期之前接收最后一个顶点。示例:给我 t=5 之前的最后一个顶点,即 t=4.

目前我正在使用以下查询来执行此操作:

 SELECT FROM ANYVERTEX WHERE t < 5 ORDER BY t DESC LIMIT 1

当有多达 1000 个元素时,这可以正常工作,但该查询的性能会随着列表中插入的元素数量的增加而下降。我已经尝试使用索引,这提高了整体性能,但性能随元素数量下降的问题仍然存在。

构建查询时,请始终尝试使用您掌握的有关查询关系的信息来提高性能。在这种情况下,您不需要排序(这是一项昂贵的操作),因为您 知道 您需要的顶点具有到该顶点的传入边,您可以简单地使用该信息您的查询。

例如,假设我有以下设置:

CREATE CLASS T EXTENDS V
CREATE VERTEX T SET t = 1
CREATE VERTEX T SET t = 2
CREATE VERTEX T SET t = 3
CREATE VERTEX T SET t = 4
CREATE VERTEX T SET t = 5

CREATE CLASS link EXTENDS E
CREATE EDGE link FROM (SELECT * FROM T WHERE t = 1) TO (SELECT * FROM T WHERE t = 2)
CREATE EDGE link FROM (SELECT * FROM T WHERE t = 2) TO (SELECT * FROM T WHERE t = 3)
CREATE EDGE link FROM (SELECT * FROM T WHERE t = 3) TO (SELECT * FROM T WHERE t = 4)
CREATE EDGE link FROM (SELECT * FROM T WHERE t = 4) TO (SELECT * FROM T WHERE t = 5)

然后我可以 select 任何 T 之前的顶点:

SELECT expand(in('link')) FROM T WHERE t = 2

此查询执行以下操作:

  1. Select 来自 T 的顶点,其中 t=2
  2. 从该顶点开始,遍历 link
  3. 类型的传入边
  4. expand() 该边来自的顶点以获取其所有信息

结果正是你想要的:

这应该会提供更好的性能(特别是如果您在顶点的属性 t 上添加索引),因为您正在使用您预先知道的关于关系的所有信息 = 您需要的节点有一个边到节点 select.

希望对您有所帮助。