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

时间:2019-05-06 11:40:46

标签: orientdb

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

 [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个元素时,这很好用,但是该查询的性能随列表中插入的元素数量而下降。我已经尝试过使用索引来改善整体性能,但是问题是,随着元素数量的增加,性能下降仍然存在。

1 个答案:

答案 0 :(得分:1)

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

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

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)

然后我可以这样选择任何T之前的顶点:

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

此查询执行以下操作:

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

结果正是您想要的:

OrientDB example

这应该提供更好的性能(尤其是如果在顶点的属性t上添加索引),因为您正在使用事先了解的有关关系的所有信息=需要的节点具有优势您选择的节点。

希望对您有帮助。