Ориентировать 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. Там где-то должна быть мораль:-)

Другие вопросы по тегам