Ориентировать SQL - фильтровать результирующий набор, используя WHERE
У меня есть немного семантического вопроса о запросах Orient SQL.
Возьмем, к примеру, этот очень простой график:
v(#12:1 User) --> e(#13:1 FriendOf) --> v(#12:2 User)
Другими словами, данный Пользователь с избавлением от #12:1 дружит с другим пользователем с избавлением от #12:2.
Чтобы получить друзей пользователя #12:1, можно выразить это в Orient SQL следующим образом:
SELECT EXPAND(both("FriendOf")) FROM #12:1
Этот запрос вернул бы список результатов, состоящий из пользователя с выпуском #12:2.
Допустим, я хочу отфильтровать этот список результатов по дополнительным критериям, например, сказать числовое значение ("возраст"):
SELECT EXPAND(both("FriendOf")) FROM #12:1 WHERE age >= 10
Приведенный выше запрос отфильтровывает вершину CURRENT (#12:1), а НЕ набор результатов. Что имеет смысл, но есть ли способ применить фильтр к результату EXPAND(оба ("FriendOf")), а не к текущей вершине? Я знаю, что могу сделать это с Гремлином так:
SELECT EXPAND(gremlin('current.both("FriendOf").has("age",T.gte,10)')) FROM #12:1
Но вышеупомянутое, кажется, не использует индексы (по крайней мере, когда я прошу это объяснить). Для очень больших наборов данных это проблематично.
Так есть ли правильный способ применить оператор WHERE к результирующему набору данных?
Спасибо!
1 ответ
... есть ли способ применить фильтр к результату EXPAND(оба ("FriendOf")) вместо текущей вершины?
Простой ответ - встроить ваш базовый "SELECT EXPAND ..." в другой SELECT, т.е.
SELECT FROM (SELECT EXPAND(both("FriendOf")) FROM #12:1) WHERE age >= 10
Кстати, на моем Mac вышеприведенное заняло 0,005 с по сравнению с более чем 2 с для версии Gremlin. Там где-то должна быть мораль:-)