Запрос OrientDB для получения последней вершины до заданной даты - PullRequest
1 голос
/ 06 мая 2019

Допустим, у меня есть следующий список вершин (соединенных ребрами) в восточной базе данных:

 [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 Ответ

1 голос
/ 24 июня 2019

При создании запросов всегда старайтесь использовать имеющуюся информацию об отношениях в вашем запросе для повышения производительности. В этом случае вам не нужна сортировка (что является дорогостоящей операцией), потому что вы знаете , что нужная вам вершина имеет входящее ребро к вершине, вы можете просто использовать эту информацию в своем запросе.

Например, допустим, у меня есть следующая настройка:

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 вершин), потому что вы используете всю информацию, которую вы заранее знаете об отношениях = нужный вам узел имеет край к узлу Вы выбираете.

Надеюсь, это поможет вам.

...