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
此查询执行以下操作:
- Select 来自
T
的顶点,其中 t=2
- 从该顶点开始,遍历
link
类型的传入边
expand()
该边来自的顶点以获取其所有信息
结果正是你想要的:
这应该会提供更好的性能(特别是如果您在顶点的属性 t
上添加索引),因为您正在使用您预先知道的关于关系的所有信息 = 您需要的节点有一个边到节点 select.
希望对您有所帮助。
假设我在东方数据库中有以下顶点列表(由边连接):
[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
此查询执行以下操作:
- Select 来自
T
的顶点,其中t=2
- 从该顶点开始,遍历
link
类型的传入边
expand()
该边来自的顶点以获取其所有信息
结果正是你想要的:
这应该会提供更好的性能(特别是如果您在顶点的属性 t
上添加索引),因为您正在使用您预先知道的关于关系的所有信息 = 您需要的节点有一个边到节点 select.
希望对您有所帮助。