Получите одну запись, имея идентификаторы двух других

Я использую OrientDB, и у меня простая схема:

User -> (AccessWith) -> AccessToken -> (HasClient) -> Client

(имя) - ребра, а остальные - вершины.

У меня есть RID пользователя и клиента, и я хочу получить соответствующий AccessToken, как я могу это сделать?


Сейчас я делаю это:

select expand($token) 
   from #1:1 
   let $token = out('AccessWith') 
   where $token.out('HasClient').@rid = #2:1

(# 1: 1 - это RID пользователя, а # 2: 1 - RID клиента)

Но этот запрос не работает. Предложение where вообще не действует. Я могу удалить его или поставить несуществующий RID, в результате у меня всегда есть все AccessToken пользователя №1: 1.


Итак, я хотел бы точно понять, как использовать функцию out () (или in) в предложении where и преуспеть в фильтрации по RID пользователя (он отлично работает) и RID клиента в то же время.


person Jul13nT    schedule 10.08.2014    source источник


Ответы (1)


Попробуй это:

select from (
  select expand( out('AccessWith') ) from #1:1 
) where #2:1 in out('HasClient').@rid

Внутренний запрос возвращает все экземпляры AccessToken от пользователя, затем вы выполняете фильтрацию этого набора результатов. Именно там ГДЕ следует применять. Выделение и перемещение можно конвейеризовать один внутри другого.

Вы также можете сделать это:

select from AccessToken where #1:1 in in() and #2:1 in out()

Но запуск с узла обычно быстрее.

person Lvca    schedule 10.08.2014
comment
Спасибо @Lvca, к сожалению, ваш первый запрос все еще не работает (AccessToken не восстанавливается). Но мне удалось заставить его работать, заменив предложение where следующим образом: where # 2: 1 contains out ('HasClient'). Можете ли вы сказать, почему мне нужно использовать ключевое слово contains, чтобы это сделать? работает ? - person Jul13nT; 10.08.2014
comment
Я изменил свой ответ, потому что вы правы: out () возвращает коллекцию, поэтому вам следует использовать IN / CONTAINS. - person Lvca; 11.08.2014